示例#1
0
  public static Face makeCcw(Face f, Edge e, Vertex p) {
    int i;
    Face invisibleFace;

    if (e.getAdjface(1) == null) {
      invisibleFace = e.getAdjface(0);
    } else {
      if (!e.getAdjface(0).visible) {
        invisibleFace = e.getAdjface(0);
      } else {
        invisibleFace = e.getAdjface(1);
      }
    }

    for (i = 0; invisibleFace.getVertex(i) != e.getEndpt(1); i++) {}

    if (invisibleFace.getVertex((i + 1) % 3) != e.getEndpt(0)) {
      f.setVertex(0, e.getEndpt(1));
      f.setVertex(1, e.getEndpt(0));
    } else {
      f.setVertex(0, e.getEndpt(0));
      f.setVertex(1, e.getEndpt(1));

      swap(f.getEdge(1), f.getEdge(2));
    }

    f.setVertex(2, p);
    return f;
  }
示例#2
0
  public static void buildTetrahedron() {
    QueueElement<Vertex> v0;
    QueueElement<Vertex> v3;

    int volume;

    // find 3 noncollinear points
    v0 = ConvexHull.vertices.getFirst();
    while (collinear(v0.getElem(), v0.getNext().getElem(), v0.getNext().getNext().getElem())) {
      v0 = v0.getNext();
      if (v0.getNext() == ConvexHull.vertices.getFirst()) {
        System.err.println("All points are collinear");
        System.exit(0);
      }
    }

    // mark vertices as processed
    v0.getElem().setMark(true);
    v0.getNext().getElem().setMark(true);
    v0.getNext().getNext().getElem().setMark(true);

    Edge e0 = Edge.makeEdge(v0.getElem(), v0.getNext().getElem());
    Edge e1 = Edge.makeEdge(v0.getNext().getElem(), v0.getNext().getNext().getElem());
    Edge e2 = Edge.makeEdge(v0.getNext().getNext().getElem(), v0.getElem());

    Face f = Face.makeFace(e0, e1, e2);
    f.setVertices(v0.getElem(), v0.getNext().getElem(), v0.getNext().getNext().getElem());

    e0.setAdjface(0, f);
    e1.setAdjface(0, f);
    e1.setAdjface(0, f);

    // try to find another noncollinear vertex
    v3 = v0.getNext().getNext().getNext();
    volume = volume(f, v3.getElem());

    while (volume == 0) {
      v3 = v3.getNext();
      if (v3 == ConvexHull.vertices.getFirst()) {
        System.err.println("All points are coplanar");
        System.exit(0);
      }
      volume = volume(f, v3.getElem());
    }
    v3.getElem().setMark(true);

    // store vertices in ccw order
    if (volume < 0) {
      swap(f.getVertex(1), f.getVertex(2));
      swap(f.getEdge(1), f.getEdge(2));
    }

    e0.setAdjface(1, makeStructs(e0, v3.getElem()));
    e1.setAdjface(1, makeStructs(e1, v3.getElem()));
    e2.setAdjface(1, makeStructs(e2, v3.getElem()));

    Cleaning.cleanUp();
  }
示例#3
0
 public String facesToString() {
   String result = "List of faces\n";
   Iterator it = this.facets.iterator();
   int cont = 0;
   while (it.hasNext()) {
     Face<X> f = (Face<X>) it.next();
     result = result + "f" + cont + " ";
     Halfedge<X> e = f.getEdge();
     while (e.getNext() != f.getEdge()) {
       result = result + vertices.indexOf(e.getVertex()) + " ";
       e = e.getNext();
     }
     result = result + vertices.indexOf(e.getVertex()) + "\n";
     cont++;
   }
   return result;
 }
示例#4
0
  public void createCenterVertex(Face<X> f) {
    int degree = f.degree();
    Point_[] neighbors = new Point_[degree];

    Halfedge<X> e = f.getEdge();
    neighbors[0] = e.getVertex().getPoint();
    for (int i = 1; i < degree; i++) {
      e = e.getNext();
      neighbors[i] = e.getVertex().getPoint();
    }
    Point_ centerVertex;
    if (neighbors[0].dimension() == 2) centerVertex = new Point_2();
    else if (neighbors[0].dimension() == 3) centerVertex = new Point_3();
    else throw new Error("error point dimension");
  }
示例#5
0
 @Override
 public Face cloneFace(Face face) {
   return new Face(face.getEdge());
 }