def test_triangle_obtuse(self): point1 = Vector2D(0, 0) point2 = Vector2D(5, 0) point3 = Vector2D(4, 4) self.assertEqual(None, get_vertex_with_obtuse_angle(point1, point2, point3)); point4 = Vector2D(4, 1) obtuse_point1 = get_vertex_with_obtuse_angle(point1, point2, point4) obtuse_point2 = get_vertex_with_obtuse_angle(point1, point4, point2) obtuse_point3 = get_vertex_with_obtuse_angle(point4, point2, point1) obtuse_point4 = get_vertex_with_obtuse_angle(point4, point1, point2) self.assertEqual(point4, obtuse_point1); self.assertEqual(point4, obtuse_point2); self.assertEqual(point4, obtuse_point3); self.assertEqual(point4, obtuse_point4);
def find_smallest_circle_sqtime(a_list_of_points): gravity_centre = find_gravity_centre(a_list_of_points) smallest_circle = MyCircle(gravity_centre, .1) farther_point = max(a_list_of_points, key=lambda p: smallest_circle.centre.sub(p).norm()) smallest_circle.radius = smallest_circle.centre.sub(farther_point).norm() anchor_radius = 0.0 anchor_point = farther_point for p in a_list_of_points: if p is not farther_point: circle = reduced_circle_new(farther_point, p, Line2D(smallest_circle.centre, farther_point)) if anchor_radius < circle.radius: anchor_radius = circle.radius anchor_point = p smallest_circle = circle # the pair of pivot points found: a = farther_point b = anchor_point in_progress = True while in_progress: in_progress = False two_points_based_centre = a.sum(b).multiply(0.5) two_points_based_radius = 0.5 * a.sub(b).norm() two_points_based_circle = MyCircle(two_points_based_centre, two_points_based_radius) if all(two_points_based_circle.is_point_inside(p) for p in a_list_of_points): smallest_circle = two_points_based_circle pivot_points = [a, b] else: final_radius = two_points_based_radius final_point = None final_centre = smallest_circle.centre for p in a_list_of_points: if p is not a and p is not b: obtuse_point = get_vertex_with_obtuse_angle(a, b, p) if obtuse_point is p: continue line_ab = Line2D(a, b) mid = line_ab.middle_point() line_along = Line2D(mid, mid.sum(line_ab.orthogonal_vector())) circle = reduced_circle_new(a, p, line_along) if final_radius < circle.radius < smallest_circle.radius: final_radius = circle.radius final_centre = circle.centre final_point = p # assert isinstance(final_point, Point2D) obtuse_point = get_vertex_with_obtuse_angle(a, b, final_point) if obtuse_point is not None: assert final_point is not obtuse_point, 'final is obtuse!' in_progress = True if obtuse_point is a: a = final_point else: b = final_point else: smallest_circle.centre = final_centre smallest_circle.radius = final_radius # assert final_point is not a and not b if final_point is not None: pivot_points = [a, b, final_point] else: pivot_points = [a, b] assert isinstance(pivot_points, list) return smallest_circle, pivot_points