import damkjer.ocd.*; import processing.opengl.*; Snake [] snakes; Vec3D target; void setup () { size(400,400, OPENGL); stroke(255); strokeWeight(5); target = new Vec3D(); target.x = 75; target.y = 75; camera1 = new Camera(this, target.x, target.y, -100, target.x, target.y, target.z); snakes = new Snake[40]; for(int i = 0; i < snakes.length; i++) { snakes[i] = new Snake(); } frameRate(30); } Camera camera1; float arcAngle = 0; void draw() { camera1.feed(); //arcAngle += 0.01; //if(arcAngle > PI*2) arcAngle -= PI*2; camera1.circle(0.01); background(0); pushMatrix(); //rotateX(mouseX/100.f); //translate(width/2, height/2, height/2); for(int i = 0; i < snakes.length; i++) { snakes[i].draw(); } popMatrix(); } class Snake { int length; int pos; int width; int totalLength; int height; int zOffset; float speed; public Snake() { pos = (int)random(400);; width = 100;//(int)random(0, 150); height = 100;//(int)random(0, 150); length = (int)random(0, 50); zOffset = (int)random(0,50); totalLength = (this.width*2)+(this.height*2); speed = random(1, 4); } void draw() { stroke(random(0, 255),random(0, 255),random(0, 255)); pos+=speed; if(pos>totalLength) pos -= totalLength; int startEdge = findEdge(pos); int startOffset = findOffset(pos); int endEdge = findEdge((pos+length)%totalLength); int endOffset = findOffset((pos+length)%totalLength); stroke(255); Vec3D start = findPoint(startEdge, startOffset); Vec3D end = findPoint(endEdge, endOffset); if(startEdge==endEdge) { line(start.x, start.y, start.z, end.x, end.y, end.z); //println(start.x+" "+start.y+ " "+end.x+" " +end.y); } else { // draw to the end of the edge Vec3D edgeEnd = findEdgeEnd(startEdge); line(start.x, start.y, start.z, edgeEnd.x, edgeEnd.y, edgeEnd.z); edgeEnd = findEdgeEnd(mod4(endEdge-1)); line(edgeEnd.x, edgeEnd.y, edgeEnd.z, end.x, end.y, end.z); } } int mod4(int in) { in = in%4; if(in<0) in+=4; // println(in); return in; } Vec3D findEdgeEnd(int edge) { Vec3D p = new Vec3D(); p.z = zOffset; switch(edge) { case 0: p.x = this.width; break; case 1: p.x = this.width; p.y = this.height; break; case 2: p.y = this.height; break; case 3: break; } return p; } Vec3D findPoint(int edge, int offset) { Vec3D p = new Vec3D(); p.z = zOffset; switch(edge) { case 0: // top p.x = offset; break; case 1: // right p.x = this.width; p.y = offset; break; case 2: // bottom p.y = this.height; p.x = this.width - offset; break; case 3: // left p.y = this.height - offset; break; } return p; } int findOffset(int position) { if(position