Exemple #1
0
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()
Exemple #2
0
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"