class Cube{ /* 1-----2 /| /| 4-----3 | | 5---|-6 |/ |/ 8-----7 */ float v1, v2, v3, v4, v5, v6, v7, v8; // 8 points float cx, cy, cz; // center coordinates float sx, sy, sz; // scale float threshold; float f12, f14, f15, f23, f26, f34, f37, f48, f56, f58, f67, f78; Tetrahedron[] tetrahedrons; final Vec3D p1 = new Vec3D(0,0,0); final Vec3D p2 = new Vec3D(1,0,0); final Vec3D p3 = new Vec3D(1,0,1); final Vec3D p4 = new Vec3D(0,0,1); final Vec3D p5 = new Vec3D(0,1,0); final Vec3D p6 = new Vec3D(1,1,0); final Vec3D p7 = new Vec3D(1,1,1); final Vec3D p8 = new Vec3D(0,1,1); int type; Cube(){ tetrahedrons = new Tetrahedron[6]; for(int i=0;i<6;i++){ tetrahedrons[i] = new Tetrahedron(); } set(random(0f,1f), random(0f,1f),random(0f,1f),random(0f,1f),random(0f,1f),random(0f,1f),random(0f,1f),random(0f,1f), 0f, 0f, 0f,200f,200f,200f,.5f); } Cube(float v1, float v2,float v3,float v4,float v5, float v6,float v7,float v8,float cx,float cy, float cz, float sx,float sy, float sz, float t){ tetrahedrons = new Tetrahedron[6]; for(int i=0;i<6;i++){ tetrahedrons[i] = new Tetrahedron(); } set(v1, v2,v3,v4,v5,v6,v7,v8, cx, cy, cz, sx, sy, sz, t); } void set(float v1, float v2,float v3,float v4,float v5, float v6,float v7,float v8,float cx,float cy, float cz, float sx, float sy, float sz, float t){ this.v1 = v1; this.v2 = v2; this.v3 = v3; this.v4 = v4; this.v5 = v5; this.v6 = v6; this.v7 = v7; this.v8 = v8; this.cx=cx; this.cy=cy; this.cz=cz; this.sx=sx; this.sy=sy; this.sz=sz; threshold=t; type = determineType(); if ((type!=0)&&(type!=255)){ tetrahedrons[0].set(p1,p3,p4,p5,v1,v3,v4,v5,threshold); tetrahedrons[1].set(p1,p2,p3,p5,v1,v2,v3,v5,threshold); tetrahedrons[2].set(p5,p8,p7,p3,v5,v8,v7,v3,threshold); tetrahedrons[3].set(p5,p7,p6,p3,v5,v7,v6,v3,threshold); tetrahedrons[4].set(p4,p3,p8,p5,v4,v3,v8,v5,threshold); tetrahedrons[5].set(p2,p3,p6,p5,v2,v3,v6,v5,threshold); calculateInterpolation(); } } int determineType(){ int result=0; if(v1>threshold) result+=1; if(v2>threshold) result+=2; if(v3>threshold) result+=4; if(v4>threshold) result+=8; if(v5>threshold) result+=16; if(v6>threshold) result+=32; if(v7>threshold) result+=64; if(v8>threshold) result+=128; return result; } void calculateInterpolation(){ f12=determineFactor(v1,v2,threshold); f14=determineFactor(v1,v4,threshold); f15=determineFactor(v1,v5,threshold); f23=determineFactor(v2,v3,threshold); f26=determineFactor(v2,v6,threshold); f34=determineFactor(v3,v4,threshold); f37=determineFactor(v3,v7,threshold); f48=determineFactor(v4,v8,threshold); f56=determineFactor(v5,v6,threshold); f58=determineFactor(v5,v8,threshold); f67=determineFactor(v6,v7,threshold); f78=determineFactor(v7,v8,threshold); } float determineFactor(float ll, float ul, float t){ if(abs(ul-ll)<0.001f) return 0.5f; return constrain((t-ll)/(ul-ll),0f,1f); } void drawFace(int type){ if(type<128){ switch(type){ case 0: break; case 1: vertex(f12,0,0); vertex(0,f15,0); vertex(0,0,f14); break; case 2: vertex(f12,0,0); vertex(1,f26,0); vertex(1,0,f23); break; case 4: vertex(1-f34,0,1); vertex(1,f37,1); vertex(1,0,f23); break; case 8: vertex(1-f34,0,1); vertex(0,f48,1); vertex(0,0,f14); break; case 16: vertex(f56,1,0); vertex(0,f15,0); vertex(0,1,f58); break; case 32: vertex(f56,1,0); vertex(1,f26,0); vertex(1,1,f67); break; case 64: vertex(1-f78,1,1); vertex(1,f37,1); vertex(1,1,f67); break; case 127: vertex(1-f78,1,1); vertex(0,f48,1); vertex(0,1,f58); break; case 3: vertex(0,0,f14); vertex(1,0,f23); vertex(0,f15,0); vertex(1,0,f23); vertex(1,f26,0); vertex(0,f15,0); break; case 12: vertex(0,0,f14); vertex(1,0,f23); vertex(0,f48,1); vertex(1,0,f23); vertex(1,f37,1); vertex(0,f48,1); break; case 48: vertex(0,1,f58); vertex(1,1,f67); vertex(0,f15,0); vertex(1,1,f67); vertex(1,f26,0); vertex(0,f15,0); break; case 63: vertex(0,1,f58); vertex(1,1,f67); vertex(0,f48,1); vertex(1,1,f67); vertex(1,f37,1); vertex(0,f48,1); break; case 9: vertex(f12,0,0); vertex(1-f34,0,1); vertex(0,f48,1); vertex(0,f48,1); vertex(0,f15,0); vertex(f12,0,0); break; case 6: vertex(f12,0,0); vertex(1,f26,0); vertex(1,f37,1); vertex(1,f37,1); vertex(1-f34,0,1); vertex(f12,0,0); break; case 111: vertex(f56,1,0); vertex(1-f78,1,1); vertex(0,f48,1); vertex(0,f48,1); vertex(0,f15,0); vertex(f56,1,0); break; case 96: vertex(f56,1,0); vertex(1,f26,0); vertex(1,f37,1); vertex(1,f37,1); vertex(1-f78,1,1); vertex(f56,1,0); break; case 17: vertex(0,0,f14); vertex(f12,0,0); vertex(f56,1,0); vertex(f56,1,0); vertex(0,1,f58); vertex(0,0,f14); break; case 68: vertex(1,0,f23); vertex(1-f34,0,1); vertex(1-f78,1,1); vertex(1-f78,1,1); vertex(1,1,f67); vertex(1,0,f23); break; case 34: vertex(1,0,f23); vertex(f12,0,0); vertex(f56,1,0); vertex(f56,1,0); vertex(1,1,f67); vertex(1,0,f23); break; case 119: vertex(0,0,f14); vertex(1-f34,0,1); vertex(1-f78,1,1); vertex(1-f78,1,1); vertex(0,1,f58); vertex(0,0,f14); break; case 15: vertex(0,f15,0); vertex(1,f26,0); vertex(1,f37,1); vertex(1,f37,1); vertex(0,f48,1); vertex(0,f15,0); break; case 102: vertex(f12,0,0); vertex(1-f34,0,1); vertex(1-f78,1,1); vertex(1-f78,1,1); vertex(f56,1,0); vertex(f12,0,0); break; case 51: vertex(0,0,f14); vertex(0,1,f58); vertex(1,1,f67); vertex(1,1,f67); vertex(1,0,f23); vertex(0,0,f14); break; case 7: vertex(0,f15,0); vertex(1,f26,0); vertex(1,f37,1); vertex(1,f37,1); vertex(0,f15,0); vertex(0,0,f14); vertex(0,0,f14); vertex(1-f34,0,1); vertex(1,f37,1); break; case 112: vertex(0,f15,0); vertex(1,f26,0); vertex(1,f37,1); vertex(1,f37,1); vertex(0,f15,0); vertex(0,1,f58); vertex(0,1,f58); vertex(1-f78,1,1); vertex(1,f37,1); break; case 11: vertex(0,f15,0); vertex(1,f26,0); vertex(0,f48,1); vertex(0,f48,1); vertex(1-f34,0,1); vertex(1,0,f23); vertex(1,0,f23); vertex(1,f26,0); vertex(0,f48,1); break; case 79: vertex(0,f15,0); vertex(1,f26,0); vertex(0,f48,1); vertex(0,f48,1); vertex(1-f78,1,1); vertex(1,1,f67); vertex(1,1,f67); vertex(1,f26,0); vertex(0,f48,1); break; case 13: vertex(0,f48,1); vertex(1,f37,1); vertex(0,f15,0); vertex(0,f15,0); vertex(f12,0,0); vertex(1,0,f23); vertex(1,0,f23); vertex(1,f37,1); vertex(0,f15,0); break; case 47: vertex(0,f48,1); vertex(1,f37,1); vertex(0,f15,0); vertex(0,f15,0); vertex(f56,1,0); vertex(1,1,f67); vertex(1,1,f67); vertex(1,f37,1); vertex(0,f15,0); break; case 14: vertex(0,f48,1); vertex(1,f37,1); vertex(1,f26,0); vertex(1,f26,0); vertex(f12,0,0); vertex(0,0,f14); vertex(0,0,f14); vertex(0,f48,1); vertex(1,f26,0); break; case 31: vertex(0,f48,1); vertex(1,f37,1); vertex(1,f26,0); vertex(1,f26,0); vertex(f56,1,0); vertex(0,1,f58); vertex(0,1,f58); vertex(0,f48,1); vertex(1,f26,0); break; case 25: vertex(1-f34,0,1); vertex(f12,0,0); vertex(f56,1,0); vertex(f56,1,0); vertex(0,1,f58); vertex(0,f48,1); vertex(0,f48,1); vertex(f56,1,0); vertex(1-f34,0,1); break; case 38: vertex(1-f34,0,1); vertex(f12,0,0); vertex(f56,1,0); vertex(f56,1,0); vertex(1,1,f67); vertex(1,f37,1); vertex(1,f37,1); vertex(f56,1,0); vertex(1-f34,0,1); break; case 118: vertex(1-f34,0,1); vertex(f12,0,0); vertex(1-f78,1,1); vertex(1-f78,1,1); vertex(0,1,f58); vertex(0,f15,0); vertex(0,f15,0); vertex(1-f78,1,1); vertex(f12,0,0); break; case 110: vertex(f12,0,0); vertex(f56,1,0); vertex(1-f78,1,1); vertex(1-f78,1,1); vertex(0,f48,1); vertex(0,0,f14); vertex(0,0,f14); vertex(1-f78,1,1); vertex(f12,0,0); break; case 98: vertex(f12,0,0); vertex(f56,1,0); vertex(1-f78,1,1); vertex(1-f78,1,1); vertex(1,f37,1); vertex(1,0,f23); vertex(1,0,f23); vertex(1-f78,1,1); vertex(f12,0,0); break; case 103: vertex(1-f34,0,1); vertex(1-f78,1,1); vertex(f56,1,0); vertex(f56,1,0); vertex(0,f15,0); vertex(1-f34,0,1); vertex(1-f34,0,1); vertex(0,0,f14); vertex(0,f15,0); break; case 100: vertex(1-f34,0,1); vertex(1-f78,1,1); vertex(f56,1,0); vertex(f56,1,0); vertex(1,f26,0); vertex(1-f34,0,1); vertex(1-f34,0,1); vertex(1,0,f23); vertex(1,f26,0); break; case 35: vertex(0,0,f14); vertex(1,0,f23); vertex(1,1,f67); vertex(1,1,f67); vertex(f56,1,0); vertex(0,f15,0); vertex(0,f15,0); vertex(0,0,f14); vertex(1,1,f67); break; case 76: vertex(0,0,f14); vertex(1,0,f23); vertex(1,1,f67); vertex(1,1,f67); vertex(1-f78,1,1); vertex(0,f48,1); vertex(0,f48,1); vertex(0,0,f14); vertex(1,1,f67); break; case 19: vertex(0,0,f14); vertex(1,0,f23); vertex(0,1,f58); vertex(0,1,f58); vertex(f56,1,0); vertex(1,f26,0); vertex(1,f26,0); vertex(1,0,f23); vertex(0,1,f58); break; case 115: vertex(0,0,f14); vertex(1,0,f23); vertex(0,1,f58); vertex(0,1,f58); vertex(1-f78,1,1); vertex(1,f37,1); vertex(1,f37,1); vertex(1,0,f23); vertex(0,1,f58); break; case 49: vertex(0,0,f14); vertex(0,1,f58); vertex(1,1,f67); vertex(1,1,f67); vertex(0,0,f14); vertex(1,f26,0); vertex(1,f26,0); vertex(f12,0,0); vertex(0,0,f14); break; case 55: vertex(0,0,f14); vertex(0,1,f58); vertex(1,1,f67); vertex(1,1,f67); vertex(0,0,f14); vertex(1,f37,1); vertex(1,f37,1); vertex(1-f34,0,1); vertex(0,0,f14); break; case 50: vertex(0,1,f58); vertex(1,1,f67); vertex(1,0,f23); vertex(1,0,f23); vertex(f12,0,0); vertex(0,f15,0); vertex(0,f15,0); vertex(1,0,f23); vertex(0,1,f58); break; case 59: vertex(0,1,f58); vertex(1,1,f67); vertex(1,0,f23); vertex(1,0,f23); vertex(1-f34,0,1); vertex(0,f48,1); vertex(0,f48,1); vertex(1,0,f23); vertex(0,1,f58); break; case 27: vertex(1-f34,0,1); vertex(0,f48,1); vertex(0,1,f58); vertex(0,1,f58); vertex(1-f34,0,1); vertex(1,0,f23); vertex(1,0,f23); vertex(0,1,f58); vertex(f56,1,0); vertex(f56,1,0); vertex(1,0,f23); vertex(1,f26,0); break; case 39: vertex(0,0,f14); vertex(0,f15,0); vertex(1-f34,0,1); vertex(1-f34,0,1); vertex(0,f15,0); vertex(1,f37,1); vertex(1,f37,1); vertex(0,f15,0); vertex(f56,1,0); vertex(f56,1,0); vertex(1,1,f67); vertex(1,f37,1); break; case 78: vertex(0,0,f14); vertex(0,f48,1); vertex(1-f78,1,1); vertex(1-f78,1,1); vertex(0,0,f14); vertex(1,1,f67); vertex(1,1,f67); vertex(0,0,f14); vertex(f12,0,0); vertex(f12,0,0); vertex(1,1,f67); vertex(1,f26,0); break; case 114: vertex(0,1,f58); vertex(1-f78,1,1); vertex(1,f37,1); vertex(1,f37,1); vertex(0,1,f58); vertex(0,f15,0); vertex(0,f15,0); vertex(1,f37,1); vertex(1,0,f23); vertex(1,0,f23); vertex(0,f15,0); vertex(f12,0,0); break; case 116: vertex(0,1,f58); vertex(1-f78,1,1); vertex(0,f15,0); vertex(0,f15,0); vertex(1-f78,1,1); vertex(1-f34,0,1); vertex(0,f15,0); vertex(1-f34,0,1); vertex(1,0,f23); vertex(1,0,f23); vertex(1,f26,0); vertex(0,f15,0); break; case 43: vertex(0,f48,1); vertex(1-f34,0,1); vertex(0,f15,0); vertex(0,f15,0); vertex(1-f34,0,1); vertex(f56,1,0); vertex(f56,1,0); vertex(1-f34,0,1); vertex(1,0,f23); vertex(1,0,f23); vertex(f56,1,0); vertex(1,1,f67); break; case 71: vertex(1,1,f67); vertex(1-f78,1,1); vertex(1,f26,0); vertex(1,f26,0); vertex(1-f78,1,1); vertex(1-f34,0,1); vertex(1,f26,0); vertex(1-f34,0,1); vertex(0,0,f14); vertex(0,0,f14); vertex(0,f15,0); vertex(1,f26,0); break; case 23: vertex(1,f37,1); vertex(1-f34,0,1); vertex(1,f26,0); vertex(1,f26,0); vertex(1-f34,0,1); vertex(f56,1,0); vertex(f56,1,0); vertex(1-f34,0,1); vertex(0,0,f14); vertex(0,0,f14); vertex(f56,1,0); vertex(0,1,f58); break; case 113: vertex(1,f37,1); vertex(f12,0,0); vertex(1,f26,0); vertex(1,f37,1); vertex(f12,0,0); vertex(0,0,f14); vertex(0,0,f14); vertex(0,1,f58); vertex(1,f37,1); vertex(1,f37,1); vertex(1-f78,1,1); vertex(0,1,f58); break; case 57: vertex(0,f48,1); vertex(1-f34,0,1); vertex(0,1,f58); vertex(0,1,f58); vertex(1-f34,0,1); vertex(1,1,f67); vertex(1,1,f67); vertex(1-f34,0,1); vertex(f12,0,0); vertex(f12,0,0); vertex(1,f26,0); vertex(1,1,f67); break; case 77: vertex(0,f48,1); vertex(f12,0,0); vertex(0,f15,0); vertex(0,f48,1); vertex(f12,0,0); vertex(1,0,f23); vertex(1,0,f23); vertex(1,1,f67); vertex(0,f48,1); vertex(0,f48,1); vertex(1-f78,1,1); vertex(1,1,f67); break; case 54: vertex(1,f37,1); vertex(1-f34,0,1); vertex(1,1,f67); vertex(1,1,f67); vertex(1-f34,0,1); vertex(0,1,f58); vertex(0,1,f58); vertex(1-f34,0,1); vertex(f12,0,0); vertex(f12,0,0); vertex(0,f15,0); vertex(0,1,f58); break; case 29: vertex(f12,0,0); vertex(1,0,f23); vertex(f56,1,0); vertex(f56,1,0); vertex(1,f37,1); vertex(1,0,f23); vertex(f56,1,0); vertex(1,f37,1); vertex(0,1,f58); vertex(0,1,f58); vertex(1,f37,1); vertex(0,f48,1); break; case 46: vertex(f12,0,0); vertex(0,0,f14); vertex(f56,1,0); vertex(f56,1,0); vertex(0,f48,1); vertex(0,0,f14); vertex(f56,1,0); vertex(0,f48,1); vertex(1,1,f67); vertex(1,1,f67); vertex(0,f48,1); vertex(1,f37,1); break; case 99: vertex(0,0,f14); vertex(1,0,f23); vertex(0,f15,0); vertex(0,f15,0); vertex(1,0,f23); vertex(1,f37,1); vertex(1,f37,1); vertex(0,f15,0); vertex(f56,1,0); vertex(f56,1,0); vertex(1,f37,1); vertex(1-f78,1,1); break; case 108: vertex(0,0,f14); vertex(1,0,f23); vertex(0,f48,1); vertex(0,f48,1); vertex(1,0,f23); vertex(1,f26,0); vertex(1,f26,0); vertex(0,f48,1); vertex(1-f78,1,1); vertex(1-f78,1,1); vertex(1,f26,0); vertex(f56,1,0); break; case 70: vertex(1-f78,1,1); vertex(1-f34,0,1); vertex(f12,0,0); vertex(f12,0,0); vertex(1,f26,0); vertex(1-f78,1,1); vertex(1-f78,1,1); vertex(1,1,f67); vertex(1,f26,0); break; default: drawTetrahedrons(); break; } } else{ drawFace(255-type); } } void draw(boolean hybrid){ if ((type!=0)&&(type!=255)){ pushMatrix(); translate(cx,cy,cz); scale(sx,sy,sz); beginShape(TRIANGLES); translate(-.5f,-.5f,-.5f); if (hybrid){ drawFace(type); } else{ drawTetrahedrons(); } endShape(); popMatrix(); } } void drawTetrahedrons(){ for(int i=0;i<6;i++){ tetrahedrons[i].draw(); } } }