From: adam Date: Wed, 5 Dec 2007 05:53:20 +0000 (-0800) Subject: checkpoint X-Git-Url: http://git.megacz.com/?p=anneal.git;a=commitdiff_plain;h=3a566fdd09e751b7901edc4d22060032f96fe438 checkpoint darcs-hash:20071205055320-5007d-b41614df01aa8a4a9133d0f65dfb4fe2ae63ffa3.gz --- diff --git a/src/edu/berkeley/qfat/Main.java b/src/edu/berkeley/qfat/Main.java index 77c1db1..52782be 100644 --- a/src/edu/berkeley/qfat/Main.java +++ b/src/edu/berkeley/qfat/Main.java @@ -264,7 +264,7 @@ public class Main implements GLEventListener, MouseListener, MouseMotionListener r1 = r1 - (float)Math.floor(r1); r1 = r1 * (float)0.01; r1 = r1 - (float)0.005; - Vec v = p.watchback().p.minus(p.p).norm().times(r1); + Vec v = p.watchback().minus(p.p).norm().times(r1); //v = p.norm().times(v.dot(p.norm())); diff --git a/src/edu/berkeley/qfat/Mesh.java b/src/edu/berkeley/qfat/Mesh.java index 13c00da..219da71 100644 --- a/src/edu/berkeley/qfat/Mesh.java +++ b/src/edu/berkeley/qfat/Mesh.java @@ -122,7 +122,6 @@ public class Mesh implements Iterable { public Point centroid() { return pointset.centroid(); } public Vert nearest(Point p) { return pointset.nearest(p); } - public Vert register(Point p) { Vert v = pointset.get(p); return v==null ? new Vert(p) : v; } public final class Vert extends HasPoint { public Point p; public Point getPoint() { return p; } @@ -146,8 +145,8 @@ public class Mesh implements Iterable { watch = null; } public Vert partner() { return watch==null ? this : watch; } - public Vert watchback() { return watch_count==0 ? partner() : - register(new Point(watch_x/watch_count, watch_y/watch_count, watch_z/watch_count)); } + public Point watchback() { return watch_count==0 ? partner().p : + new Point(watch_x/watch_count, watch_y/watch_count, watch_z/watch_count); } public void rescore() { if (score_against == null) return; @@ -225,15 +224,6 @@ public class Mesh implements Iterable { return good; } - public E makeE(Vert p2) { - E e = getE(p2); - if (e != null) return e; - e = p2.getE(this); - if (this.e == null && p2.e == null) return this.e = new E(this, p2); - if (this.e == null && p2.e != null) return p2.makeE(this).pair; - return new E(getFreeIncident(), p2); - } - public E getFreeIncident() { E ret = getFreeIncident(e, e); if (ret != null) return ret; @@ -343,8 +333,8 @@ public class Mesh implements Iterable { pair.shatter(); destroy(); - newT(r, p1, mid, null); - newT(r, mid, p2, null); + newT(r.p, p1.p, mid.p, null); + newT(r.p, mid.p, p2.p, null); bg1.add(p1.getE(mid)); bg2.add(mid.getE(p2)); return mid; @@ -532,17 +522,33 @@ public class Mesh implements Iterable { } } - public T newT(Point p1, Point p2, Point p3, Vec norm) { return newT(register(p1), register(p2), register(p3), norm); } - public T newT(Vert p1, Vert p2, Vert p3, Vec norm) { + private Vert register(Point p) { + Vert v = pointset.get(p); + return v==null ? new Vert(p) : v; + } + public E makeE(Point p1, Point p2) { + Vert v1 = pointset.get(p1); + Vert v2 = pointset.get(p2); + if (v1 != null && v2 != null) { + E e = v1.getE(v2); + if (e != null) return e; + e = v2.getE(v1); + if (e != null) return e; + } + if (v1 != null) return new E(v1.getFreeIncident(), register(p2)); + if (v2 != null) return new E(v2.getFreeIncident(), register(p1)).pair; + return new E(register(p1), register(p2)); + } + public T newT(Point p1, Point p2, Point p3, Vec norm) { if (norm != null) { - Vec norm2 = p3.p.minus(p1.p).cross(p2.p.minus(p1.p)); + Vec norm2 = p3.minus(p1).cross(p2.minus(p1)); float dot = norm.dot(norm2); //if (Math.abs(dot) < EPointSILON) throw new Error("dot products within evertsilon of each other: "+norm+" "+norm2); - if (dot < 0) { Vert p = p1; p1=p2; p2 = p; } + if (dot < 0) { Point p = p1; p1=p2; p2 = p; } } - E e12 = p1.makeE(p2); - E e23 = p2.makeE(p3); - E e31 = p3.makeE(p1); + E e12 = makeE(p1, p2); + E e23 = makeE(p2, p3); + E e31 = makeE(p3, p1); while(e12.next != e23 || e23.next != e31 || e31.next != e12) { e12.makeAdjacent(e23); e23.makeAdjacent(e31);