def test_brute_force_middle_limit(): sites = MathUtilities.generate_points(number = 4) plt.figure() plt.axis('equal') plt.scatter([point.x for point in sites], [point.y for point in sites]) brute_force_middle_limit(sites) ax = plt.gca() ax.set_xlim(0, 10) ax.set_ylim(0, 10) plt.show()
def delaunay_triangulation(): DT_triangles = [] DT_edges = [] #4 corner points site_bottomleft = Point(0.0, 0.0) site_topleft = Point(-2.0, 10.0) site_bottomright = Point(10.0, 0.0) site_topright = Point(10.0, 10.0) site_edges = [Edge(site) for site in [site_bottomleft, site_topleft, site_bottomright, site_topright]] for A, B, C in [site_edges[:3], site_edges[1:]]: DT_triangles.append(DelaunayTriangle(A, B, C)) #The following line is responsible for object mismatch between triangle edges and DT edges because we instantiate again every Edge #DT_edges.extend([Edge(site) for site in [site_bottomleft, site_topleft, site_bottomright, site_topright]]) #Add two randomly generated point to the list of point site_edges.extend([Edge(point) for point in MathUtilities.generate_points(number = 2)]) DT_edges = site_edges[:4] #Add next site insite the diagram #Ignore the first 4 points for new_site in site_edges[4:]: new_triangles = [] triangle_queue = [] debug("DT", DT_triangles, DT_edges) inside_triangle = False #For each triangle check if it is inside #source http://www.karlchenofhell.org/cppswp/lischinski.pdf for triangle in DT_triangles: #Check if the edge is inside triangle if triangle.is_inside(site) and inside_triangle == False: print "edge is inside triangle" inside_triangle = True new_triangles = triangle.get_inserted_triangles(new_site) debug("right new_triangle", new_triangles, new_triangles[0].edges) print set(DT_edges) & set(new_triangles[0].edges) #Add new triangles to the triangulation list and remove the current one DT_triangles.remove(triangle) #For every new triangle created, check if any point is inside the circumcircle #If there is one point inside, legalize the triangle for new_triangle in new_triangles: #Copy checked_edges list checked_edges = DT_edges[:] print "checked_edges" print checked_edges debug("new_triangle", new_triangle, new_triangle.edges) #We need to exclude the points of the current triangle for edge_to_remove in new_triangle.edges: try: print "edge to remove" print edge_to_remove checked_edges.remove(edge_to_remove) print "edge removed" except: print "remove failed" for checked_edge in checked_edges: if new_triangle.is_inside_circumcircle(checked_edge): print "site inside triangle" left_edge, right_edge, middle_edge = new_triangle.get_ordered_edges(checked_edge) #Flip edges to get a legal triangulation left_triangle = DelaunayTriangle(checked_edge, left_edge, middle_edge) right_triangle = DelaunayTriangle(checked_edge, right_edge, middle_edge) triangle_queue.append(left_triangle) triangle_queue.append(right_triangle) try: #Remove previous triangle from list new_triangles.remove(new_triangle) except: print "Triangle already removed" #Add queued triangle to DT_triangles DT_triangles.extend(triangle_queue) #Triangle deletion finished we can add new triangles DT_triangles.extend(new_triangles) #Triangle has been found, break the loop for this site break plt.figure() #Special marker on the current added site plt.plot([new_site.x], [new_site.y], marker = "*", markersize = 10) delaunay_incremental_display(site_edges, DT_triangles) DT_edges.append(new_site) if inside_triangle == False: print "This edge is not inside any triangle" print DT_triangles print "Job done for all sites"