goal.ignorecollision = true;
// rotate to align major axis -- this probably needs to be done by a human.
- goal.transform(new Matrix(new Vec(0, 0, 1), (float)(Math.PI/2)));
+ goal.transform(Matrix.rotate(new Vec(0, 0, 1), (float)(Math.PI/2)));
float goal_width = goal.diagonal().dot(new Vec(1, 0, 0));
float goal_height = goal.diagonal().dot(new Vec(0, 1, 0));
translations = new Matrix[] {
- new Matrix(new Vec(lshift, depth, halfup)),
- new Matrix(new Vec(rshift, depth, halfup)),
- new Matrix(new Vec(lshift, -depth, halfup)),
- new Matrix(new Vec(rshift, -depth, halfup)),
+ Matrix.translate(new Vec(lshift, depth, halfup)),
+ Matrix.translate(new Vec(rshift, depth, halfup)),
+ Matrix.translate(new Vec(lshift, -depth, halfup)),
+ Matrix.translate(new Vec(rshift, -depth, halfup)),
/*
- new Matrix(new Vec(0, depth, halfup)),
- new Matrix(new Vec(0, -depth, halfup)),
+ Matrix.translate(new Vec(0, depth, halfup)),
+ Matrix.translate(new Vec(0, -depth, halfup)),
*/
- new Matrix(new Vec(lshift, 0, height)),
- new Matrix(new Vec(rshift, 0, height)),
- new Matrix(new Vec(lshift, 0, -height)),
- new Matrix(new Vec(rshift, 0, -height)),
+ Matrix.translate(new Vec(lshift, 0, height)),
+ Matrix.translate(new Vec(rshift, 0, height)),
+ Matrix.translate(new Vec(lshift, 0, -height)),
+ Matrix.translate(new Vec(rshift, 0, -height)),
- new Matrix(new Vec( width, 0, 0)),
- new Matrix(new Vec(-width, 0, 0)),
+ Matrix.translate(new Vec( width, 0, 0)),
+ Matrix.translate(new Vec(-width, 0, 0)),
};
}
}
- //xMesh.Vert mid = lbf.getE(mbn).shatter();
+ //xMesh.Vertex mid = lbf.getE(mbn).shatter();
// rescale to match volume
float factor = (float)Math.pow(tile.volume() / goal.volume(), 1.0/3.0);
goal.transform(Matrix.scale(factor));
// translate to match centroid
- goal.transform(new Matrix(tile.centroid().minus(goal.centroid())));
+ goal.transform(Matrix.translate(tile.centroid().minus(goal.centroid())));
+ goal.makeVerticesImmutable();
//tx.e2.shatter();
//tx.e3.shatter();
tile.score_against = goal;
goal.score_against = tile;
- tile.tilemesh = true;
}
public synchronized void breakit() {
int oldverts = verts;
System.out.println("doubling vertices.");
PriorityQueue<Mesh.E> es = new PriorityQueue<Mesh.E>();
- for(Mesh.E e : tile.edges()) es.add(e);
+ for(Mesh.T t : tile) {
+ es.add(t.e1());
+ es.add(t.e2());
+ es.add(t.e3());
+ }
for(int i=0; i<oldverts; i++) {
Mesh.E e = es.poll();
verts++;
tile.rebindPoints();
}
- public synchronized void rand(float temp, Mesh.Vert p) {
+ public synchronized void rand(float temp, Mesh.Vertex p) {
//p.reComputeError();
p.reComputeErrorAround();
temp = temp * gamma;
- HashSet<Mesh.Vert> hs = new HashSet<Mesh.Vert>();
- for(Mesh.Vert p : tile.vertices()) hs.add(p);
- Mesh.Vert[] pts = (Mesh.Vert[])hs.toArray(new Mesh.Vert[0]);
+ HashSet<Mesh.Vertex> hs = new HashSet<Mesh.Vertex>();
+ 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<100; i++) {
+ for(int i=0; i<40; i++) {
if (anneal) {
count++;
- Mesh.Vert v = pts[Math.abs(random.nextInt()) % pts.length];
+ Mesh.Vertex v = pts[Math.abs(random.nextInt()) % pts.length];
rand(temp,v);
}
Thread.yield();
System.out.println("temp="+temp + " ratio="+(Math.ceil(ratio*100)) + " " +
"points_per_second=" +
(count*1000)/((double)(System.currentTimeMillis()-then)));
- tile.rebuildPointSet();
- repaint();
- //breakit();
- repaint();
+
goal.unApplyQuadricToNeighborAll();
repaint();
tile.recomputeAllFundamentalQuadrics();
repaint();
goal.applyQuadricToNeighborAll();
+
+ safeTriangles.clear();
+ for(Mesh.T t : tile) if (t.shouldBeDrawn()) safeTriangles.add(t);
}
}
}
+
public static void main(String[] s) throws Exception {
StlFile stlf = new StlFile();
stlf.load("fish.stl");