示例#1
0
 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);
 }
示例#2
0
 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;
   }
 }
示例#3
0
文件: Face.java 项目: tintor/Archive
  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();
    }
  }