Esempio n. 1
0
        public static Face create(Vertex[] vtxArray, int[] indices)
        {
            Face     face   = new Face();
            HalfEdge hePrev = null;

            for (int i = 0; i < indices.Length; i++)
            {
                HalfEdge he = new HalfEdge(vtxArray[indices[i]], face);
                if (hePrev != null)
                {
                    he.setPrev(hePrev);
                    hePrev.setNext(he);
                }
                else
                {
                    face.he0 = he;
                }
                hePrev = he;
            }
            face.he0.setPrev(hePrev);
            hePrev.setNext(face.he0);

            // compute the normal and offset
            face.computeNormalAndCentroid();
            return(face);
        }
Esempio n. 2
0
        private Face connectHalfEdges(HalfEdge hedgePrev, HalfEdge hedge)
        {
            Face discardedFace = null;

            if (hedgePrev.oppositeFace() == hedge.oppositeFace())
            { // then there is a redundant edge that we can get rid off
                Face     oppFace = hedge.oppositeFace();
                HalfEdge hedgeOpp;

                if (hedgePrev == he0)
                {
                    he0 = hedge;
                }
                if (oppFace.numVertices() == 3)
                { // then we can get rid of the opposite face altogether
                    hedgeOpp = hedge.getOpposite().prev.getOpposite();

                    oppFace.mark  = DELETED;
                    discardedFace = oppFace;
                }
                else
                {
                    hedgeOpp = hedge.getOpposite().next;

                    if (oppFace.he0 == hedgeOpp.prev)
                    {
                        oppFace.he0 = hedgeOpp;
                    }
                    hedgeOpp.prev      = hedgeOpp.prev.prev;
                    hedgeOpp.prev.next = hedgeOpp;
                }
                hedge.prev      = hedgePrev.prev;
                hedge.prev.next = hedge;

                hedge.opposite    = hedgeOpp;
                hedgeOpp.opposite = hedge;

                // oppFace was modified, so need to recompute
                oppFace.computeNormalAndCentroid();
            }
            else
            {
                hedgePrev.next = hedge;
                hedge.prev     = hedgePrev;
            }
            return(discardedFace);
        }
Esempio n. 3
0
        public static Face createTriangle(Vertex v0, Vertex v1, Vertex v2, double minArea)
        {
            Face     face = new Face();
            HalfEdge he0  = new HalfEdge(v0, face);
            HalfEdge he1  = new HalfEdge(v1, face);
            HalfEdge he2  = new HalfEdge(v2, face);

            he0.prev = he2;
            he0.next = he1;
            he1.prev = he0;
            he1.next = he2;
            he2.prev = he1;
            he2.next = he0;

            face.he0 = he0;

            // compute the normal and offset
            face.computeNormalAndCentroid(minArea);
            return(face);
        }