public float error() { return (float)error; }
public int size() { return vertices.size(); }
+ public int numTriangles() { return triangles.size(); }
public Iterable<Vertex> vertices() { return vertices; }
public Iterator<T> iterator() { return triangles.iterator(); }
bindEdge(e, m);
}
public void bindEdge(E e, Matrix m) {
+ /*
for(E e_ : (Iterable<E>)e.getBoundPeers()) {
if (e.v1.getPoint().distance((e.getBindingMatrix(e_).times(e_.v1.getPoint()))) > 0.01f)
throw new RuntimeException("blah! " + e.v1.getPoint() + " " + e.getBindingMatrix(e_).times(e_.v1.getPoint()));
if (v2.getPoint().distance(m.times(e.getBindingMatrix(e_).times(e_.v2.getPoint()))) > 0.01f)
throw new RuntimeException("blah! " + v2.getPoint() + " " + m.times(e_.v2.getPoint()));
}
+ */
this.bindTo(m, e, EPSILON);
this.pair.bindTo(m, e.pair, EPSILON);
}
public E(Point v1, Point v2) {
if (vertices.get(v1) != null) throw new Error();
if (vertices.get(v2) != null) throw new Error();
+ if (v1.equals(v2)) throw new Error("attempt to create a zero-length edge!");
this.v1 = new Vertex(v1);
this.v2 = new Vertex(v2);
this.prev = this.next = this.pair = new E(this, this, this);
public T newT(HasPoint v1, HasPoint v2, HasPoint v3) {
return newT(v1.getPoint(), v2.getPoint(), v3.getPoint(), null, 0);
}
+ public T newT(Point v1, Point v2, Point v3, Vec norm) { return newT(v1, v2, v3, norm, 1); }
public T newT(Point v1, Point v2, Point v3, Vec norm, int colorclass) {
+ if (v1.equals(v2)
+ || v2.equals(v3)
+ || v3.equals(v1))
+ throw new Error("attempt to make a triangle with a length-zero side");
if (coalesce) {
-
for(Vertex v : vertices) { if (v1.distance(v.p) < EPSILON) { v1 = v.p; break; } }
for(Vertex v : vertices) { if (v2.distance(v.p) < EPSILON) { v2 = v.p; break; } }
for(Vertex v : vertices) { if (v3.distance(v.p) < EPSILON) { v3 = v.p; break; } }
v2 = new Point(round(v2.x), round(v2.y), round(v2.z));
v3 = new Point(round(v3.x), round(v3.y), round(v3.z));
*/
+ /*
+ // triangle's vertices got merged
+ if (v1.equals(v2) || v2.equals(v3) || v3.equals(v1))
+ return null;
+ */
}
if (norm != null) {
Vec norm2 = v3.minus(v1).cross(v2.minus(v1));
E e12 = makeE(v1, v2);
E e23 = makeE(v2, v3);
E e31 = makeE(v3, v1);
+ if (e12==e23 || e23==e31 || e12==e31) throw new Error();
while(e12.next != e23 || e23.next != e31 || e31.next != e12) {
e12.makeAdjacent(e23);
e23.makeAdjacent(e31);