From a3aad0bab8b523ead43362277b5d04a14e178cfb Mon Sep 17 00:00:00 2001 From: adam Date: Sat, 1 Dec 2007 18:58:21 -0800 Subject: [PATCH] checkpoint darcs-hash:20071202025821-5007d-ad60c67e86e6e3a1dedf7035155c40b3c0f53c90.gz --- src/Geom.java | 34 +++++++++++------- src/Main.java | 110 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 115 insertions(+), 29 deletions(-) diff --git a/src/Geom.java b/src/Geom.java index 42abd82..316e334 100644 --- a/src/Geom.java +++ b/src/Geom.java @@ -198,26 +198,36 @@ public class Geom implements Iterable { public E bound_to = this; - public M bound_m = new M(); public void bind(E e) { bind(e, new M()); } - public void bind(E e2, M m) { - E e1 = this; - while(e1.bound_to != e1) e1 = e1.bound_to; - while(e2.bound_to != e2) e2 = e2.bound_to; - e1.bound_to = e2; + public void bind(E e, M m) { + E old = this.bound_to; + this.bound_to = e.bound_to; + e.bound_to = old; } public void dobind() { - if (bound_to == this) return; - E ex = this; - M m = new M(); - while(ex.bound_to != ex) { m = m.times(ex.bound_m); ex = ex.bound_to; } - p1.bind(ex.bound_to.p1); - p2.bind(ex.bound_to.p2); + for(E ex = bound_to; ex != this; ex = ex.bound_to) { + p1.bind(ex.p1); + p2.bind(ex.p2); + } } + public boolean destroyed = false; public void shatter() { + if (destroyed) return; + /* + HashSet eh = new HashSet(); + eh.add(this); + for(E ex = bound_to; ex != this; ex = ex.bound_to) eh.add(ex); + E[] es = (E[])eh.toArray(new E[0]); + */ + destroy(); + pair.shatter(); + for(E ex = bound_to; ex != this; ex = ex.bound_to) ex.shatter(); + } + public void destroy() { + this.destroyed = true; } private void sync() { diff --git a/src/Main.java b/src/Main.java index 4e4dc86..7830f5c 100644 --- a/src/Main.java +++ b/src/Main.java @@ -3,10 +3,65 @@ 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 -public class Main implements GLEventListener { +public class Main implements GLEventListener, MouseListener, MouseMotionListener, KeyListener, MouseWheelListener { + + boolean alt = false; + boolean shift = false; + boolean control = false; + + 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 geom = new Geom(); @@ -135,7 +190,10 @@ public class Main implements GLEventListener { t.e3().dobind(); } - mtf.move(geom.new V(0, (float)-0.05, (float)0.00)); + for(int i=0; i<100; i++) { + rand(); + } + /* @@ -150,50 +208,63 @@ public class Main implements GLEventListener { } + Random random = new Random(); + + public void rand() { + int which = Math.abs(random.nextInt()) % points.length; + float r1 = Math.abs(random.nextFloat()); + r1 = r1 - (float)Math.floor(r1); + r1 = r1 * (float)0.01; + r1 = r1 - (float)0.005; + switch(Math.abs(random.nextInt()) % 3) { + case 0: points[which].move(geom.new V((float)0, (float)r1, (float)0.00)); break; + case 1: points[which].move(geom.new V((float)r1, (float)0, (float)0.00)); break; + case 2: points[which].move(geom.new V((float)0, (float)0, (float)r1)); break; + } + } /** * Take care of initialization here. */ 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.glLoadIdentity(); - gl.glRotatef((float)45, 1, 1, 1); - //glu.gluOrtho2D(0.0, 500.0, 0.0, 300.0); 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) { 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, 0, 1, 0); + gl.glRotatef(angley, 1, 0, 0); gl.glBegin(GL.GL_TRIANGLES); draw(gl, true); gl.glEnd(); - /* + for(Geom.V v1 : translations) { if (v1.z==0 && v1.y==0) continue; Geom.V v = v1.times((float)1.1); gl.glTranslatef(v.x, v.y, v.z); - //draw(gl, false); + draw(gl, false); gl.glTranslatef(-v.x, -v.y, -v.z); } - */ + } private void draw(GL gl, boolean triangles) { @@ -237,14 +308,14 @@ public class Main implements GLEventListener { centroid.glVertex(gl); 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); - + */ gl.glEnd(); } @@ -264,11 +335,16 @@ public class Main implements GLEventListener { f.setSize(900, 900); f.doLayout(); + glcanvas.addMouseListener(main); + glcanvas.addMouseMotionListener(main); + glcanvas.addMouseWheelListener(main); + glcanvas.addKeyListener(main); + while(true) { Thread.sleep(100); - angle+=5; glcanvas.repaint(); - } + main.rand(); + } } -- 1.7.10.4