示例#1
0
    public HalfEdge[] InsertVertex(Vertex v)
    {
        HalfEdge e01 = this.edge;
        HalfEdge e12 = e01.next;
        HalfEdge e20 = e12.next;

        this.edge = null;

        HalfEdge e13  = new HalfEdge(e12.origin);
        HalfEdge e30  = new HalfEdge(v);
        Triangle tri0 = new Triangle(e01, e13, e30);

        HalfEdge e23  = new HalfEdge(e20.origin);
        HalfEdge e31  = new HalfEdge(v);
        Triangle tri1 = new Triangle(e12, e23, e31);

        HalfEdge e03  = new HalfEdge(e01.origin);
        HalfEdge e32  = new HalfEdge(v);
        Triangle tri2 = new Triangle(e20, e03, e32);

        HalfEdge.SetTwins(e03, e30);
        HalfEdge.SetTwins(e13, e31);
        HalfEdge.SetTwins(e23, e32);

        v.AddOutgoingEdge(e30);
        v.AddOutgoingEdge(e31);
        v.AddOutgoingEdge(e32);

        e03.origin.AddOutgoingEdge(e03);
        e13.origin.AddOutgoingEdge(e13);
        e23.origin.AddOutgoingEdge(e23);


        this.children = new List <Triangle>()
        {
            tri0, tri1, tri2
        };
        return(new HalfEdge[] { e01, e12, e20 });
    }
示例#2
0
    public HalfEdge[] InsertVertex(Vertex v)
    {
        //012 forms left triangle. 103 forms right triangle. 4 is inserted vertex on edge 01, v.

        HalfEdge e01 = this;
        HalfEdge e12 = e01.next;
        HalfEdge e20 = e12.next;

        e01.incidentTriangle.edge = null;

        //Split into 4 triangles
        HalfEdge e04  = new HalfEdge(e01.origin);
        HalfEdge e42  = new HalfEdge(v);
        Triangle tri0 = new Triangle(e04, e42, e20);

        HalfEdge e41  = new HalfEdge(v);
        HalfEdge e24  = new HalfEdge(e20.origin);
        Triangle tri1 = new Triangle(e41, e12, e24);

        HalfEdge.SetTwins(e24, e42);

        e04.origin.RemoveOutgoingEdge(e01);
        e04.origin.AddOutgoingEdge(e04);
        v.AddOutgoingEdge(e41);
        v.AddOutgoingEdge(e42);
        e20.origin.AddOutgoingEdge(e24);


        e01.incidentTriangle.children = new List <Triangle> {
            tri0, tri1
        };
        HalfEdge e10 = this.twin;

        if (e10 != null)
        {
            e10.incidentTriangle.edge = null;

            HalfEdge e03 = e10.next;
            HalfEdge e31 = e03.next;

            HalfEdge e14  = new HalfEdge(e10.origin);
            HalfEdge e43  = new HalfEdge(v);
            Triangle tri2 = new Triangle(e14, e43, e31);

            HalfEdge e40  = new HalfEdge(v);
            HalfEdge e34  = new HalfEdge(e31.origin);
            Triangle tri3 = new Triangle(e40, e03, e34);

            HalfEdge.SetTwins(e04, e40);
            HalfEdge.SetTwins(e14, e41);
            HalfEdge.SetTwins(e34, e43);

            e14.origin.RemoveOutgoingEdge(e10);
            e14.origin.AddOutgoingEdge(e14);
            v.AddOutgoingEdge(e40);
            v.AddOutgoingEdge(e43);
            e31.origin.AddOutgoingEdge(e34);

            e10.incidentTriangle.children = new List <Triangle> {
                tri2, tri3
            };
            return(new HalfEdge[] { e20, e12, e31, e03 });
        }

        return(new HalfEdge[] { e20, e12 });
    }