X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMain.java;h=7841ad32996ba1dc52c2f6d14db77b934ab24202;hp=82ca36c71b58fb8cb0a294d89ef6be039b6f9c8f;hb=26fd0ec674f521a9b53acd1d7cf4eaad1a76a1bc;hpb=e0e7d9b473eacc2407c2d70ed0ec42b109a1faf3 diff --git a/src/edu/berkeley/qfat/Main.java b/src/edu/berkeley/qfat/Main.java index 82ca36c..7841ad3 100644 --- a/src/edu/berkeley/qfat/Main.java +++ b/src/edu/berkeley/qfat/Main.java @@ -26,19 +26,19 @@ import edu.berkeley.qfat.geom.Point; // http://www.cs.cmu.edu/afs/cs/project/quake/public/code/predicates.c /* -blender keys -- middle mouse = option+click -- right mouse = command+click + blender keys + - middle mouse = option+click + - right mouse = command+click -3,7,1 = view along axes (control for opp direction) -4, 8, 7, 2 = rotate in discrete increments (+control to translate) -middle trag: rotate space -shift+middle drag: translate space -wheel: zoom -home: home view: take current angle, zoom to whole scnee -5 = ortho vs non-ortho + 3,7,1 = view along axes (control for opp direction) + 4, 8, 7, 2 = rotate in discrete increments (+control to translate) + middle trag: rotate space + shift+middle drag: translate space + wheel: zoom + home: home view: take current angle, zoom to whole scnee + 5 = ortho vs non-ortho - */ +*/ // FIXME: re-orient goal (how?) @@ -73,9 +73,9 @@ public class Main extends MeshViewer { float goal_depth = goal.diagonal().dot(new Vec(0, 0, 1)); /* - float width = (float)0.6; - float height = (float)0.08; - float depth = (float)0.3; + float width = (float)0.6; + float height = (float)0.08; + float depth = (float)0.3; */ float width = (float)0.7; float depth = (float)0.08; @@ -95,8 +95,8 @@ public class Main extends MeshViewer { Matrix.translate(new Vec(rshift, -depth, halfup)), /* - Matrix.translate(new Vec(0, depth, halfup)), - Matrix.translate(new Vec(0, -depth, halfup)), + Matrix.translate(new Vec(0, depth, halfup)), + Matrix.translate(new Vec(0, -depth, halfup)), */ Matrix.translate(new Vec(lshift, 0, height)), @@ -247,6 +247,7 @@ public class Main extends MeshViewer { // translate to match centroid goal.transform(Matrix.translate(tile.centroid().minus(goal.centroid()))); + goal.makeVerticesImmutable(); //tx.e2.shatter(); //tx.e3.shatter(); @@ -263,9 +264,8 @@ public class Main extends MeshViewer { System.out.println("tile volume: " + tile.volume()); System.out.println("goal volume: " + goal.volume()); - tile.score_against = goal; - goal.score_against = tile; - tile.tilemesh = true; + tile.error_against = goal; + goal.error_against = tile; } public synchronized void breakit() { @@ -290,43 +290,46 @@ public class Main extends MeshViewer { //p.reComputeError(); p.reComputeErrorAround(); - double tile_score = tile.score(); - double goal_score = goal.score(); + double tile_error = tile.error(); + double goal_error = goal.error(); Vec v; /* - Matrix inv = p.errorQuadric(); - v = new Vec(inv.d, inv.h, inv.l).norm().times(1/(float)300); - if (p.quadric_count == 0) { - v = goal.nearest(p.p).p.minus(p.p).norm().times(1/(float)300); - } + Matrix inv = p.errorQuadric(); + v = new Vec(inv.d, inv.h, inv.l).norm().times(1/(float)300); + if (p.quadric_count == 0) { + v = goal.nearest(p.p).p.minus(p.p).norm().times(1/(float)300); + } */ Vec v2 = new Vec((random.nextFloat() - (float)0.5) / 500, - (random.nextFloat() - (float)0.5) / 500, - (random.nextFloat() - (float)0.5) / 500); + (random.nextFloat() - (float)0.5) / 500, + (random.nextFloat() - (float)0.5) / 500); //v = v.plus(v2.norm().times(1/(float)300)); v = v2.norm().times(1/(float)300); - boolean good = p.move(v); + Matrix m = Matrix.translate(v); + + boolean good = p.move(m, false); + if (!good) { misses++; return; } p.reComputeErrorAround(); - double new_tile_score = tile.score(); - double new_goal_score = goal.score(); - double tile_delta = (new_tile_score - tile_score) / tile_score; - double goal_delta = (new_goal_score - goal_score) / goal_score; + double new_tile_error = tile.error(); + double new_goal_error = goal.error(); + double tile_delta = (new_tile_error - tile_error) / tile_error; + double goal_delta = (new_goal_error - goal_error) / goal_error; double delta = tile_delta + goal_delta; double swapProbability = Math.exp((-1 * delta) / temp); boolean doSwap = good && (Math.random() < swapProbability); //boolean doSwap = good && (tile_delta <= 0 && goal_delta <= 0); //boolean doSwap = good && (tile_delta + goal_delta <= 0); if (doSwap) { - tile_score = new_tile_score; - goal_score = new_goal_score; - //System.out.println("score: " + tile_score + " / " + goal_score); + tile_error = new_tile_error; + goal_error = new_goal_error; + //System.out.println("error: " + tile_error + " / " + goal_error); hits++; } else { - p.move(v.times(-1)); + p.move(Matrix.translate(v.times(-1)), true); misses++; } } @@ -337,81 +340,86 @@ public class Main extends MeshViewer { float hightemp = 10; float temp = hightemp; float last = 10; + float lastbreak = 10; while(true) { synchronized(this) { - double ratio = (hits+misses==0) ? 1 : (hits / (hits+misses)); - hits = 0; - misses = 0; - float gamma = 0; - double acceptance = ratio; - accepts = (int)(Math.ceil(ratio*100)); - temps = (int)(Math.ceil(temp*1000)); - vertss = tile.size(); - if (breaks > 0) { while (breaks>0) { - breaks--; - breakit(); - //gamma = 1; - gamma = 1; - //temp = last * 0.8f; - //last = temp; - //temp = hightemp; - } } else - if (acceptance > 0.96) gamma = 0.4f; - else if (acceptance > 0.9) gamma = 0.5f; - else if (acceptance > 0.8) gamma = 0.65f; - else if (acceptance > 0.6) gamma = 0.7f; - else { - if (acceptance > 0.3) { - gamma = 0.9f; - } else if (acceptance > 0.15) { - gamma = 0.95f; - } else if (acceptance > 0.10) { - gamma = 0.98f; - } else { - breakit(); - //gamma = 1; - gamma = 0.99f; - //gamma = 1; - //temp = last * 0.8f; - //last = temp; - //temp = hightemp; + double ratio = (hits+misses==0) ? 1 : (hits / (hits+misses)); + hits = 0; + misses = 0; + float gamma = 0; + double acceptance = ratio; + accepts = (int)(Math.ceil(ratio*100)); + temps = (int)(Math.ceil(temp*1000)); + vertss = tile.size(); + if (breaks > 0) { while (breaks>0) { + breaks--; + breakit(); + //gamma = 1; + float t = temp; + temp = lastbreak; + gamma = 1; + lastbreak = t; + //temp = last * 0.8f; + //last = temp; + //temp = hightemp; + } } else + if (acceptance > 0.96) gamma = 0.4f; + else if (acceptance > 0.9) gamma = 0.5f; + else if (acceptance > 0.8) gamma = 0.65f; + else if (acceptance > 0.6) gamma = 0.7f; + else { + if (acceptance > 0.3) { + gamma = 0.9f; + } else if (acceptance > 0.15) { + gamma = 0.95f; + } else if (acceptance > 0.10) { + gamma = 0.98f; + } else { + breakit(); + float t = temp; + temp = lastbreak; + gamma = 1; + lastbreak = t; + //gamma = 1; + //gamma = 0.99f; + //gamma = 1; + //temp = last * 0.8f; + //last = temp; + //temp = hightemp; + } + } + temp = temp * gamma; + + + HashSet hs = new HashSet(); + for(Mesh.Vertex p : tile.vertices()) hs.add(p); + Mesh.Vertex[] pts = (Mesh.Vertex[])hs.toArray(new Mesh.Vertex[0]); + + int count = 0; + long then = System.currentTimeMillis(); + for(int i=0; i<40; i++) { + if (anneal) { + count++; + Mesh.Vertex v = pts[Math.abs(random.nextInt()) % pts.length]; + rand(temp,v); + v.recomputeFundamentalQuadricIfStale(); + v.recomputeFundamentalQuadricIfNeighborChanged(); + } + Thread.yield(); + repaint(); } - } - temp = temp * gamma; - + System.out.println("temp="+temp + " ratio="+(Math.ceil(ratio*100)) + " " + + "points_per_second=" + + (count*1000)/((double)(System.currentTimeMillis()-then))); - HashSet hs = new HashSet(); - for(Mesh.Vertex p : tile.vertices()) hs.add(p); - Mesh.Vertex[] pts = (Mesh.Vertex[])hs.toArray(new Mesh.Vertex[0]); + for(Mesh.Vertex p : goal.vertices()) p.recomputeFundamentalQuadricIfNeighborChanged(); - int count = 0; - long then = System.currentTimeMillis(); - for(int i=0; i<100; i++) { - if (anneal) { - count++; - Mesh.Vertex v = pts[Math.abs(random.nextInt()) % pts.length]; - rand(temp,v); + synchronized(safeTriangles) { + safeTriangles.clear(); + for(Mesh.T t : tile) if (t.shouldBeDrawn()) safeTriangles.add(t); } - Thread.yield(); - repaint(); } - System.out.println("temp="+temp + " ratio="+(Math.ceil(ratio*100)) + " " + - "points_per_second=" + - (count*1000)/((double)(System.currentTimeMillis()-then))); - tile.rebuild(); - repaint(); - //breakit(); - repaint(); - goal.unApplyQuadricToNeighborAll(); - repaint(); - tile.recomputeAllFundamentalQuadrics(); - repaint(); - goal.applyQuadricToNeighborAll(); - - safeTriangles.clear(); - for(Mesh.T t : tile) if (t.shouldBeDrawn()) safeTriangles.add(t); - } - } + } }