public Face NewFace(Mkv a, Mkv b, Mkv c) { // Face pf = new Face(); Face pf = stackFace.get(); if (Set(pf, a, b, c)) { if (root != null) { root.prev = pf; } pf.prev = null; pf.next = root; root = pf; ++nfaces; } else { pf.prev = pf.next = null; } return (pf); }
public void Detach(Face face) { if (face.prev != null || face.next != null) { --nfaces; if (face == root) { root = face.next; root.prev = null; } else { if (face.next == null) { face.prev.next = null; } else { face.prev.next = face.next; face.next.prev = face.prev; } } face.prev = face.next = null; } }
public void triangulate(FaceList newFaces, double minArea) { HalfEdge hedge; if (numVertices() < 4) { return; } Vertex v0 = he0.head(); Face prevFace = null; hedge = he0.next; HalfEdge oppPrev = hedge.opposite; Face face0 = null; for (hedge = hedge.next; hedge != he0.prev; hedge = hedge.next) { Face face = createTriangle(v0, hedge.prev.head(), hedge.head(), minArea); face.he0.next.setOpposite(oppPrev); face.he0.prev.setOpposite(hedge.opposite); oppPrev = face.he0; newFaces.add(face); if (face0 == null) { face0 = face; } } hedge = new HalfEdge(he0.prev.prev.head(), this); hedge.setOpposite(oppPrev); hedge.prev = he0; hedge.prev.next = hedge; hedge.next = he0.prev; hedge.next.prev = hedge; computeNormalAndCentroid(minArea); checkConsistency(); for (Face face = face0; face != null; face = face.next) { face.checkConsistency(); } }