Skip to content

Commit 1e27bc4

Browse files
committed
Axis-Aligned Line Tests
* pygorithm/geometry/axisall.py - Minor documentation tweaks * tests/test_geometry.py - add tests for axis aligned line
1 parent fcecfd3 commit 1e27bc4

File tree

2 files changed

+133
-6
lines changed

2 files changed

+133
-6
lines changed

pygorithm/geometry/axisall.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def intersects(line1, line2):
6767
6868
Determine if the two lines are touching and if they are, if
6969
they are overlapping. Lines are touching if they share only
70-
one end point, whereas they are overlapping if they share
70+
one end point, whereas they are overlapping if they share
7171
infinitely many points.
7272
7373
.. note::
@@ -91,11 +91,12 @@ def find_intersection(line1, line2):
9191
"""
9292
Calculate the MTV between line1 and line2 to move line1
9393
94-
Determine if the two lines are touching, and then returns the
95-
minimum translation vector to move line 1 along axis. If the result
96-
is negative, it means line 1 should be moved in the opposite direction
97-
of the axis by the magnitude of the result.
98-
94+
Determine if the two lines are touching and/or overlapping and then
95+
returns the minimum translation vector to move line 1 along axis. If the
96+
result is negative, it means line 1 should be moved in the opposite
97+
direction of the axis by the magnitude of the result.
98+
99+
99100
Returns `true, None` if the lines are touching.
100101
101102
.. note::

tests/test_geometry.py

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,132 @@ def test_find_intersection_parallel_overlap_compeletely(self):
400400
False, True, line2.Line2(vector2.Vector2(3, 4), vector2.Vector2(5, 6)))
401401

402402

403+
class TestAxisAlignedLine(unittest.TestCase):
404+
def setUp(self):
405+
self.vec_1_1 = vector2.Vector2(1, 1)
406+
407+
def test_constructor(self):
408+
_aal = axisall.AxisAlignedLine(self.vec_1_1, 0, 1)
409+
410+
self.assertIsNotNone(_aal.axis)
411+
self.assertIsNotNone(_aal.min)
412+
self.assertIsNotNone(_aal.max)
413+
414+
self.assertEqual(1, _aal.axis.start.x)
415+
self.assertEqual(1, _aal.axis.start.y)
416+
self.assertEqual(0, _aal.min)
417+
self.assertEqual(1, _aal.max)
418+
419+
_aal2 = axisall.AxisAlignedLine(self.vec_1_1, 1, 0)
420+
421+
self.assertEqual(0, _aal.min)
422+
self.assertEqual(1, _aal.max)
423+
424+
def test_intersects_false(self):
425+
_aal1 = axisall.AxisAlignedLine(self.vec_1_1, 0, 1)
426+
_aal2 = axisall.AxisAlignedLine(self.vec_1_1, 2, 3)
427+
428+
touching, overlapping = axisall.AxisAlignedLine.intersects(_aal1, _aal2)
429+
self.assertFalse(touching)
430+
self.assertFalse(overlapping)
431+
432+
touching, overlapping = axisall.AxisAlignedLine.intersects(_aal2, _aal1)
433+
self.assertFalse(touching)
434+
self.assertFalse(overlapping)
435+
436+
def test_intersects_touching(self):
437+
_aal1 = axisall.AxisAlignedLine(self.vec_1_1, 0, 1)
438+
_aal2 = axisall.AxisAlignedLine(self.vec_1_1, 1, 2)
439+
440+
touching, overlapping = axisall.AxisAlignedLine.intersects(_aal1, _aal2)
441+
self.assertTrue(touching)
442+
self.assertFalse(overlapping)
443+
444+
touching, overlapping = axisall.AxisAlignedLine.intersects(_aal2, _aal1)
445+
self.assertTrue(touching)
446+
self.assertFalse(overlapping)
447+
448+
def test_intersects_overlapping(self):
449+
_aal1 = axisall.AxisAlignedLine(self.vec_1_1, -1, -3)
450+
_aal2 = axisall.AxisAlignedLine(self.vec_1_1, -2, 5)
451+
452+
touching, overlapping = axisall.AxisAlignedLine.intersects(_aal1, _aal2)
453+
self.assertFalse(touching)
454+
self.assertTrue(overlapping)
455+
456+
touching, overlapping = axisall.AxisAlignedLine.intersects(_aal2, _aal1)
457+
self.assertFalse(touching)
458+
self.assertTrue(overlapping)
459+
460+
461+
def test_find_intersection_false(self):
462+
_aal1 = axisall.AxisAlignedLine(self.vec_1_1, 0, 1)
463+
_aal2 = axisall.AxisAlignedLine(self.vec_1_1, 2, 3)
464+
465+
touching, mtv = axisall.AxisAlignedLine.find_intersection(_aal1, _aal2)
466+
self.assertFalse(touching)
467+
self.assertIsNone(mtv)
468+
469+
touching, mtv = axisall.AxisAlignedLine.find_intersection(_aal2, _aal1)
470+
self.assertFalse(touching)
471+
self.assertIsNone(mtv)
472+
473+
def test_find_intersection_touching(self):
474+
_aal1 = axisall.AxisAlignedLine(self.vec_1_1, 0, 1)
475+
_aal2 = axisall.AxisAlignedLine(self.vec_1_1, 1, 2)
476+
477+
touching, mtv = axisall.AxisAlignedLine.find_intersection(_aal1, _aal2)
478+
self.assertTrue(touching)
479+
self.assertIsNone(mtv)
480+
481+
touching, mtv = axisall.AxisAlignedLine.find_intersection(_aal2, _aal1)
482+
self.assertTrue(touching)
483+
self.assertIsNone(mtv)
484+
485+
def test_find_intersection_overlapping(self):
486+
_aal1 = axisall.AxisAlignedLine(self.vec_1_1, -3, -1)
487+
_aal2 = axisall.AxisAlignedLine(self.vec_1_1, -2, 5)
488+
489+
touching, mtv = axisall.AxisAlignedLine.find_intersection(_aal1, _aal2)
490+
self.assertFalse(touching)
491+
self.assertEquals(-1, mtv)
492+
493+
touching, mtv = axisall.AxisAlignedLine.find_intersection(_aal2, _aal1)
494+
self.assertFalse(touching)
495+
self.assertEquals(1, mtv)
496+
497+
def test_contains_point_false(self):
498+
_aal1 = axisall.AxisAlignedLine(self.vec_1_1, 0, 1)
499+
500+
outer, inner = axisall.AxisAlignedLine.contains_point(_aal1, -1)
501+
self.assertFalse(outer)
502+
self.assertFalse(inner)
503+
504+
outer, inner = axisall.AxisAlignedLine.contains_point(_aal1, 1.5)
505+
self.assertFalse(outer)
506+
self.assertFalse(inner)
507+
508+
def test_contains_point_outer(self):
509+
_aal1 = axisall.AxisAlignedLine(self.vec_1_1, 0, 1)
510+
511+
outer, inner = axisall.AxisAlignedLine.contains_point(_aal1, 0)
512+
self.assertTrue(outer)
513+
self.assertFalse(inner)
514+
515+
outer, inner = axisall.AxisAlignedLine.contains_point(_aal1, 1)
516+
self.assertTrue(outer)
517+
self.assertFalse(inner)
518+
519+
def test_contains_point_inner(self):
520+
_aal1 = axisall.AxisAlignedLine(self.vec_1_1, 0, 1)
521+
522+
outer, inner = axisall.AxisAlignedLine.contains_point(_aal1, 0.25)
523+
self.assertFalse(outer)
524+
self.assertTrue(inner)
525+
526+
outer, inner = axisall.AxisAlignedLine.contains_point(_aal1, 0.75)
527+
self.assertFalse(outer)
528+
self.assertTrue(inner)
403529

404530

405531
if __name__ == '__main__':

0 commit comments

Comments
 (0)