//P2a - Eric Withrow //point class inspired by Professor Jarek Rossignac color blue = color(10, 10, 200); color white = color(250, 250, 250); float[] vx = new float [5000]; // corner table float[] vy = new float [5000]; float[] vz = new float [5000]; float xr, yr = 0; // mouse coordinates relative to center of window int pa=0, da=0, oa=0; void setup() { size(800, 600, P3D); String [] ss = loadStrings("caplet_612poly.stl"); String line; int space1, space2, space3; float v1, v2, v3; int index = 0; for(int t = 3; t < ss.length; t+=7) { for(int v = t; v < t + 3; v++) { line = ss[v]; space1 = line.indexOf(' ', 7); space2 = line.indexOf(' ', space1+1); space3 = line.indexOf(' ', space2+1); v1 = new Float(line.substring(space1,space2).trim()).floatValue(); v2 = new Float(line.substring(space2,space3).trim()).floatValue(); v3 = new Float(line.substring(space3).trim()).floatValue(); vx[index] = v1; vy[index] = v2; vz[index] = v3; index++; } } System.gc(); } void draw() { float w=float(width); float h=float(height); // window sizes background(white); // paint a white background lights(); // turn on ambient lighting translate(w/2, h/2, 0.0); // center view wrt window xr = (mouseX/w-0.5) * TWO_PI; yr = (mouseY/h-0.5) * TWO_PI; translate(0,-200,da); rotateX(-yr/2); rotateY(xr); fill(blue); noStroke(); beginShape(TRIANGLES); for(int i = 0; i < 612*3; i++) { vertex(100*vx[i],100* vy[i], 100*vz[i]); } endShape(); } //key control void keyPressed() { if (key=='+' || key=='=') { da += 30; } if (key=='_' || key=='-') { da -= 30; } } //************************************** // **** POINTS AND VECTOR CLASSES (modified for 3D by Eric Withrow) class pt { float x,y,z; pt (float px, float py, float pz) {x = px; y = py; z = pz;}; pt make() {return(new pt(x,y,z));}; void show(int r) { pushMatrix(); translate(x,y,z); noStroke(); sphere(r); popMatrix();}; //void showLineTo (pt P) {line(x,y,P.x,P.y); }; void setToPoint(pt P) { x = P.x; y = P.y; z = P.z;}; void setTo (float px, float py, float pz) {x = px; y = py; z = pz;}; void setToMouse() { x = mouseX; y = mouseY; z = 0; }; void write() {println("("+x+","+y+","+z+")");}; void addVec(vec V) {x += V.x; y += V.y; z += V.z;}; void addScaledVec(float s, vec V) {x += s*V.x; y += s*V.y; z += s*V.z;}; void subVec(vec V) {x -= V.x; y -= V.y; z -= V.z;}; void vert() {vertex(x,y,z);}; boolean isInWindow(int width, int height) {return(((x<0)||(x>width)||(y<0)||(y>height)));}; void label(String s, vec D) {text(s, x+D.x, y+D.y, z+D.z); }; vec vecTo(pt P) {return(new vec(P.x-x,P.y-y,P.z-z)); }; float disTo(pt P) {return(sqrt(sq(P.x-x)+sq(P.y-y)+sq(P.z-z))); }; vec vecToMid(pt P, pt Q) {return(new vec((P.x+Q.x)/2.0-x, (P.y+Q.y)/2.0-y,(P.z+Q.z)/2.0-z)); }; vec vecToProp (pt B, pt D) { vec CB = this.vecTo(B); float LCB = CB.norm(); vec CD = this.vecTo(D); float LCD = CD.norm(); vec U = CB.make(); vec V = CD.make(); V.sub(U); V.mul(LCB/(LCB+LCD)); U.add(V); return(U); }; void addPt(pt P) {x+=P.x; y+=P.y; z+=P.z;}; void subPt(pt P) {x-=P.x; y-=P.y; z-=P.z;}; void mul(float f) {x*=f; y*=f; z*=f;}; //void pers(float d) { y=d*y/(d+x); x=d*x/(d+x); }; WHAT DO THESE DO? //void pers2(float d) { y=d*y/(d+x); }; } class vec { float x,y,z; vec (float px, float py, float pz) {x = px; y = py; z = pz;}; void setTo (float px, float py, float pz) {x = px; y = py; z = pz;}; vec make() {return(new vec(x,y,z));}; //void show (pt P) { pt.show(3); line(P.x,P.y,P.x+x,P.y+y); }; //line part doesnt work for 3d void add(vec V) {x += V.x; y += V.y; z += V.z;}; void addScaled(float m, vec V) {x += m*V.x; y += m*V.y; z += m*V.z;}; void sub(vec V) {x -= V.x; y -= V.y; z -= V.z;}; void mul(float m) {x *= m; y *= m; z *= m;}; void div(float m) {x /= m; y /= m; z /= m;}; void write() {println("("+x+","+y+","+z+")");}; float norm() {return(sqrt(sq(x)+sq(y)+sq(z)));}; void unit() {float n=sqrt(sq(x)+sq(y)+sq(z)); if (n>0.0001) {x/=n; y/=n; z/=n;};}; //void left() {float w=x; x=-y; y=w;}; ???? void back() {x= -this.x; y= -this.y; z= -this.z;}; } pt midPt(pt A, pt B) {return(new pt((A.x+B.x)/2,(A.y+B.y)/2,(A.z+B.z)/2)); }; vec midVec(vec U, vec V) {return(new vec((U.x+V.x)/2,(U.y+V.y)/2,(U.z+V.z)/2)); }; float dot(vec U, vec V) {return(U.x*V.x+U.y*V.y+U.z*V.z); };