quadricStale = false;
unApplyQuadricToNeighbor();
Matrix m = Matrix.ZERO;
- E e = this.e;
int count = 0;
- do {
+ for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
T t = e.t;
m = m.plus(t.norm().fundamentalQuadric(t.centroid()));
count++;
- e = e.pair.next;
- } while(e != this.e);
+ }
fundamentalQuadric = m.times(1/(float)count);
applyQuadricToNeighbor();
}
public void reComputeErrorAround() {
reComputeError();
if (nearest_in_other_mesh != null) nearest_in_other_mesh.reComputeError();
- E e = this.e;
- do {
+ for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next)
e.p2.reComputeError();
- e = e.pair.next;
- } while (e != this.e);
}
public void reComputeError() {
unComputeError();
int numaspects = 0;
float aspects = 0;
- E e = this.e;
- do {
+ for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
//double ang = Math.abs(e.crossAngle());
double ang = Math.abs(e.crossAngle());
if (ang > Math.PI) throw new Error();
float minangle = (float)(Math.PI * 0.8);
if (ang > minangle)
oldscore += (ang - minangle);
-
- e = e.pair.next;
- } while (e != this.e);
+ }
if (numaspects > 0) oldscore += (aspects / numaspects);
//System.out.println(oldscore);
}
private void removeTrianglesFromRTree() {
- E e = this.e;
- do {
+ for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next)
if (e.t != null) e.t.removeFromRTree();
- e = e.pair.next;
- } while(e != this.e);
}
private void addTrianglesToRTree() {
- E e = this.e;
- do {
+ for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next)
if (e.t != null) e.t.addToRTree();
- e = e.pair.next;
- } while(e != this.e);
}
/** does NOT update bound pairs! */
good = true;
-
- E e = this.e;
- do {
+ for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
if (Math.abs(e.crossAngle()) > (Math.PI * 0.9) || Math.abs(e.next.crossAngle()) > (Math.PI * 0.9)) good = false;
if (e.t.aspect() < 0.1) good = false;
- // should recompute fundamental quadrics of all vertices sharing a face, but we defer...
e.p2.quadricStale = true;
- e = e.pair.next;
- } while(e != this.e);
+ }
if (!ignorecollision && good) triangles.range(oldp, this.p, (Visitor<T>)this);
public void visit(T t) {
if (!good) return;
- E e = Vertex.this.e;
- do {
+ for(E e = Vertex.this.e; e!=null; e=e.pair.next==Vertex.this.e?null:e.pair.next) {
if (!t.has(e.p1) && !t.has(e.p2) && e.intersects(t)) { good = false; }
if (e.t != null) {
if (!e.t.has(t.e1().p1) && !e.t.has(t.e1().p2) && t.e1().intersects(e.t)) { good = false; }
if (!e.t.has(t.e2().p1) && !e.t.has(t.e2().p2) && t.e2().intersects(e.t)) { good = false; }
if (!e.t.has(t.e3().p1) && !e.t.has(t.e3().p2) && t.e3().intersects(e.t)) { good = false; }
}
- e = e.pair.next;
- } while(e != Vertex.this.e);
+ }
}
private boolean good;