X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMesh.java;h=2e68c17521c12e78e26c8f2ce1110fae62677760;hb=e34c426f065c06fccdfaa260925c7400d33dafdf;hp=502fa6d080ece416a18340d8f29b34d0626c7292;hpb=00235327934dbc5ffaf5b09cbda538ee0d3686e8;p=anneal.git diff --git a/src/edu/berkeley/qfat/Mesh.java b/src/edu/berkeley/qfat/Mesh.java index 502fa6d..2e68c17 100644 --- a/src/edu/berkeley/qfat/Mesh.java +++ b/src/edu/berkeley/qfat/Mesh.java @@ -85,6 +85,7 @@ public class Mesh implements Iterable { public float error() { return (float)error; } public int size() { return vertices.size(); } + public int numTriangles() { return triangles.size(); } public Iterable vertices() { return vertices; } public Iterator iterator() { return triangles.iterator(); } @@ -713,6 +714,7 @@ public class Mesh implements Iterable { bindEdge(e, m); } public void bindEdge(E e, Matrix m) { + /* for(E e_ : (Iterable)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())); @@ -723,6 +725,7 @@ public class Mesh implements Iterable { 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); } @@ -896,6 +899,7 @@ public class Mesh implements Iterable { 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); @@ -965,9 +969,13 @@ public class Mesh implements Iterable { 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; } } @@ -976,6 +984,11 @@ public class Mesh implements Iterable { 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)); @@ -986,6 +999,7 @@ public class Mesh implements Iterable { 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);