X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2FMain.java;h=bc01a062ccc7712b96fedf08fe385eecf8c27c34;hb=cb4f3272e7ed4c1c384dae4cd4edc20e3feda6c7;hp=4e4dc866781d00d89a0653f6abd8e649708e96f6;hpb=1a864cc577c2b31049cd46f4fd9ed703802d7d17;p=anneal.git diff --git a/src/Main.java b/src/Main.java index 4e4dc86..bc01a06 100644 --- a/src/Main.java +++ b/src/Main.java @@ -3,35 +3,132 @@ import java.awt.event.*; import javax.swing.*; import javax.media.opengl.*; import javax.media.opengl.glu.*; +import java.util.*; -// FEATURE: check google's 3D warehouse for sample shapes +// FIXME: recenter goal to have centroid coincident with tile +// FIXME: re-orient goal (how?) +// fish case: ensure that spinal axis of fish is the x-axis of the tile -public class Main implements GLEventListener { +public class Main implements GLEventListener, MouseListener, MouseMotionListener, KeyListener, MouseWheelListener { + + boolean alt = false; + boolean shift = false; + boolean control = false; - private Geom geom = new Geom(); + public void mouseWheelMoved(MouseWheelEvent e) { + tz -= e.getWheelRotation() ; + } + + public void keyTyped(KeyEvent e) { } + public void keyPressed(KeyEvent e) { + switch(e.getKeyCode()) { + case KeyEvent.VK_CONTROL: control = true; break; + case KeyEvent.VK_ALT: alt = true; break; + case KeyEvent.VK_SHIFT: shift = true; break; + } + } + public void keyReleased(KeyEvent e) { + switch(e.getKeyCode()) { + case KeyEvent.VK_CONTROL: control = false; break; + case KeyEvent.VK_ALT: alt = false; break; + case KeyEvent.VK_SHIFT: shift = false; break; + } + } + + public void mouseClicked(MouseEvent e) { } + public void mouseEntered(MouseEvent e) { } + public void mouseExited(MouseEvent e) { } + public void mousePressed(MouseEvent e) { } + public void mouseReleased(MouseEvent e) { } + + int mousex; + int mousey; + public void mouseMoved(MouseEvent e) { + mousex = e.getX(); + mousey = e.getY(); + } + + float tx = 0; + float ty = 0; + float tz = 0; + float anglex = 0; + float angley = 0; + public void mouseDragged(MouseEvent e) { + if (shift) { + tx += (mousex - e.getX())/(float)20; + ty += (mousey - e.getY())/(float)20; + } else { + anglex -= mousex - e.getX(); + angley += mousey - e.getY(); + } + mousex = e.getX(); + mousey = e.getY(); + } + + private Geom tile = new Geom(); + private Geom goal = new Geom(); /** magnification factor */ private static final float MAG = 1; - Geom.V[] translations; - Geom.P[] points; + Geom.M[] translations; + Geom.V[] points; public Main(StlFile stlf) { - Geom.P ltf = geom.newP(-0.2, 0.1, 0.1); - Geom.P mtf = geom.newP( 0.0, 0.1, 0.1); - Geom.P rtf = geom.newP( 0.2, 0.1, 0.1); - Geom.P ltn = geom.newP(-0.2, 0.1, -0.1); - Geom.P mtn = geom.newP( 0.0, 0.1, -0.1); - Geom.P rtn = geom.newP( 0.2, 0.1, -0.1); - Geom.P lbf = geom.newP(-0.2, -0.1, 0.1); - Geom.P mbf = geom.newP( 0.0, -0.1, 0.1); - Geom.P rbf = geom.newP( 0.2, -0.1, 0.1); - Geom.P lbn = geom.newP(-0.2, -0.1, -0.1); - Geom.P mbn = geom.newP( 0.0, -0.1, -0.1); - Geom.P rbn = geom.newP( 0.2, -0.1, -0.1); + for(int i=0; i 300) return; + //double min = (tile.avgedge/tile.numedges)*(1+(4/(double)verts)); + //if (verts>0 && tile.es.peek().length() < min) return; + PriorityQueue es = new PriorityQueue(); + for(Geom.E e : tile.es) es.add(e); + for(int i=0; i<10; i++) { + Geom.E e = es.poll(); + verts++; + System.out.println("shatter " + e); + e.shatter(); + tile.unbind(); + tile.bind(); } - */ - + } + public synchronized void rand(double temperature, Geom.V p) { + double tile_score = tile.score(); + double goal_score = goal.score(); + + p.rescore(); + //if (p.watch==null) return; + float r1 = Math.abs(random.nextFloat()); + r1 = r1 - (float)Math.floor(r1); + r1 = r1 * (float)0.01; + r1 = r1 - (float)0.005; + Geom.Vec v = p.watchback().p.minus(p.p).norm().times(r1); + + //v = p.norm().times(v.dot(p.norm())); + + boolean aspect = false;//(Math.abs(random.nextInt()) % 100) <= 2; + Geom.M old_tile_aspect = null;//goal.aspect; + boolean good = true; + if (aspect) { + /* + v = v.times(10); + tile.aspect = tile.new M(tile.aspect.a / (v.x+1), tile.aspect.f / (v.y+1), tile.aspect.k / (v.z+1)); + tile.invaspect = tile.new M(1/tile.aspect.a, 1/tile.aspect.f, 1/tile.aspect.k); + goal.rescore(); + tile.rescore(); + */ + } else { + good = p.move(v); + } + double new_tile_score = tile.score(); + double new_goal_score = goal.score(); + double tile_delta = new_tile_score - tile_score; + double goal_delta = new_goal_score - goal_score; + double delta = tile_delta + goal_delta; + double swapProbability = Math.exp((-1 * delta) / temperature); + //boolean doSwap = Math.random() < swapProbability; + boolean doSwap = good && (tile_delta <= 0 && goal_delta <= 0); + if (doSwap) { + tile_score = new_tile_score; + goal_score = new_goal_score; + //System.out.println("score: " + tile_score + " / " + goal_score); + if (aspect) System.out.println("aspect " + v); + } else { + if (aspect) { + //tile.aspect = old_tile_aspect; + //tile.invaspect = tile.new M(1/tile.aspect.a, 1/tile.aspect.f, 1/tile.aspect.k); + goal.rescore(); + tile.rescore(); + } else { + p.move(v.times(-1)); + } + } } /** @@ -156,81 +309,94 @@ public class Main implements GLEventListener { */ public void init(GLAutoDrawable gld) { GL gl = gld.getGL(); - GLU glu = new GLU(); gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - gl.glClearDepth(1.0); gl.glViewport(0, 0, 500, 300); - gl.glMatrixMode(GL.GL_PROJECTION); gl.glEnable(GL.GL_DEPTH_TEST); + gl.glClearDepth(1.0); gl.glDepthFunc(GL.GL_LEQUAL); - + gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); - gl.glRotatef((float)45, 1, 1, 1); - - //glu.gluOrtho2D(0.0, 500.0, 0.0, 300.0); + gl.glMatrixMode(GL.GL_MODELVIEW); display(gld); } - public static int angle = 0; - public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { } public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) { } - public void display(GLAutoDrawable drawable) { + public synchronized void display(GLAutoDrawable drawable) { GL gl = drawable.getGL(); + GLU glu = new GLU(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glPointSize(5.0f); gl.glLoadIdentity(); - gl.glRotatef(angle, 1, 1, 1); + glu.gluPerspective(50-tz, ((float)drawable.getWidth())/drawable.getHeight(), 0.5, 10); + glu.gluLookAt(0, 0, -1, 0, 0, 0, 0, 1, 0); + gl.glTranslatef(tx/(float)20, ty/(float)20, 0); + gl.glRotatef(anglex/3, 0, 1, 0); + gl.glRotatef(angley/3, 1, 0, 0); + + gl.glBegin(GL.GL_TRIANGLES); + draw(gl, true, tile); + gl.glEnd(); gl.glBegin(GL.GL_TRIANGLES); - draw(gl, true); + gl.glColor4f((float)0.5, (float)0.5, (float)0.5, (float)0.8); + //draw(gl, false, goal); gl.glEnd(); - /* - for(Geom.V v1 : translations) { - if (v1.z==0 && v1.y==0) continue; - Geom.V v = v1.times((float)1.1); + + + int i = 0; + //gl.glDisable(GL.GL_DEPTH_TEST); + gl.glColor4f(1,1,1,1); + for(Geom.M m : translations) { + //if (v1.z==0 && v1.y==0) continue; + i++; + if (i != 1 /*&& i!=4*/) continue; + Geom.V p = tile.newP(0, 0, 0).times(m).register(); + Geom.Vec v = tile.new Vec(p.p.x, p.p.y, p.p.z); + v = v.times((float)1.04); gl.glTranslatef(v.x, v.y, v.z); - //draw(gl, false); + draw(gl, false, tile); gl.glTranslatef(-v.x, -v.y, -v.z); } - */ + //gl.glEnable(GL.GL_DEPTH_TEST); } - private void draw(GL gl, boolean triangles) { + private synchronized void draw(GL gl, boolean triangles, Geom mesh) { float red = 0.0f; float green = 0.0f; float blue = 0.0f; - for(Geom.T t : geom) { + for(Geom.T t : mesh) { if (red < 0.15) red = 1.0f; if (green < 0.15) green = 1.0f; if (blue < 0.15) blue = 1.0f; red -= .09f; green -= .12f; blue -= .15f; - gl.glColor3f(red, green, blue); - switch(t.color) { - case 0: gl.glColor3f((float)0.25, (float)0.25, (float)0.75); break; - case 1: gl.glColor3f((float)0.25, (float)0.75, (float)0.25); break; - case 2: gl.glColor3f((float)0.75, (float)0.25, (float)0.25); break; - case 3: gl.glColor3f((float)0.50, (float)0.50, (float)0.50); break; + + if (triangles) switch(t.color) { + case 0: gl.glColor4f((float)0.25, (float)0.25, (float)0.75, (float)0.3); break; + case 1: gl.glColor4f((float)0.25, (float)0.75, (float)0.25, (float)0.3); break; + case 2: gl.glColor4f((float)0.75, (float)0.25, (float)0.25, (float)0.3); break; + case 3: gl.glColor4f((float)0.50, (float)0.50, (float)0.50, (float)0.3); break; } //gl.glBegin(GL.GL_LINES); + if (triangles) { gl.glBegin(GL.GL_TRIANGLES); t.glVertices(gl); gl.glEnd(); } else { gl.glBegin(GL.GL_LINES); - t.e1().p1.glVertex(gl); - t.e1().p2.glVertex(gl); - t.e2().p1.glVertex(gl); - t.e2().p2.glVertex(gl); - t.e3().p1.glVertex(gl); - t.e3().p2.glVertex(gl); + t.e1().p1.p.glVertex(gl); + t.e1().p2.p.glVertex(gl); + t.e2().p1.p.glVertex(gl); + t.e2().p2.p.glVertex(gl); + t.e3().p1.p.glVertex(gl); + t.e3().p2.p.glVertex(gl); gl.glEnd(); } - Geom.P centroid = t.centroid(); + Geom.V centroid = t.centroid().register(); gl.glBegin(GL.GL_LINES); gl.glColor3f(1, 1, 1); /* @@ -238,12 +404,13 @@ public class Main implements GLEventListener { centroid.plus(t.norm().times(t.diameter())).glVertex(gl); */ - t.p1().glVertex(gl); - t.p1().plus(t.p1().norm().times(t.diameter())).glVertex(gl); - t.p2().glVertex(gl); - t.p2().plus(t.p2().norm().times(t.diameter())).glVertex(gl); - t.p3().glVertex(gl); - t.p3().plus(t.p3().norm().times(t.diameter())).glVertex(gl); + if (mesh==goal) + for(Geom.V p : new Geom.V[] { t.p1(), t.p2(), t.p3() }) { + p.p.glVertex(gl); + //p.plus(p.norm().times(p.score()*10)).glVertex(gl); + p.partner().p.glVertex(gl); + //tile.nearest(p).centroid().glVertex(gl); + } gl.glEnd(); @@ -252,7 +419,7 @@ public class Main implements GLEventListener { public static void main(String[] s) throws Exception { StlFile stlf = new StlFile(); - stlf.load("teapot.stl"); + stlf.load("simplefish.stl"); Main main = new Main(stlf); Frame f = new Frame(); GLCapabilities glcaps = new GLCapabilities(); @@ -264,11 +431,30 @@ public class Main implements GLEventListener { f.setSize(900, 900); f.doLayout(); + glcanvas.addMouseListener(main); + glcanvas.addMouseMotionListener(main); + glcanvas.addMouseWheelListener(main); + glcanvas.addKeyListener(main); + + main.anneal(glcanvas); + } + public static int verts = 0; + public void anneal(GLCanvas glcanvas) throws Exception { + int verts = 0; while(true) { - Thread.sleep(100); - angle+=5; - glcanvas.repaint(); - } + //Thread.sleep(10); + for(int i=0; i<1; i++) { + glcanvas.repaint(); + //tile.ts.get(Math.abs(random.nextInt()) % tile.ts.size()).e1().p1 + for(Geom.T t : tile) + for(Geom.V p : new Geom.V[] { t.p1(), t.p2(), t.p3() }) { + rand(10,p); + } + goal.rescore(); + tile.rescore(); + } + breakit(); + } }