import processing.opengl.*; public static final class Point { public float x,y,z; public float vx,vy,vz; public float ax,ay,az; public float nx,ny,nz; public float weight=0.01f; public Point(float x_in, float y_in, float z_in) { x=x_in; y=y_in; z=z_in; } } public static final class Link { final int a,b; final float gap; public Link(int a_in, int b_in) { a=a_in; b=b_in; Point pa=points[a_in]; Point pb=points[b_in]; float dx=pa.x-pb.x; float dy=pa.y-pb.y; float dz=pa.z-pb.z; gap=(float)Math.sqrt(dx*dx+dy*dy+dz*dz); } } public static final class Triangle { final int a,b,c; public Triangle(int a_in, int b_in, int c_in) { a=a_in; b=b_in; c=c_in; } } static Point[] points; static Link[] links; static Triangle[] triangles; void setup() { size(640,480,OPENGL); stroke(155,0,0); addMouseWheelListener(new java.awt.event.MouseWheelListener() { public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) { // zoom=Math.max(8,zoom*(8+evt.getWheelRotation())>>3); }}); // generate_resources(); reset(); } static void reset() { final int gsize=32; final int wi = 8; points=new Point[wi*wi]; links=new Link[wi*(wi-1)*2+(wi-1)*(wi-1)*2]; triangles=new Triangle[(wi-1)*(wi-1)*2]; for (int y=0,i=0,l=0,t=0;y0) { links[l++]=new Link(i,i-1); } if (y>0) { links[l++]=new Link(i,i-wi); if (x>0) { links[l++]=new Link(i-wi-1,i); links[l++]=new Link(i-wi,i-1); triangles[t++]=new Triangle(i-wi-1,i-wi,i-1); triangles[t++]=new Triangle(i-1,i-wi,i); } } } } //Fixed points points[0].weight=0; points[wi-1].weight=0; } //Wind static float wx=0,wy=0; //Rotation static float rx=0,rz=0; public void update() { if (mousePressed) { if (mouseButton==LEFT) { wx=(mouseX-(width>>1))/10f; wy=(mouseY-(height>>1))/10f; } else if (mouseButton==RIGHT) { rx=mouseY/40f; rz=mouseX/40f; } } for (int pi=0;pi0) { pa.ax+=dx*motion; pa.ay+=dy*motion; pa.az+=dz*motion; } if (pb.weight>0) { pb.ax-=dx*motion; pb.ay-=dy*motion; pb.az-=dz*motion; } } final float friction = 0.95f; for (int pi=0;pi>1,height>>1,0); rotateX(rx); rotateY(rz); beginShape(TRIANGLES); for (int ti=0;ti