We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent e35314e commit 264f99bCopy full SHA for 264f99b
src/geometry/geometry.py
@@ -138,15 +138,20 @@ def cross(u, v):
138
# Point : (x, y)
139
# returns true if intersecting s1 & s2 shares at least 1 point.
140
def is_segment_intersection(s1, s2):
141
- u = vec(*s1)
142
- v = vec(*s2)
143
p1, p2 = s1
144
q1, q2 = s2
+ u = vec(p1, p2)
+ v = vec(q1, q2)
145
d1 = cross(u, vec(p1, q1))
146
d2 = cross(u, vec(p1, q2))
147
d3 = cross(v, vec(q1, p1))
148
d4 = cross(v, vec(q1, p2))
149
+ # at least one point is on other segment's line
150
if d1 * d2 * d3 * d4 == 0:
- p1, p2 = min(p1, p2), max(p1, p2)
151
- return p1 <= q1 <= p2 or p1 <= q2 <= p2
+ items = [(d1, q1, s1), (d2, q2, s1), (d3, p1, s2), (d4, p2, s2)]
152
+ for dv, p, seg in items:
153
+ if dv == 0:
154
+ s, t = min(seg), max(seg)
155
+ if s <= p <= t: return True
156
+ return False
157
return sign(d1) != sign(d2) and sign(d3) != sign(d4)
src/geometry/test_geometry.py
@@ -1,5 +1,8 @@
1
import unittest
2
-from . import geometry
+try:
3
+ from . import geometry
4
+except ImportError:
5
+ import geometry
6
7
class GeometryTest(unittest.TestCase):
8
def test_line_intersect(self):
@@ -10,10 +13,12 @@ def test_line_intersect(self):
10
13
(((0,0),(3,3)), ((3,0), (0,3)), True), # orthogonal regular
11
14
(((0,0),(3,3)), ((6,0), (0,6)), True), # orthogonal touch
12
15
(((0,0),(3,3)), ((7,0), (0,7)), False), # orthogonal outside
16
+ (((0,1),(1,10)), ((1,1), (2,1)), False), # one point on same line outside segment
17
+ (((1,10),(0,1)), ((1,1), (2,1)), False), # one point on same line outside segment
18
]
19
for s1, s2, res in segment_tests:
- self.assertEqual(geometry.is_segment_intersection(s1, s2), res)
20
+ self.assertEqual(geometry.is_segment_intersection(s1, s2), res, f'{s1} {s2} should give {res}')
21
22
23
if __name__ == '__main__':
- unittest.main()
24
+ unittest.main()
0 commit comments