def dist_to(self, p: Point) -> float: dotA = (p.x - self.a.x) * (self.b.x - self.a.x) + (p.y - self.a.y) * (self.b.y - self.a.y) if dotA <= 0: return self.a.get_distance(p) dotB = (p.x - self.b.x) * (self.a.x - self.b.x) + (p.y - self.b.y) * (self.a.y - self.b.y) if dotB <= 0: return self.b.get_distance(p) closest_point = self.a + ((self.b - self.a) * dotA) / (dotA + dotB) return p.distance_to(closest_point)
def test_distance_same_value_point(self): p = Point(1.0, 0.0) self.assertEqual(p.distance_to(Point(1.0, 0.0)), 0.0)
def test_distance_conmutative(self): p1 = Point(1.0, 1.0) p2 = Point(-1.0, -1.0) self.assertEqual(p1.distance_to(p2), p2.distance_to(p1))
def test_distance_same_x(self): p = Point(0.0, 1.0) self.assertEqual(p.distance_to(Point(0.0, -1.0)), 2.0)
def test_distance_same_y(self): p = Point(1.0, 0.0) self.assertEqual(p.distance_to(Point(-1.0, 0.0)), 2.0)