class Triangulation(object): """docstring for Triangulation""" def __init__(self): initial_distance = 10000 m = 0 p1 = Point(-initial_distance + m, -initial_distance + m) p2 = Point(initial_distance + m, -initial_distance + m) p3 = Point(0 + m, initial_distance + m) line1 = Line(p1, p2) line2 = Line(p2, p3) line3 = Line(p3, p1) self.triangle = Triangle(line1, line2, line3) line1.set_triangles(self.triangle, 1) line2.set_triangles(self.triangle, 1) line3.set_triangles(self.triangle, 1) self.points = [p1, p2, p3] self.out_points = [p1, p2, p3] self.triangles = [self.triangle] self.search_data_structure = self.triangle # DS() def draw(self, canvas): triangles = self.triangle.find_last_layer_triangles({}) self.draw_triangles(list(set(triangles)), canvas) self.draw_points(canvas) def draw_triangles(self, triangles, canvas): for triangle in triangles: flag = False for i in range(1, 4): for j in range(1, 3): if getattr(getattr(triangle, "line{}".format(i)), "point{}".format(j)) in self.out_points: flag = True break if not flag: triangle.draw(canvas) def draw_points(self, canvas): for point in self.points: point.draw(canvas) def add_point(self, point, canvas): self.points.append(point) tri = self.triangle.search(point) self.add_edges(tri, point) Triangle.validity_check(point, tri.line1) Triangle.validity_check(point, tri.line2) Triangle.validity_check(point, tri.line3) def add_triangle(self, triangle): self.triangles.append(triangle) def remove_triangle(self, triangle): self.triangles.remove(self.triangles.find(triangle)) def add_edges(self, triangle, point): def index_of_other_triangle_in_its_side_edges(line, triangle): if line.triangle1 == triangle : return 1 return 2 l1, l2, l3 = triangle.sort_lines() line1 = Line(l1.point1, point) line2 = Line(l2.point1, point) line3 = Line(l3.point1, point) tri1 = Triangle(triangle.line1, line1, line2) tri2 = Triangle(triangle.line2, line3, line2) tri3 = Triangle(triangle.line3, line1, line3) line1.set_triangles(tri1, 1) line1.set_triangles(tri3, 2) line2.set_triangles(tri1, 1) line2.set_triangles(tri2, 2) line3.set_triangles(tri3, 1) line3.set_triangles(tri2, 2) triangle.line1.set_triangles(tri1, index_of_other_triangle_in_its_side_edges(triangle.line1, triangle)) triangle.line2.set_triangles(tri2, index_of_other_triangle_in_its_side_edges(triangle.line2, triangle)) triangle.line3.set_triangles(tri3, index_of_other_triangle_in_its_side_edges(triangle.line3, triangle)) triangle.triangles += [tri1, tri2, tri3] point.neighbours += [l1.point1, l2.point1, l3.point1] l1.point1.neighbours.append(point) l2.point1.neighbours.append(point) l3.point1.neighbours.append(point) def print_points(self): for item in self.points: print(item.x, item.y)