示例#1
0
  public static Face makeStructs(Edge e, Vertex p) {
    Face new_face = new Face();
    Edge[] new_edge = new Edge[2];

    for (int i = 0; i < 2; i++) {
      if (!(e.getEndpt(i).duplicate == null)) {
        new_edge[i] = Edge.makeEdge(e.getEndpt(i), p);
        e.getEndpt(i).duplicate = new_edge[i];
      }
    }

    new_face = Face.makeFace(e, new_edge[0], new_edge[1]);
    new_face = makeCcw(new_face, e, p);

    for (int i = 0; i < 2; ++i) {
      for (int j = 0; j < 3; ++j) {

        if (new_edge[i] == null || new_edge[i].getAdjface(j) == null) {
          new_edge[i].setAdjface(j, new_face);
          break;
        }
      }
    }

    return new_face;
  }
示例#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();
  }