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; }
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(); }
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; }
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"); }
@Override public Face cloneFace(Face face) { return new Face(face.getEdge()); }