def intersects_at(self, other) -> Point: if self.slope == other.slope: raise LinesParallelError elif is_infinity(self.slope): x = self.point.x y = other.get_y(x) elif is_infinity(other.slope): x = other.point.x y = self.get_y(x) else: x = (other.y_intercept - self.y_intercept) / (self.slope - other.slope) y = (self.slope * x) + self.y_intercept return Point(x, y)
def point_2d(self): return Point(self.x, self.y)
def test_intersects(self): segment_1 = LineSegment(Point(0, 0), Point(5, 5)) segment_2 = LineSegment(Point(0, 2), Point(5, 2)) segment_3 = LineSegment(Point(1, 0), Point(1, 5)) segment_4 = LineSegment(Point(6, 6), Point(8, 8)) segment_5 = LineSegment(Point(0, 1), Point(5, 6)) segment_6 = LineSegment(Point(0, 2), Point(3, 0)) self.assertTrue(segment_1.intersects(segment_2)) self.assertTrue(segment_1.intersects(segment_3)) self.assertTrue(segment_2.intersects(segment_3)) self.assertFalse(segment_1.intersects(segment_4)) self.assertFalse(segment_1.intersects(segment_5)) self.assertFalse(segment_1.intersects(segment_6)) segment_7 = LineSegment(Point(3, 6), Point(3, 0)) segment_8 = LineSegment(Point(2, 4), Point(6, 4)) self.assertTrue(segment_7.intersects(segment_8)) segment_9 = LineSegment(Point(0, 6), Point(3, 6)) segment_10 = LineSegment(Point(1, 2), Point(1, 1)) self.assertFalse(segment_9.intersects(segment_10))
def test_overlaps(self): segment_1 = LineSegment(Point(0, 0), Point(5, 5)) segment_2 = LineSegment(Point(0, 2), Point(5, 2)) segment_3 = LineSegment(Point(1, 0), Point(1, 5)) segment_4 = LineSegment(Point(1, 1), Point(2, 2)) segment_5 = LineSegment(Point(-1, -1), Point(-3, -3)) segment_6 = LineSegment(Point(0, 1), Point(5, 6)) self.assertFalse(segment_1.overlaps(segment_2)) self.assertFalse(segment_1.overlaps(segment_3)) self.assertFalse(segment_2.overlaps(segment_3)) self.assertTrue(segment_1.overlaps(segment_4)) self.assertFalse(segment_1.overlaps(segment_5)) self.assertFalse(segment_1.overlaps(segment_6))
def test_distance_to(self): point_1 = Point(0, 0) point_2 = Point(3, 4) self.assertEqual(point_1.distance_to(point_2), 5.0)
def test_contains(self): segment = LineSegment(Point(0, 0), Point(5, 5)) self.assertTrue(segment.contains(Point(2, 2))) self.assertTrue(segment.contains(Point(1, 1))) self.assertFalse(segment.contains(Point(6, 6))) self.assertFalse(segment.contains(Point(3, 2)))
def test_closest_position_to_point(self): line_1 = Line(Point(0, 0), Point(5, 5)) self.assertEqual(line_1.closest_position_to_point(Point(0, 5)), Point(2.5, 2.5)) self.assertEqual(line_1.closest_position_to_point(Point(5, 5)), Point(5, 5))
def test_distance_to(self): rectangle = Rectangle(0, 3, 0, 3) self.assertEqual(rectangle.distance_to(Point(1, 5)), 2) self.assertEqual(rectangle.distance_to(Point(4, 2)), 1) self.assertEqual(rectangle.distance_to(Point(1, 2)), 0)
def test_contains(self): rectangle = Rectangle(-1, 1, -1, 1) self.assertTrue(rectangle.contains(Point(0, 0))) self.assertFalse(rectangle.contains(Point(10, 0)))
def test_equal(self): point_1 = Point(0, 0) point_2 = Point(0, 0) point_3 = Point(3, 4) self.assertTrue(point_1 == point_2) self.assertFalse(point_1 == point_3)
def test_closest_point_to(self): segment_1 = LineSegment(Point(0, 0), Point(5, 5)) self.assertEqual(segment_1.closest_point_to(Point(1, 1)), Point(1, 1)) self.assertEqual(segment_1.closest_point_to(Point(0, 5)), Point(2.5, 2.5)) self.assertEqual(segment_1.closest_point_to(Point(6, 6)), Point(5, 5)) self.assertEqual(segment_1.closest_point_to(Point(-1, -6)), Point(0, 0)) segment_2 = LineSegment(Point(0, 0), Point(5, 0)) self.assertEqual(segment_2.closest_point_to(Point(-1, 0)), Point(0, 0)) self.assertEqual(segment_2.closest_point_to(Point(-1, 60)), Point(0, 0)) self.assertEqual(segment_2.closest_point_to(Point(3, 60)), Point(3, 0)) self.assertEqual(segment_2.closest_point_to(Point(33, -60)), Point(5, 0)) segment_3 = LineSegment(Point(0, 0), Point(0, 5)) self.assertEqual(segment_3.closest_point_to(Point(3, 3)), Point(0, 3)) self.assertEqual(segment_3.closest_point_to(Point(30, 30)), Point(0, 5)) self.assertEqual(segment_3.closest_point_to(Point(0, 2)), Point(0, 2))
def test_contains(self): self.assertTrue(self.kd.contains(Point(4, 7))) self.assertFalse(self.kd.contains(Point(5, 7)))
def orientation(self, p): return Point.orientation(self.tail, self.head, p)