Skip to content

Commit 264f99b

Browse files
committed
fix is_segment_intersection
1 parent e35314e commit 264f99b

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

src/geometry/geometry.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,20 @@ def cross(u, v):
138138
# Point : (x, y)
139139
# returns true if intersecting s1 & s2 shares at least 1 point.
140140
def is_segment_intersection(s1, s2):
141-
u = vec(*s1)
142-
v = vec(*s2)
143141
p1, p2 = s1
144142
q1, q2 = s2
143+
u = vec(p1, p2)
144+
v = vec(q1, q2)
145145
d1 = cross(u, vec(p1, q1))
146146
d2 = cross(u, vec(p1, q2))
147147
d3 = cross(v, vec(q1, p1))
148148
d4 = cross(v, vec(q1, p2))
149+
# at least one point is on other segment's line
149150
if d1 * d2 * d3 * d4 == 0:
150-
p1, p2 = min(p1, p2), max(p1, p2)
151-
return p1 <= q1 <= p2 or p1 <= q2 <= p2
151+
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
152157
return sign(d1) != sign(d2) and sign(d3) != sign(d4)

src/geometry/test_geometry.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import unittest
2-
from . import geometry
2+
try:
3+
from . import geometry
4+
except ImportError:
5+
import geometry
36

47
class GeometryTest(unittest.TestCase):
58
def test_line_intersect(self):
@@ -10,10 +13,12 @@ def test_line_intersect(self):
1013
(((0,0),(3,3)), ((3,0), (0,3)), True), # orthogonal regular
1114
(((0,0),(3,3)), ((6,0), (0,6)), True), # orthogonal touch
1215
(((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
1318
]
1419
for s1, s2, res in segment_tests:
15-
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}')
1621

1722

1823
if __name__ == '__main__':
19-
unittest.main()
24+
unittest.main()

0 commit comments

Comments
 (0)