kopia lustrzana https://github.com/villares/sketch-a-day
python factory!
rodzic
31341b5e23
commit
ee052ac0fd
Plik binarny nie jest wyświetlany.
|
|
@ -1,64 +1,61 @@
|
|||
from functools import partial
|
||||
|
||||
def PlatonicFactory(type):
|
||||
s = Tetrahedron(18*2)
|
||||
if type == 1:
|
||||
s = Hexahedron(14*2)
|
||||
elif type == 2:
|
||||
s = Octahedron(22*2)
|
||||
elif type == 3:
|
||||
s = Dodecahedron(18*2)
|
||||
elif type == 4:
|
||||
s = Icosahedron(18*2)
|
||||
def PlatonicFactory(type=0, size_=None):
|
||||
classes = {0: Tetrahedron,
|
||||
1: Hexahedron,
|
||||
2: Octahedron,
|
||||
3: Dodecahedron,
|
||||
4: Icosahedron,
|
||||
}
|
||||
default_sizes = {0: 36, 1: 28, 2: 44, 3: 36, 4: 36}
|
||||
if size_:
|
||||
solid_size = size_
|
||||
else:
|
||||
solid_size = default_sizes[type]
|
||||
|
||||
def platotonic_s(self):
|
||||
stroke(self.c)
|
||||
s.platonic_stroke = partial(platotonic_s, s)
|
||||
|
||||
return s
|
||||
return classes[type](solid_size)
|
||||
|
||||
class Tetrahedron():
|
||||
|
||||
|
||||
def __init__(self, radius):
|
||||
self.vert = [0] * 4
|
||||
self.radius = radius
|
||||
a = radius * 0.6666
|
||||
self.vert[0] = PVector(a, a, a)
|
||||
self.vert[1] = PVector(-a, -a, a)
|
||||
self.vert[2] = PVector(-a, a, -a)
|
||||
self.vert[3] = PVector(a, -a, -a)
|
||||
|
||||
self.vert[0] = PVector(a, a, a)
|
||||
self.vert[1] = PVector(-a, -a, a)
|
||||
self.vert[2] = PVector(-a, a, -a)
|
||||
self.vert[3] = PVector(a, -a, -a)
|
||||
|
||||
# draws tetrahedron
|
||||
def create(self):
|
||||
vert = self.vert
|
||||
beginShape(TRIANGLE_STRIP)
|
||||
vertex(vert[0].x, vert[0].y, vert[0].z)
|
||||
vertex(vert[1].x, vert[1].y, vert[1].z)
|
||||
vertex(vert[2].x, vert[2].y, vert[2].z)
|
||||
vertex(vert[3].x, vert[3].y, vert[3].z)
|
||||
vertex(vert[0].x, vert[0].y, vert[0].z)
|
||||
vertex(vert[1].x, vert[1].y, vert[1].z)
|
||||
vertex(vert[3].x, vert[3].y, vert[3].z)
|
||||
vertex(vert[2].x, vert[2].y, vert[2].z)
|
||||
vertex(vert[1].x, vert[1].y, vert[1].z)
|
||||
vertex(vert[0].x, vert[0].y, vert[0].z)
|
||||
vertex(vert[1].x, vert[1].y, vert[1].z)
|
||||
vertex(vert[2].x, vert[2].y, vert[2].z)
|
||||
vertex(vert[3].x, vert[3].y, vert[3].z)
|
||||
vertex(vert[0].x, vert[0].y, vert[0].z)
|
||||
vertex(vert[1].x, vert[1].y, vert[1].z)
|
||||
vertex(vert[3].x, vert[3].y, vert[3].z)
|
||||
vertex(vert[2].x, vert[2].y, vert[2].z)
|
||||
vertex(vert[1].x, vert[1].y, vert[1].z)
|
||||
endShape(CLOSE)
|
||||
|
||||
|
||||
|
||||
class Hexahedron():
|
||||
|
||||
def __init__(self, radius) :
|
||||
def __init__(self, radius):
|
||||
self.radius = radius
|
||||
a = radius/1.1414
|
||||
a = radius / 1.1414
|
||||
faces = [0] * 6
|
||||
vert = [0] * 8
|
||||
vert[0] = PVector( a, a, a )
|
||||
vert[1] = PVector( a, a, -a )
|
||||
vert[2] = PVector( a, -a, -a )
|
||||
vert[3] = PVector( a, -a, a )
|
||||
vert[4] = PVector( -a, -a, a )
|
||||
vert[5] = PVector( -a, a, a )
|
||||
vert[6] = PVector( -a, a, -a )
|
||||
vert[7] = PVector( -a, -a, -a )
|
||||
vert[0] = PVector(a, a, a)
|
||||
vert[1] = PVector(a, a, -a)
|
||||
vert[2] = PVector(a, -a, -a)
|
||||
vert[3] = PVector(a, -a, a)
|
||||
vert[4] = PVector(-a, -a, a)
|
||||
vert[5] = PVector(-a, a, a)
|
||||
vert[6] = PVector(-a, a, -a)
|
||||
vert[7] = PVector(-a, -a, -a)
|
||||
|
||||
faces[0] = (0, 1, 2, 3)
|
||||
faces[1] = (4, 5, 6, 7)
|
||||
|
|
@ -66,11 +63,11 @@ class Hexahedron():
|
|||
faces[3] = (1, 2, 7, 6)
|
||||
faces[4] = (2, 3, 4, 7)
|
||||
faces[5] = (0, 5, 6, 1)
|
||||
|
||||
|
||||
self.vert, self.faces = vert, faces
|
||||
|
||||
# draws hexahedron
|
||||
def create(self):
|
||||
# draws hexahedron
|
||||
def create(self):
|
||||
for i in range(6):
|
||||
beginShape()
|
||||
for j in range(4):
|
||||
|
|
@ -78,28 +75,26 @@ class Hexahedron():
|
|||
self.vert[self.faces[i][j]].y,
|
||||
self.vert[self.faces[i][j]].z)
|
||||
endShape()
|
||||
|
||||
|
||||
|
||||
|
||||
class Octahedron():
|
||||
|
||||
def __init__(self, radius) :
|
||||
def __init__(self, radius):
|
||||
self.radius = radius
|
||||
a = radius
|
||||
vert = [0] * 6
|
||||
vert[0] = PVector( a, 0, 0 )
|
||||
vert[1] = PVector( 0, a, 0 )
|
||||
vert[2] = PVector( 0, 0, a )
|
||||
vert[3] = PVector( -a, 0, 0 )
|
||||
vert[4] = PVector( 0, -a, 0 )
|
||||
vert[5] = PVector( 0, 0, -a )
|
||||
vert[0] = PVector(a, 0, 0)
|
||||
vert[1] = PVector(0, a, 0)
|
||||
vert[2] = PVector(0, 0, a)
|
||||
vert[3] = PVector(-a, 0, 0)
|
||||
vert[4] = PVector(0, -a, 0)
|
||||
vert[5] = PVector(0, 0, -a)
|
||||
self.vert = vert
|
||||
|
||||
# draws octahedron
|
||||
# draws octahedron
|
||||
def create(self):
|
||||
vert = self.vert
|
||||
beginShape(TRIANGLE_FAN)
|
||||
beginShape(TRIANGLE_FAN)
|
||||
vertex(vert[4].x, vert[4].y, vert[4].z)
|
||||
vertex(vert[0].x, vert[0].y, vert[0].z)
|
||||
vertex(vert[2].x, vert[2].y, vert[2].z)
|
||||
|
|
@ -108,7 +103,7 @@ class Octahedron():
|
|||
vertex(vert[0].x, vert[0].y, vert[0].z)
|
||||
endShape()
|
||||
|
||||
beginShape(TRIANGLE_FAN)
|
||||
beginShape(TRIANGLE_FAN)
|
||||
vertex(vert[1].x, vert[1].y, vert[1].z)
|
||||
vertex(vert[0].x, vert[0].y, vert[0].z)
|
||||
vertex(vert[2].x, vert[2].y, vert[2].z)
|
||||
|
|
@ -225,6 +220,7 @@ class Icosahedron():
|
|||
endShape(CLOSE)
|
||||
|
||||
class Dodecahedron():
|
||||
|
||||
def __init__(self, radius):
|
||||
self.radius = radius
|
||||
a = radius / 1.618033989
|
||||
|
|
|
|||
|
|
@ -1,3 +1,9 @@
|
|||
"""
|
||||
s180108 Platonic Solid Grid in Processing.Py
|
||||
(c)2018 Alexandre B A Villares
|
||||
https://abav.lugaralgum.com/sketch-a-day
|
||||
"""
|
||||
|
||||
from PlatonicSolids import *
|
||||
|
||||
NUM_COLS, NUM_ROWS = 5, 5
|
||||
|
|
@ -16,7 +22,7 @@ def setup():
|
|||
for i in range(NUM_CELLS):
|
||||
s = PlatonicFactory(int(random(5))) # Instancia aleatoriamente um dos sólidos
|
||||
c = color(random(256), 200, 200, 128) # random HSB translucent colors
|
||||
s.c = c # Tasca cor no sólido! Só os gerados na Factory tem o método p/ usar
|
||||
s.c = c # Tasca cor no sólido, vou usar no loop do draw!
|
||||
solids.append(s)
|
||||
|
||||
def draw():
|
||||
|
|
@ -32,15 +38,12 @@ def draw():
|
|||
with pushMatrix():
|
||||
d = dist(mouseX, mouseY, cx, cy)
|
||||
translate(cx, cy)
|
||||
if d < 80:
|
||||
if d < 80: # se o mouse está perto, gira!
|
||||
rotateX(r_y)
|
||||
rotateY(r_x)
|
||||
# cuidado, só os sólidos criados pela PlatonicFactory tem .platonic_stroke()
|
||||
# tava aprendendo a fazer isso de acrescentar métodos
|
||||
# podia ter sido resolvido com stroke(solids[i].c)
|
||||
solids[i].platonic_stroke()
|
||||
stroke(solids[i].c) # Lembrando que de fábrica não tem .c
|
||||
solids[i].create()
|
||||
if (frameCount < 200): saveFrame("###.tga")
|
||||
# if (frameCount < 200): saveFrame("###.tga") # para salvar frames
|
||||
|
||||
def x_y_from_i(i, max_x, max_y):
|
||||
return i % max_x, (i / max_x) % max_y
|
||||
return i % max_x, (i / max_x) % max_y
|
||||
Ładowanie…
Reference in New Issue