- */
-
- 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);
- //oldscore = oldscore*oldscore;
- score += oldscore;
- }
-
- private void removeTrianglesFromRTree() {
- E e = this.e;
- do {
- if (e.t != null) e.t.removeFromRTree();
- e = e.pair.next;
- } while(e != this.e);
- }
- private void addTrianglesToRTree() {
- E e = this.e;
- do {
- if (e.t != null) e.t.addToRTree();
- e = e.pair.next;
- } while(e != this.e);
- }
-
- /** does NOT update bound pairs! */
- public boolean transform(Matrix m) {
- unApplyQuadricToNeighbor();
- Point oldp = this.p;
- try {
- if (pointset.get(this.p)==null) throw new Error();
- pointset.remove(this);
- removeTrianglesFromRTree();
- float newx = m.a*p.x + m.b*p.y + m.c*p.z + m.d;
- float newy = m.e*p.x + m.f*p.y + m.g*p.z + m.h;
- float newz = m.i*p.x + m.j*p.y + m.k*p.z + m.l;
- this.p = new Point(newx, newy, newz);
- addTrianglesToRTree();
- pointset.add(this);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- applyQuadricToNeighbor();
-
- // FIXME: intersection test needed?
- good = true;
-
- // should recompute fundamental quadrics of all vertices sharing a face, but we defer...
- E e = this.e;
- do {
- /*
- 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;
- }
- */
- e.p2.quadricStale = true;
- e = e.pair.next;
- } while(e != this.e);
-
-
- if (!ignorecollision && good) {
-
- tris.range(new Segment(oldp, this.p),
- new Visitor<T>() {
- public void visit(T t) {
- if (!good) return;
- E e = Vert.this.e;
- do {
- 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 != Vert.this.e);
- }
- });
-
- /*
- for(T t : Mesh.this) {
- if (!good) break;
- e = this.e;
- do {
- if (!t.has(e.p1) && !t.has(e.p2) && e.intersects(t)) { good = false; break; }
- if (e.t != null) {
- if (!e.t.has(t.e1().p1) && !e.t.has(t.e1().p2) && t.e1().intersects(e.t)) { good = false; break; }
- if (!e.t.has(t.e2().p1) && !e.t.has(t.e2().p2) && t.e2().intersects(e.t)) { good = false; break; }
- if (!e.t.has(t.e3().p1) && !e.t.has(t.e3().p2) && t.e3().intersects(e.t)) { good = false; break; }
- }
- e = e.pair.next;
- } while(e != this.e);
- }
- */