-
-
Notifications
You must be signed in to change notification settings - Fork 7.3k
/
line_segment_intersection.cpp
104 lines (90 loc) · 3.46 KB
/
line_segment_intersection.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
* @file
* @brief check whether two line segments intersect each other
* or not.
*/
#include <algorithm>
#include <iostream>
/**
* Define a Point.
*/
struct Point {
int x; /// Point respect to x coordinate
int y; /// Point respect to y coordinate
};
/**
* intersect returns true if segments of two line intersects and
* false if they do not. It calls the subroutines direction
* which computes the orientation.
*/
struct SegmentIntersection {
inline bool intersect(Point first_point, Point second_point,
Point third_point, Point forth_point) {
int direction1 = direction(third_point, forth_point, first_point);
int direction2 = direction(third_point, forth_point, second_point);
int direction3 = direction(first_point, second_point, third_point);
int direction4 = direction(first_point, second_point, forth_point);
if ((direction1 < 0 || direction2 > 0) &&
(direction3 < 0 || direction4 > 0))
return true;
else if (direction1 == 0 &&
on_segment(third_point, forth_point, first_point))
return true;
else if (direction2 == 0 &&
on_segment(third_point, forth_point, second_point))
return true;
else if (direction3 == 0 &&
on_segment(first_point, second_point, third_point))
return true;
else if (direction3 == 0 &&
on_segment(first_point, second_point, forth_point))
return true;
else
return false;
}
/**
* We will find direction of line here respect to @first_point.
* Here @second_point and @third_point is first and second points
* of the line respectively. we want a method to determine which way a
* given angle these three points turns. If returned number is negative,
* then the angle is counter-clockwise. That means the line is going to
* right to left. We will fount angle as clockwise if the method returns
* positive number.
*/
inline int direction(Point first_point, Point second_point,
Point third_point) {
return ((third_point.x - first_point.x) *
(second_point.y - first_point.y)) -
((second_point.x - first_point.x) *
(third_point.y - first_point.y));
}
/**
* This method determines whether a point known to be colinear
* with a segment lies on that segment.
*/
inline bool on_segment(Point first_point, Point second_point,
Point third_point) {
if (std::min(first_point.x, second_point.x) <= third_point.x &&
third_point.x <= std::max(first_point.x, second_point.x) &&
std::min(first_point.y, second_point.y) <= third_point.y &&
third_point.y <= std::max(first_point.y, second_point.y))
return true;
else
return false;
}
};
/**
* This is the main function to test whether the algorithm is
* working well.
*/
int main() {
SegmentIntersection segment;
Point first_point, second_point, third_point, forth_point;
std::cin >> first_point.x >> first_point.y;
std::cin >> second_point.x >> second_point.y;
std::cin >> third_point.x >> third_point.y;
std::cin >> forth_point.x >> forth_point.y;
printf("%d", segment.intersect(first_point, second_point, third_point,
forth_point));
std::cout << std::endl;
}