void setup() {
size(800, 600, P3D);
}
void draw() {
float clockwiseDirection = frameCount * PI;
float antiClockwiseDirection = frameCount * -PI;
background(255);
fill(138, 43, 226, 100);
pushMatrix();
// move to the centre of the screen
translate(width / 2, height / 2, 0);
rotateX(clockwiseDirection / 250);
rotateY(clockwiseDirection / 250);
rotateZ(clockwiseDirection / 250);
cuboctahedron(250);
rotateX(antiClockwiseDirection / 250);
rotateY(antiClockwiseDirection / 250);
rotateZ(antiClockwiseDirection / 250);
sphereDetail(1);
sphere(200);
rotateX(clockwiseDirection / 200);
rotateY(clockwiseDirection / 200);
rotateZ(clockwiseDirection / 200);
box(120);
rotateX(antiClockwiseDirection / 150);
rotateY(antiClockwiseDirection / 150);
rotateZ(antiClockwiseDirection / 150);
cuboctahedron(50);
popMatrix();
for (int i = 40; i < height + 40; i = i + 80) {
for (int j = 40; j < width; j = j + 80) {
pushMatrix();
translate(j, i, 0);
rotateZ(antiClockwiseDirection / 150);
rotateX(antiClockwiseDirection / 150);
rotateY(antiClockwiseDirection / 150);
draw2DPolygon(6, 40);
rotateZ(clockwiseDirection / 255);
rotateX(clockwiseDirection / 255);
rotateY(clockwiseDirection / 255);
draw2DPolygon(5, 30);
popMatrix();
}
}
}
void draw2DPolygon(int sides, int size) {
fill(85, 26, 139, 30);
stroke(138, 43, 226, 20);
int x = 0;
int y = 0;
float centreX = 0;
float centreY = 0;
for (int i = 0; i < sides; i++) {
float xCoord = (x + size * cos(i * 2 * PI / sides));
float yCoord = (y + size * sin(i * 2 * PI / sides));
centreX += xCoord;
centreY += yCoord;
}
centreX = (centreX / sides) * -1;
centreY = (centreY / sides) * -1;
beginShape();
for (int i = 0; i <= sides; i++) {
float xCoord = (centreX + size * cos(i * 2 * PI / sides));
float yCoord = (centreY + size * sin(i * 2 * PI / sides));
vertex(xCoord, yCoord);
}
endShape();
for (int i = 0; i < sides; i++) {
float xCoord = (centreX + size * cos(i * 2 * PI / sides));
float yCoord = (centreY + size * sin(i * 2 * PI / sides));
line(xCoord, yCoord, centreX, centreY);
}
stroke(0);
}
void cuboctahedron(int size) {
char[] vertices = new char[] {
'A',
'I',
'E',
'K',
'A',
'B',
'J',
'F',
'I',
'B',
'D',
'L',
'H',
'J',
'D',
'C',
'K',
'G',
'L',
'C',
'A',
'I',
'E',
'G',
'H',
'F',
'E' };
beginShape();
drawCuboctahedron(vertices, size);
endShape();
}
void drawCuboctahedron(char[] vertices, float edgeSize) {
float halfEdgeSize = edgeSize / 2;
float halfDiagonalSize = (sqrt((sq(edgeSize)) + (sq(edgeSize)))) / 2;
float x = 0;
float y = 0;
float z = -edgeSize;
for (int i = 0; i < vertices.length; i++) {
char vertex = vertices[i];
switch (vertex) {
case 'A':
vertex(x - halfEdgeSize, y - halfDiagonalSize, z + halfEdgeSize);
break;
case 'B':
vertex(x + halfEdgeSize, y - halfDiagonalSize, z + halfEdgeSize);
break;
case 'C':
vertex(x - halfEdgeSize, y - halfDiagonalSize, z + (halfEdgeSize * 3));
break;
case 'D':
vertex(x + halfEdgeSize, y - halfEdgeSize, z + (halfEdgeSize * 3));
break;
case 'E':
vertex(x - halfEdgeSize, y + halfEdgeSize, z + halfEdgeSize);
break;
case 'F':
vertex(x + halfEdgeSize, y + halfEdgeSize, z + halfEdgeSize);
break;
case 'G':
vertex(x - halfEdgeSize, y + halfDiagonalSize, z + (halfEdgeSize * 3));
break;
case 'H':
vertex(x + halfEdgeSize, y + halfDiagonalSize, z + (halfEdgeSize * 3));
break;
case 'I':
vertex(x, y, z);
break;
case 'J':
vertex(x + (halfEdgeSize * 2), y, z + (halfEdgeSize * 2));
break;
case 'K':
vertex(x - (halfEdgeSize * 2), y, z + (halfEdgeSize * 2));
break;
case 'L':
vertex(x, y, z + (halfEdgeSize * 4));
break;
}
}
}
Monday, 27 July 2009
Program written
I've finally written the program for this chunk, it justs needs commenting and then the chunk text explanation writing:
Subscribe to:
Posts (Atom)