Hi there, been a while! I’ve made good progress with this but now am in need of some more mathematical wisdom. Code below!
There is a coordinate I need for the black tetrahedron that will sit against the green tetrahedron (0,1,4,9). For the life of me I can’t figure out what the coordinates should be… Any ideas how to find them?
import peasy.*;
PeasyCam cam;
PShape thd;
float s = 60;
float t = 2*sqrt(6)/3;
int alpha = 200;
PVector a = new PVector(s, s, s);
PVector b = new PVector(-s, -s, s);
PVector c = new PVector(-s, s, -s);
PVector d = new PVector(s, -s, -s);
PVector e = new PVector(-t*s, t*s, t*s);
PVector f = new PVector(t*s, -t*s, t*s);
PVector g = new PVector(-t*s, -t*s, -t*s);
PVector h = new PVector(t*s, t*s, -t*s);
PVector i = new PVector(-2*t*s, 0, 0); // e+g
PVector j = new PVector(0, 0, 2*t*s); // e+f
PVector k = new PVector(0, 2*t*s, 0); // e+h // ook voor geel
PVector l = new PVector(2*t*s, 0, 0); // f+h // ook voor geel
PVector m = new PVector(0, -2*t*s, 0); // f+g
PVector n = new PVector(0, 0, -2*t*s); // g+h // ook voor geel, wordt 13
PVector o = new PVector(-2*t*s, 0, 2*t*s); //b+e
// geel = 10,11,15
PVector[] t15 = {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o};
void setup(){
size(720, 480, P3D);
make_thd(t15);
cam = new PeasyCam(this, 100);
cam.setMinimumDistance(500);
cam.setMaximumDistance(2000);
}
void make_thd(PVector[] t) {
thd = createShape();
thd.beginShape(TRIANGLES);
thd.stroke(200,200,200);
thd.strokeWeight(3);
thd.fill(255,255,255,alpha); // base 0,1,2,3
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.fill(0,255,0,alpha); // base 0,1,2,4
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.fill(0,125,0,alpha); // base 0,1,4,9
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[9].x,t[9].y,t[9].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[9].x,t[9].y,t[9].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[9].x,t[9].y,t[9].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.fill(0,0,0,alpha); // base 4,1,9,14
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[9].x,t[9].y,t[9].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[14].x,t[14].y,t[14].z);
thd.vertex(t[9].x,t[9].y,t[9].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[14].x,t[14].y,t[14].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[14].x,t[14].y,t[14].z);
thd.vertex(t[9].x,t[9].y,t[9].z);
thd.fill(0,125,0,alpha); // base 2,1,4,8
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[8].x,t[8].y,t[8].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[8].x,t[8].y,t[8].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[8].x,t[8].y,t[8].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.fill(0,125,0,alpha); // base 0,4,2,10
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[10].x,t[10].y,t[10].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[4].x,t[4].y,t[4].z);
thd.vertex(t[10].x,t[10].y,t[10].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[10].x,t[10].y,t[10].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.fill(255,0,0,alpha); // base 0,1,3,5
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.fill(125,0,0,alpha); // 0,5,3,11
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.vertex(t[11].x,t[11].y,t[11].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.vertex(t[11].x,t[11].y,t[11].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[11].x,t[11].y,t[11].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.fill(125,0,0,alpha); // 3,1,5,12
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[12].x,t[12].y,t[12].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[12].x,t[12].y,t[12].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[12].x,t[12].y,t[12].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.fill(125,0,0,alpha); // 0,1,5,9
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[9].x,t[9].y,t[9].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[9].x,t[9].y,t[9].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[9].x,t[9].y,t[9].z);
thd.vertex(t[5].x,t[5].y,t[5].z);
thd.fill(0,0,255,alpha); // base 2,1,3,6
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.fill(0,0,125,alpha); // 2,1,6,8
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[8].x,t[8].y,t[8].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[8].x,t[8].y,t[8].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[8].x,t[8].y,t[8].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.fill(0,0,125,alpha); // 2,6,3,13
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.vertex(t[13].x,t[13].y,t[13].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.vertex(t[13].x,t[13].y,t[13].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[13].x,t[13].y,t[13].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.fill(0,0,125,alpha); // 3,1,6,12
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[12].x,t[12].y,t[12].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.vertex(t[1].x,t[1].y,t[1].z);
thd.vertex(t[12].x,t[12].y,t[12].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[12].x,t[12].y,t[12].z);
thd.vertex(t[6].x,t[6].y,t[6].z);
thd.fill(255,255,0,alpha); // base 0,3,2,7
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.fill(125,125,0,alpha); // 2,3,7,13
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[13].x,t[13].y,t[13].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[13].x,t[13].y,t[13].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[13].x,t[13].y,t[13].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.fill(125,125,0,alpha); // 0,3,7,11
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[11].x,t[11].y,t[11].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.vertex(t[3].x,t[3].y,t[3].z);
thd.vertex(t[11].x,t[11].y,t[11].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[11].x,t[11].y,t[11].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.fill(125,125,0,alpha); // 0,2,7,10
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[10].x,t[10].y,t[10].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.vertex(t[2].x,t[2].y,t[2].z);
thd.vertex(t[10].x,t[10].y,t[10].z);
thd.vertex(t[0].x,t[0].y,t[0].z);
thd.vertex(t[10].x,t[10].y,t[10].z);
thd.vertex(t[7].x,t[7].y,t[7].z);
thd.endShape();
}
void show_points() {
textAlign(CENTER, CENTER);
fill(200,200,200);
textSize(45);
push();
translate(a.x*1.2,a.y*1.2,a.z*1.2);
text("C (0)",0,0);
pop();
push();
translate(b.x*1.2,b.y*1.2,b.z*1.2);
text("E (1)",0,0);
pop();
push();
translate(c.x*1.2,c.y*1.2,c.z*1.2);
text("G (2)",0,0);
pop();
push();
translate(d.x*1.2,d.y*1.2,d.z*1.2);
text("B (3)",0,0);
pop();
push();
translate(e.x*1.15,e.y*1.15,e.z*1.15);
text("D (4)",0,0);
pop();
push();
translate(f.x*1.15,f.y*1.15,f.z*1.15);
text("D (5)",0,0);
pop();
push();
translate(g.x*1.15,g.y*1.15,g.z*1.15);
text("D (6)",0,0);
pop();
push();
translate(h.x*1.15,h.y*1.15,h.z*1.15);
text("D (7)",0,0);
pop();
push();
translate(i.x*1.1,i.y*1.1,i.z*1.1);
text("F# (8)",0,0);
pop();
push();
translate(j.x*1.1,j.y*1.1,j.z*1.1);
text("F# (9)",0,0);
pop();
push();
translate(k.x*1.1,k.y*1.1,k.z*1.1);
text("F# (10)",0,0);
pop();
push();
translate(l.x*1.1,l.y*1.1,l.z*1.1);
text("F# (11)",0,0);
pop();
push();
translate(m.x*1.1,m.y*1.1,m.z*1.1);
text("F# (12)",0,0);
pop();
push();
translate(n.x*1.1,n.y*1.1,n.z*1.1);
text("F# (13)",0,0);
pop();
}
void draw(){
background(0);
shape(thd, 0, 0);
show_points();
// The axes
stroke(200, 0, 0, 100);
line(0, 0, 0, -4*s, -4*s, -4*s);
stroke(255, 50, 50, 100);
line(0, 0, 0, 4*s, 4*s, 4*s);
stroke(0, 200, 0, 100);
line(0, 0, 0, -4*s, -4*s, 4*s);
stroke(50, 255, 50, 100);
line(0, 0, 0, 4*s, 4*s, -4*s);
stroke(0, 0, 200, 100);
line(0, 0, 0, -4*s, 4*s, -4*s);
stroke(50, 50, 255, 100);
line(0, 0, 0, 4*s, -4*s, 4*s);
stroke(255, 100);
line(0, 0, 0, 4*s, -4*s, -4*s);
stroke(150, 100);
line(0, 0, 0, -4*s, 4*s, 4*s);
}