main
Alexandre B A Villares 2018-01-08 14:26:25 -02:00
rodzic 6aa0dcb224
commit b7154d15a0
4 zmienionych plików z 178 dodań i 39 usunięć

Wyświetl plik

@ -30,7 +30,6 @@ PlatonicSolid PlatonicFactory(int type, color c) {
}
class Icosahedron extends PlatonicSolid {
// icosahedron
float x, y, z;
float radius;
PVector topPoint;
PVector[] topPent = new PVector[5];
@ -44,13 +43,10 @@ class Icosahedron extends PlatonicSolid {
// constructor
Icosahedron(float radius) {
this.radius = radius;
c = dist(cos(0)*radius, sin(0)*radius, cos(radians(72))*radius, sin(radians(72))*radius);
b = radius;
a = (float)(Math.sqrt(((c*c)-(b*b))));
triHt = (float)(Math.sqrt((c*c)-((c/2)*(c/2))));
for (int i=0; i<topPent.length; i++) {
topPent[i] = new PVector(cos(angle)*radius, sin(angle)*radius, triHt/2.0f);
angle+=radians(72);
@ -71,26 +67,26 @@ class Icosahedron extends PlatonicSolid {
// icosahedron top
beginShape();
if (i<topPent.length-1) {
vertex(x+topPent[i].x, y+topPent[i].y, z+topPent[i].z);
vertex(x+topPoint.x, y+topPoint.y, z+topPoint.z);
vertex(x+topPent[i+1].x, y+topPent[i+1].y, z+topPent[i+1].z);
vertex(topPent[i].x, topPent[i].y, topPent[i].z);
vertex(topPoint.x, topPoint.y, topPoint.z);
vertex(topPent[i+1].x, topPent[i+1].y, topPent[i+1].z);
} else {
vertex(x+topPent[i].x, y+topPent[i].y, z+topPent[i].z);
vertex(x+topPoint.x, y+topPoint.y, z+topPoint.z);
vertex(x+topPent[0].x, y+topPent[0].y, z+topPent[0].z);
vertex(topPent[i].x, topPent[i].y, topPent[i].z);
vertex(topPoint.x, topPoint.y, topPoint.z);
vertex(topPent[0].x, topPent[0].y, topPent[0].z);
}
endShape(CLOSE);
// icosahedron bottom
beginShape();
if (i<bottomPent.length-1) {
vertex(x+bottomPent[i].x, y+bottomPent[i].y, z+bottomPent[i].z);
vertex(x+bottomPoint.x, y+bottomPoint.y, z+bottomPoint.z);
vertex(x+bottomPent[i+1].x, y+bottomPent[i+1].y, z+bottomPent[i+1].z);
vertex(bottomPent[i].x, bottomPent[i].y, bottomPent[i].z);
vertex(bottomPoint.x, bottomPoint.y, bottomPoint.z);
vertex(bottomPent[i+1].x, bottomPent[i+1].y, bottomPent[i+1].z);
} else {
vertex(x+bottomPent[i].x, y+bottomPent[i].y, z+bottomPent[i].z);
vertex(x+bottomPoint.x, y+bottomPoint.y, z+bottomPoint.z);
vertex(x+bottomPent[0].x, y+bottomPent[0].y, z+bottomPent[0].z);
vertex(bottomPent[i].x, bottomPent[i].y, bottomPent[i].z);
vertex(bottomPoint.x, bottomPoint.y, bottomPoint.z);
vertex(bottomPent[0].x, bottomPent[0].y, bottomPent[0].z);
}
endShape(CLOSE);
}
@ -99,39 +95,39 @@ class Icosahedron extends PlatonicSolid {
for (int i=0; i<topPent.length; i++) {
if (i<topPent.length-2) {
beginShape();
vertex(x+topPent[i].x, y+topPent[i].y, z+topPent[i].z);
vertex(x+bottomPent[i+1].x, y+bottomPent[i+1].y, z+bottomPent[i+1].z);
vertex(x+bottomPent[i+2].x, y+bottomPent[i+2].y, z+bottomPent[i+2].z);
vertex(topPent[i].x, topPent[i].y, topPent[i].z);
vertex(bottomPent[i+1].x, bottomPent[i+1].y, bottomPent[i+1].z);
vertex(bottomPent[i+2].x, bottomPent[i+2].y, bottomPent[i+2].z);
endShape(CLOSE);
beginShape();
vertex(x+bottomPent[i+2].x, y+bottomPent[i+2].y, z+bottomPent[i+2].z);
vertex(x+topPent[i].x, y+topPent[i].y, z+topPent[i].z);
vertex(x+topPent[i+1].x, y+topPent[i+1].y, z+topPent[i+1].z);
vertex(bottomPent[i+2].x, bottomPent[i+2].y, bottomPent[i+2].z);
vertex(topPent[i].x, topPent[i].y, topPent[i].z);
vertex(topPent[i+1].x, topPent[i+1].y, topPent[i+1].z);
endShape(CLOSE);
} else if (i==topPent.length-2) {
beginShape();
vertex(x+topPent[i].x, y+topPent[i].y, z+topPent[i].z);
vertex(x+bottomPent[i+1].x, y+bottomPent[i+1].y, z+bottomPent[i+1].z);
vertex(x+bottomPent[0].x, y+bottomPent[0].y, z+bottomPent[0].z);
vertex(topPent[i].x, topPent[i].y, topPent[i].z);
vertex(bottomPent[i+1].x, bottomPent[i+1].y, bottomPent[i+1].z);
vertex(bottomPent[0].x, bottomPent[0].y, bottomPent[0].z);
endShape(CLOSE);
beginShape();
vertex(x+bottomPent[0].x, y+bottomPent[0].y, z+bottomPent[0].z);
vertex(x+topPent[i].x, y+topPent[i].y, z+topPent[i].z);
vertex(x+topPent[i+1].x, y+topPent[i+1].y, z+topPent[i+1].z);
vertex(bottomPent[0].x, bottomPent[0].y, bottomPent[0].z);
vertex(topPent[i].x, topPent[i].y, topPent[i].z);
vertex(topPent[i+1].x, topPent[i+1].y, topPent[i+1].z);
endShape(CLOSE);
} else if (i==topPent.length-1) {
beginShape();
vertex(x+topPent[i].x, y+topPent[i].y, z+topPent[i].z);
vertex(x+bottomPent[0].x, y+bottomPent[0].y, z+bottomPent[0].z);
vertex(x+bottomPent[1].x, y+bottomPent[1].y, z+bottomPent[1].z);
vertex(topPent[i].x, topPent[i].y, topPent[i].z);
vertex(bottomPent[0].x, bottomPent[0].y, bottomPent[0].z);
vertex(bottomPent[1].x, bottomPent[1].y, bottomPent[1].z);
endShape(CLOSE);
beginShape();
vertex(x+bottomPent[1].x, y+bottomPent[1].y, z+bottomPent[1].z);
vertex(x+topPent[i].x, y+topPent[i].y, z+topPent[i].z);
vertex(x+topPent[0].x, y+topPent[0].y, z+topPent[0].z);
vertex(bottomPent[1].x, bottomPent[1].y, bottomPent[1].z);
vertex(topPent[i].x, topPent[i].y, topPent[i].z);
vertex(topPent[0].x, topPent[0].y, topPent[0].z);
endShape(CLOSE);
}
}
@ -142,7 +138,6 @@ class Icosahedron extends PlatonicSolid {
class Tetrahedron extends PlatonicSolid {
// Tetrahedron
float x, y, z;
float radius;
float a;
PVector[] vert = new PVector[4];
@ -268,11 +263,8 @@ class Octahedron extends PlatonicSolid {
}
class Dodecahedron extends PlatonicSolid {
// Dodecahedron
float x, y, z;
float radius;
float a, b, c;
PVector[] vert;
int[][] faces;
@ -280,7 +272,6 @@ class Dodecahedron extends PlatonicSolid {
// constructor
Dodecahedron(float radius) {
this.radius = radius;
a = radius/1.618033989;
b = radius;
c = 0.618033989*a;

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -0,0 +1,106 @@
class Icosahedron():
def __init__(self, radius):
topPent = [PVector()] * 5 # PVector[5]
bottomPent = [PVector()] * 5 # PVector[5]
angle = 0
c = dist(cos(0) * radius,
sin(0) * radius,
cos(radians(72)) * radius,
sin(radians(72)) * radius)
b = radius
a = sqrt(((c * c) - (b * b)))
triHt = sqrt((c * c) - ((c / 2) * (c / 2)))
for i in range(5):
topPent[i] = PVector(cos(angle) * radius,
sin(angle) * radius,
triHt / 2.0)
angle += radians(72)
topPoint = PVector(0, 0, triHt / 2.0 + a)
angle = 72.0 / 2.0
for i in range(5):
bottomPent[i] = PVector(cos(angle) * radius,
sin(angle) * radius,
-triHt / 2.0)
angle += radians(72)
bottomPoint = PVector(0, 0, -(triHt / 2.0 + a))
self.topPent, self.bottomPent = topPent, bottomPent
self.topPoind, self.bottomPoint = topPoint, bottomPoint
# draws icosahedron
def create(self):
topPent, bottomPent = self.topPent, self.bottomPent
topPoint, bottomPoint = self.topPoind, self.bottomPoint
for i in range(5):
# icosahedron top
beginShape()
if (i < 5 - 1):
vertex(topPent[i].x, topPent[i].y, topPent[i].z)
vertex(topPoint.x, topPoint.y, topPoint.z)
vertex(
topPent[i + 1].x, topPent[i + 1].y, topPent[i + 1].z)
else:
vertex(topPent[i].x, topPent[i].y, topPent[i].z)
vertex(topPoint.x, topPoint.y, topPoint.z)
vertex(topPent[0].x, topPent[0].y, topPent[0].z)
endShape(CLOSE)
# icosahedron bottom
beginShape()
if (i < len(bottomPent) - 1):
vertex(bottomPent[i].x, bottomPent[i].y, bottomPent[i].z)
vertex(bottomPoint.x, bottomPoint.y, bottomPoint.z)
vertex(
bottomPent[i + 1].x, bottomPent[i + 1].y, bottomPent[i + 1].z)
else:
vertex(bottomPent[i].x, bottomPent[i].y, bottomPent[i].z)
vertex(bottomPoint.x, bottomPoint.y, bottomPoint.z)
vertex(bottomPent[0].x, bottomPent[0].y, bottomPent[0].z)
endShape(CLOSE)
# icosahedron body
for i in range(5):
if i < 3:
beginShape()
vertex(topPent[i].x, topPent[i].y, topPent[i].z)
vertex(
bottomPent[i + 1].x, bottomPent[i + 1].y, bottomPent[i + 1].z)
vertex(
bottomPent[i + 2].x, bottomPent[i + 2].y, bottomPent[i + 2].z)
endShape(CLOSE)
beginShape()
vertex(
bottomPent[i + 2].x, bottomPent[i + 2].y, bottomPent[i + 2].z)
vertex(topPent[i].x, topPent[i].y, topPent[i].z)
vertex(
topPent[i + 1].x, topPent[i + 1].y, topPent[i + 1].z)
endShape(CLOSE)
elif i == 3:
beginShape()
vertex(topPent[i].x, topPent[i].y, topPent[i].z)
vertex(
bottomPent[i + 1].x, bottomPent[i + 1].y, bottomPent[i + 1].z)
vertex(bottomPent[0].x, bottomPent[0].y, bottomPent[0].z)
endShape(CLOSE)
beginShape()
vertex(bottomPent[0].x, bottomPent[0].y, bottomPent[0].z)
vertex(topPent[i].x, topPent[i].y, topPent[i].z)
vertex(
topPent[i + 1].x, topPent[i + 1].y, topPent[i + 1].z)
endShape(CLOSE)
elif i == 4:
beginShape()
vertex(topPent[i].x, topPent[i].y, topPent[i].z)
vertex(bottomPent[0].x, bottomPent[0].y, bottomPent[0].z)
vertex(bottomPent[1].x, bottomPent[1].y, bottomPent[1].z)
endShape(CLOSE)
beginShape()
vertex(bottomPent[1].x, bottomPent[1].y, bottomPent[1].z)
vertex(topPent[i].x, topPent[i].y, topPent[i].z)
vertex(topPent[0].x, topPent[0].y, topPent[0].z)
endShape(CLOSE)

Wyświetl plik

@ -0,0 +1,42 @@
from PlatonicSolids import *
NUM_COLS, NUM_ROWS = 5, 5
NUM_CELLS = NUM_COLS * NUM_ROWS
solids = []
r_x = 0
r_y = 0
def setup():
global CELL_SIZE
size(500, 500, P3D)
CELL_SIZE = width / NUM_COLS
strokeWeight(5)
noFill()
colorMode(HSB)
for i in range(NUM_CELLS):
s = Icosahedron(CELL_SIZE / 2.5)
c = color(random(256), 200, 200, 128) # random HSB translucent colors
solids.append((s, c)) # (solid, color)
def draw():
global r_x, r_y
# translate(-width/2, -height/2) # may need to use with PeasyCam
r_x += 0.02 # x rotation speed
r_y += 0.01 # y rotation speed
background(255) # clear frame with white
# lights() # use this with filled faces
for i in range(NUM_CELLS):
x, y = x_y_from_i(i, NUM_COLS, NUM_ROWS)
cx, cy = CELL_SIZE / 2 + x * CELL_SIZE, CELL_SIZE / 2 + y * CELL_SIZE
with pushMatrix():
d = dist(mouseX, mouseY, cx, cy)
translate(cx, cy)
if d < 80:
rotateX(r_y)
rotateY(r_x)
stroke(solids[i][1])
solids[i][0].create()
# if (frameCouNUM_CELLS < 200): saveFrame("###.tga")
def x_y_from_i(i, max_x, max_y):
return i % max_x, (i / max_x) % max_y