From 400c3ff5e9f165c896811fc84d126552b2323849 Mon Sep 17 00:00:00 2001 From: adam Date: Tue, 4 Dec 2007 20:32:30 -0800 Subject: [PATCH] checkpoint darcs-hash:20071205043230-5007d-1d09aafc38d032fac572a3c18fdd03bcc67210ee.gz --- src/edu/berkeley/qfat/Main.java | 22 +++--- src/edu/berkeley/qfat/Mesh.java | 114 +++++++++++++++--------------- src/edu/berkeley/qfat/geom/Triangle.java | 8 +++ 3 files changed, 76 insertions(+), 68 deletions(-) create mode 100644 src/edu/berkeley/qfat/geom/Triangle.java diff --git a/src/edu/berkeley/qfat/Main.java b/src/edu/berkeley/qfat/Main.java index 9ba230d..bdab101 100644 --- a/src/edu/berkeley/qfat/Main.java +++ b/src/edu/berkeley/qfat/Main.java @@ -184,23 +184,23 @@ public class Main implements GLEventListener, MouseListener, MouseMotionListener for(Mesh.T t2 : tile) { if (t1==t2) continue; - if ((t1.p1().p.times(m).minus(t2.p1().p).mag() < Mesh.EPSILON) && - (t1.p2().p.times(m).minus(t2.p3().p).mag() < Mesh.EPSILON) && - (t1.p3().p.times(m).minus(t2.p2().p).mag() < Mesh.EPSILON)) { + if ((t1.v1().p.times(m).minus(t2.v1().p).mag() < Mesh.EPSILON) && + (t1.v2().p.times(m).minus(t2.v3().p).mag() < Mesh.EPSILON) && + (t1.v3().p.times(m).minus(t2.v2().p).mag() < Mesh.EPSILON)) { t1.e1().bind(t2.e3().pair); t1.e2().bind(t2.e2().pair); t1.e3().bind(t2.e1().pair); } - if ((t1.p2().p.times(m).minus(t2.p1().p).mag() < Mesh.EPSILON) && - (t1.p3().p.times(m).minus(t2.p3().p).mag() < Mesh.EPSILON) && - (t1.p1().p.times(m).minus(t2.p2().p).mag() < Mesh.EPSILON)) { + if ((t1.v2().p.times(m).minus(t2.v1().p).mag() < Mesh.EPSILON) && + (t1.v3().p.times(m).minus(t2.v3().p).mag() < Mesh.EPSILON) && + (t1.v1().p.times(m).minus(t2.v2().p).mag() < Mesh.EPSILON)) { t1.e2().bind(t2.e3().pair); t1.e3().bind(t2.e2().pair); t1.e1().bind(t2.e1().pair); } - if ((t1.p3().p.times(m).minus(t2.p1().p).mag() < Mesh.EPSILON) && - (t1.p1().p.times(m).minus(t2.p3().p).mag() < Mesh.EPSILON) && - (t1.p2().p.times(m).minus(t2.p2().p).mag() < Mesh.EPSILON)) { + if ((t1.v3().p.times(m).minus(t2.v1().p).mag() < Mesh.EPSILON) && + (t1.v1().p.times(m).minus(t2.v3().p).mag() < Mesh.EPSILON) && + (t1.v2().p.times(m).minus(t2.v2().p).mag() < Mesh.EPSILON)) { t1.e3().bind(t2.e3().pair); t1.e1().bind(t2.e2().pair); t1.e2().bind(t2.e1().pair); @@ -408,7 +408,7 @@ public class Main implements GLEventListener, MouseListener, MouseMotionListener */ if (mesh==goal) - for(Mesh.Vert p : new Mesh.Vert[] { t.p1(), t.p2(), t.p3() }) { + for(Mesh.Vert p : new Mesh.Vert[] { t.v1(), t.v2(), t.v3() }) { p.p.glVertex(gl); //p.plus(p.norm().times(p.score()*10)).glVertex(gl); p.partner().p.glVertex(gl); @@ -450,7 +450,7 @@ public class Main implements GLEventListener, MouseListener, MouseMotionListener glcanvas.repaint(); //tile.ts.get(Math.abs(random.nextInt()) % tile.ts.size()).e1().p1 for(Mesh.T t : tile) - for(Mesh.Vert p : new Mesh.Vert[] { t.p1(), t.p2(), t.p3() }) { + for(Mesh.Vert p : new Mesh.Vert[] { t.v1(), t.v2(), t.v3() }) { rand(10,p); } goal.rescore(); diff --git a/src/edu/berkeley/qfat/Mesh.java b/src/edu/berkeley/qfat/Mesh.java index 50df8dd..c830acf 100644 --- a/src/edu/berkeley/qfat/Mesh.java +++ b/src/edu/berkeley/qfat/Mesh.java @@ -33,9 +33,9 @@ public class Mesh implements Iterable { public void unbind() { for(Mesh.T t : this) { - t.p1().unbind(); - t.p2().unbind(); - t.p3().unbind(); + t.v1().unbind(); + t.v2().unbind(); + t.v3().unbind(); } } @@ -52,17 +52,17 @@ public class Mesh implements Iterable { double dist = 0; HashSet done = new HashSet(); for(T t : ts) - for(Vert p : new Vert[] { t.p1(), t.p2(), t.p3() }) { + for(Vert p : new Vert[] { t.v1(), t.v2(), t.v3() }) { if (done.contains(p)) continue; done.add(p); p.rescore(); } for(T t : ts) - for(Vert p : new Vert[] { t.p1(), t.p2(), t.p3() }) + for(Vert p : new Vert[] { t.v1(), t.v2(), t.v3() }) p.kdremove(); kd = new KDTree(3); for(T t : ts) - for(Vert p : new Vert[] { t.p1(), t.p2(), t.p3() }) + for(Vert p : new Vert[] { t.v1(), t.v2(), t.v3() }) p.kdinsert(); return (float)(dist/num); } @@ -129,28 +129,6 @@ public class Mesh implements Iterable { return (Vert)results[0]; } - public T newT(Vert p1, Vert p2, Vert p3, Vec norm) { - if (norm != null) { - Vec norm2 = p3.p.minus(p1.p).cross(p2.p.minus(p1.p)); - float dot = norm.dot(norm2); - //if (Math.abs(dot) < EPointSILON) throw new Error("dot products within epsilon of each other: "+norm+" "+norm2); - if (dot < 0) { Vert p = p1; p1=p2; p2 = p; } - } - E e12 = p1.makeE(p2); - E e23 = p2.makeE(p3); - E e31 = p3.makeE(p1); - while(e12.next != e23 || e23.next != e31 || e31.next != e12) { - e12.makeAdjacent(e23); - e23.makeAdjacent(e31); - e31.makeAdjacent(e12); - } - T ret = e12.makeT(); - if (e12.t == null) throw new Error(); - if (e23.t == null) throw new Error(); - if (e31.t == null) throw new Error(); - return ret; - } - public class BindingGroup { public HashSet es = new HashSet(); public BindingGroup() { } @@ -365,9 +343,9 @@ public class Mesh implements Iterable { public final class E implements Comparable { public boolean intersects(T t) { - double A0=t.p1().p.x, A1=t.p1().p.y, A2=t.p1().p.z; - double B0=t.p2().p.x, B1=t.p2().p.y, B2=t.p2().p.z; - double C0=t.p3().p.x, C1=t.p3().p.y, C2=t.p3().p.z; + double A0=t.v1().p.x, A1=t.v1().p.y, A2=t.v1().p.z; + double B0=t.v2().p.x, B1=t.v2().p.y, B2=t.v2().p.z; + double C0=t.v3().p.x, C1=t.v3().p.y, C2=t.v3().p.z; double j0=p1.p.x, j1=p1.p.y, j2=p1.p.z; double k0=p2.p.x, k1=p2.p.y, k2=p2.p.z; double J0, J1, J2; @@ -599,8 +577,30 @@ public class Mesh implements Iterable { public String toString() { return p1+"->"+p2; } } + public T newT(Vert p1, Vert p2, Vert p3, Vec norm) { + if (norm != null) { + Vec norm2 = p3.p.minus(p1.p).cross(p2.p.minus(p1.p)); + float dot = norm.dot(norm2); + //if (Math.abs(dot) < EPointSILON) throw new Error("dot products within epsilon of each other: "+norm+" "+norm2); + if (dot < 0) { Vert p = p1; p1=p2; p2 = p; } + } + E e12 = p1.makeE(p2); + E e23 = p2.makeE(p3); + E e31 = p3.makeE(p1); + while(e12.next != e23 || e23.next != e31 || e31.next != e12) { + e12.makeAdjacent(e23); + e23.makeAdjacent(e31); + e31.makeAdjacent(e12); + } + T ret = e12.makeT(); + if (e12.t == null) throw new Error(); + if (e23.t == null) throw new Error(); + if (e31.t == null) throw new Error(); + return ret; + } + /** [UNIQUE] a triangle (face) */ - public final class T { + public final class T extends Triangle { public final E e1; public final int color; @@ -609,12 +609,12 @@ public class Mesh implements Iterable { } public Vert nearest(Point p) { - float d1 = p1().p.distance(p); - float d2 = p2().p.distance(p); - float d3 = p3().p.distance(p); - if (d1 < d2 && d1 < d3) return p1(); - if (d2 < d3) return p2(); - return p3(); + float d1 = v1().p.distance(p); + float d2 = v2().p.distance(p); + float d3 = v3().p.distance(p); + if (d1 < d2 && d1 < d3) return v1(); + if (d2 < d3) return v2(); + return v3(); } T(E e1) { @@ -642,35 +642,35 @@ public class Mesh implements Iterable { // FIXME unnecssary ts.add(this); - p1().kdinsert(); - p2().kdinsert(); - p3().kdinsert(); + v1().kdinsert(); + v2().kdinsert(); + v3().kdinsert(); this.color = color; } - public Vert p1() { return e1.p1; } - public Vert p2() { return e1.p2; } - public Vert p3() { return e1.next.p2; } + public Vert v1() { return e1.p1; } + public Vert v2() { return e1.p2; } + public Vert v3() { return e1.next.p2; } + public Point p1() { return e1.p1.p; } + public Point p2() { return e1.p2.p; } + public Point p3() { return e1.next.p2.p; } public E e1() { return e1; } public E e2() { return e1.next; } public E e3() { return e1.prev; } - public Vec norm() { return p2().p.minus(p1().p).cross(p3().p.minus(p1().p)).norm(); } + public Vec norm() { return v2().p.minus(v1().p).cross(v3().p.minus(v1().p)).norm(); } public boolean hasE(E e) { return e1==e || e1.next==e || e1.prev==e; } - public boolean has(Vert v) { return p1()==v || p2()==v || p3()==v; } - - public float area() { - return (float)Math.abs(0.5 * e1().length() * new Vec(p1().p, p2().p).norm().dot(new Vec(p2().p, p3().p))); - } - + public boolean has(Vert v) { return v1()==v || v2()==v || v3()==v; } + public float area() { return (float)Math.abs(0.5*e1().length()*new Vec(v1().p, v2().p).norm().dot(new Vec(v2().p, v3().p))); } public void glVertices(GL gl) { - p1().p.glVertex(gl); - p2().p.glVertex(gl); - p3().p.glVertex(gl); + v1().p.glVertex(gl); + v2().p.glVertex(gl); + v3().p.glVertex(gl); } - public Point centroid() { return new Point((p1().p.x+p2().p.x+p3().p.x)/3, - (p1().p.y+p2().p.y+p3().p.y)/3, - (p1().p.z+p2().p.z+p3().p.z)/3); } + public Point centroid() { + return new Point((v1().p.x+v2().p.x+v3().p.x)/3, + (v1().p.y+v2().p.y+v3().p.y)/3, + (v1().p.z+v2().p.z+v3().p.z)/3); } public float diameter() { // FIXME: what is this supposed to be? return Math.max(Math.max(e1().length(), e2().length()), e3().length()) / 2; diff --git a/src/edu/berkeley/qfat/geom/Triangle.java b/src/edu/berkeley/qfat/geom/Triangle.java new file mode 100644 index 0000000..24c90d0 --- /dev/null +++ b/src/edu/berkeley/qfat/geom/Triangle.java @@ -0,0 +1,8 @@ +package edu.berkeley.qfat.geom; +import javax.media.opengl.*; + +public abstract class Triangle { + public abstract Point p1(); + public abstract Point p2(); + public abstract Point p3(); +} \ No newline at end of file -- 1.7.10.4