Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame, sys, math
- black = (0, 0, 0); white = (255, 255, 255); green = (0, 255, 0)
- blue = (0, 0, 255); red = (255, 0, 0)
- pygame.init()
- scr = pygame.display.set_mode((500, 500))
- win = scr.get_rect()
- scr.fill(white)
- k = 0.5 # projection scale
- phi = math.radians(63.4) # try also 45
- sinphi = math.sin(phi); cosphi = math.cos(phi)
- s = 100
- c = 50
- cube =(\
- (-s,-s,-s),(-s, s,-s),(-s, s,-s),( s, s,-s),\
- ( s, s,-s),( s,-s,-s),( s,-s,-s),(-s,-s,-s),\
- (-s,-s, s),(-s, s, s),(-s, s, s),( s, s, s),\
- ( s, s, s),( s,-s, s),( s,-s, s),(-s,-s, s),\
- (-s,-s,-s),(-s,-s, s),(-s, s,-s),(-s, s, s),\
- ( s, s,-s),( s, s, s),( s,-s,-s),( s,-s, s))
- #(-s,-s,-s),(-s,s,-s),(s,s,-s), (s, -s, -s)
- tetrahedron=(\
- (s,s,s),(s,-s,-s),(-s,s,-s),(-s,-s,s),\
- (s,s,s),(-s,s,-s),(s,-s,-s),(-s,s,-s),\
- (s,s,s),(-s,-s,s),(s,-s,-s),(-s,-s,s))
- tetrahedron2=(\
- (-c,-c,-c),(-c,c,c),(c,-c,c),(c,c,-c),\
- (-c,-c,-c),(c,-c,c),(-c,c,c),(c,-c,c),\
- (-c,-c,-c),(c,c,-c),(-c,c,c),(c,c,-c))
- octahedron=((0,0,s),(0,s,0))
- '''
- (0,0,s),(0,s,0),\
- (0,0,s),(s,0,0),\
- (0,0,s),(-s,0,0),\
- (0,0,s),(0,-s,0),\
- (0,0,-s),(0,s,0),\
- (0,0,-s),(s,0,0),\
- (0,0,-s),(-s,0,0),\
- (0,0,-s),(0,-s,0),\
- (s,0,0), (0,s,0),\
- (-s,0,0), (0,s,0),\
- (s,0,0), (0,-s,0),\
- (-s,0,0), (0,-s,0))
- '''
- def define(x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4):
- global octahedron
- octahedron = list(octahedron)
- octahedron.append(((x1+x2)/2, (y1+y2)/2, (z1+z2)/2)); octahedron.append(((x1+x3)/2, (y1+y3)/2, (z1+z3)/2))
- octahedron.append(((x1+x2)/2, (y1+y2)/2, (z1+z2)/2)); octahedron.append(((x1+x4)/2, (y1+y4)/2, (z1+z4)/2))
- octahedron.append(((x1+x2)/2, (y1+y2)/2, (z1+z2)/2)); octahedron.append(((x2+x3)/2, (y2+x3)/2, (z2+z3)/2))
- octahedron.append(((x1+x2)/2, (y1+y2)/2, (z1+z2)/2)); octahedron.append(((x2+x4)/2, (y2+x4)/2, (z2+z4)/2))
- octahedron.append(((x1+x2)/2, (y1+y2)/2, (z1+z2)/2)); octahedron.append(((x3+x4)/2, (y3+y3)/2, (x3+x4)/2))
- octahedron.append(((x1+x3)/2, (y1+y3)/2, (z1+z3)/2)); octahedron.append(((x1+x2)/2, (y1+y2)/2, (z1+z2)/2))
- octahedron.append(((x1+x3)/2, (y1+y3)/2, (z1+z3)/2)); octahedron.append(((x1+x4)/2, (y1+y4)/2, (z1+z4)/2))
- octahedron.append(((x1+x3)/2, (y1+y3)/2, (z1+z3)/2)); octahedron.append(((x2+x3)/2, (y2+x3)/2, (z2+z3)/2))
- octahedron.append(((x1+x3)/2, (y1+y3)/2, (z1+z3)/2)); octahedron.append(((x2+x4)/2, (y2+x4)/2, (z2+z4)/2))
- octahedron.append(((x1+x3)/2, (y1+y3)/2, (z1+z3)/2)); octahedron.append(((x3+x4)/2, (y3+y3)/2, (x3+x4)/2))
- octahedron.append(((x1+x4)/2, (y1+y4)/2, (z1+z4)/2)); octahedron.append(((x1+x2)/2, (y1+y2)/2, (z1+z2)/2))
- octahedron.append(((x1+x4)/2, (y1+y4)/2, (z1+z4)/2)); octahedron.append(((x1+x3)/2, (y1+y3)/2, (z1+z3)/2))
- octahedron.append(((x1+x4)/2, (y1+y4)/2, (z1+z4)/2)); octahedron.append(((x2+x3)/2, (y2+x3)/2, (z2+z3)/2))
- octahedron.append(((x1+x4)/2, (y1+y4)/2, (z1+z4)/2)); octahedron.append(((x2+x4)/2, (y2+x4)/2, (z2+z4)/2))
- octahedron.append(((x1+x4)/2, (y1+y4)/2, (z1+z4)/2)); octahedron.append(((x3+x4)/2, (y3+y3)/2, (x3+x4)/2))
- octahedron.append(((x2+x3)/2, (y2+x3)/2, (z2+z3)/2)); octahedron.append(((x1+x2)/2, (y1+y2)/2, (z1+z2)/2))
- octahedron.append(((x2+x3)/2, (y2+x3)/2, (z2+z3)/2)); octahedron.append(((x1+x3)/2, (y1+y3)/2, (z1+z3)/2))
- octahedron.append(((x2+x3)/2, (y2+x3)/2, (z2+z3)/2)); octahedron.append(((x1+x4)/2, (y1+y4)/2, (z1+z4)/2))
- octahedron.append(((x2+x3)/2, (y2+x3)/2, (z2+z3)/2)); octahedron.append(((x2+x4)/2, (y2+x4)/2, (z2+z4)/2))
- octahedron.append(((x2+x3)/2, (y2+x3)/2, (z2+z3)/2)); octahedron.append(((x3+x4)/2, (y3+y3)/2, (x3+x4)/2))
- octahedron.append(((x2+x4)/2, (y2+x4)/2, (z2+z4)/2)); octahedron.append(((x1+x2)/2, (y1+y2)/2, (z1+z2)/2))
- octahedron.append(((x2+x4)/2, (y2+x4)/2, (z2+z4)/2)); octahedron.append(((x1+x3)/2, (y1+y3)/2, (z1+z3)/2))
- octahedron.append(((x2+x4)/2, (y2+x4)/2, (z2+z4)/2)); octahedron.append(((x1+x4)/2, (y1+y4)/2, (z1+z4)/2))
- octahedron.append(((x2+x4)/2, (y2+x4)/2, (z2+z4)/2)); octahedron.append(((x2+x3)/2, (y2+x3)/2, (z2+z3)/2))
- octahedron.append(((x2+x4)/2, (y2+x4)/2, (z2+z4)/2)); octahedron.append(((x3+x4)/2, (y3+y3)/2, (x3+x4)/2))
- octahedron.append(((x3+x4)/2, (y3+y3)/2, (x3+x4)/2)); octahedron.append(((x1+x2)/2, (y1+y2)/2, (z1+z2)/2))
- octahedron.append(((x3+x4)/2, (y3+y3)/2, (x3+x4)/2)); octahedron.append(((x1+x3)/2, (y1+y3)/2, (z1+z3)/2))
- octahedron.append(((x3+x4)/2, (y3+y3)/2, (x3+x4)/2)); octahedron.append(((x1+x4)/2, (y1+y4)/2, (z1+z4)/2))
- octahedron.append(((x3+x4)/2, (y3+y3)/2, (x3+x4)/2)); octahedron.append(((x2+x3)/2, (y2+x3)/2, (z2+z3)/2))
- octahedron.append(((x3+x4)/2, (y3+y3)/2, (x3+x4)/2)); octahedron.append(((x2+x4)/2, (y2+x4)/2, (z2+z4)/2))
- octahedron = tuple(octahedron)
- #((x1+x2)/2, y1-y2, z1-z2), (x1-x3, y1-y3, z1-z3),(x1-x4, y1-y4, z1-z4),\
- #(x2-x3, y2-x3, z2-z3), (x2-x4, y2-x4, z2-z4),(x3-x4, y3-y3, x3-x4)
- #(s,s,s),(s,-s,-s),(-s,s,-s),(-s,-s,s)
- define(-s,-s,-s,-s,s,-s,s,s,-s, s, -s, -s)
- def drawline3d((x1,y1,z1),(x2,y2,z2),colour, w=1):
- # convert 3d to 2d with cabinet projection
- xa = x1 - z1*sinphi *k
- ya = y1 - z1*cosphi *k
- xb = x2 - z2*sinphi *k
- yb = y2 - z2*cosphi *k
- # convert to screen coordinates
- s1, s2 = (win.centerx+xa,win.centery-ya), (win.centerx+xb,win.centery-yb)
- pygame.draw.line(scr, colour, s1, s2, w)
- def draw3d(figure, colour): #read pairas of 3d-points
- pair=False
- for x2,y2,z2 in figure:
- if not(pair):
- x1,y1,z1 = x2,y2,z2
- pair = True; continue
- drawline3d((x1,y1,z1),(x2,y2,z2), colour)
- pair = False
- def rotx(fig,a):
- newfig = []
- a = math.radians(a)
- sin=math.sin(a); cos=math.cos(a)
- for x,y,z in fig:
- newfig.append((x,y*cos-z*sin,y*sin+z*cos))
- return newfig
- def roty(fig,a):
- newfig = []
- a = math.radians(a)
- sin=math.sin(a); cos=math.cos(a)
- for x,y,z in fig:
- newfig.append((x*cos+z*sin,y,-x*sin+z*cos))
- return newfig
- def rotz(fig,a):
- newfig = []
- a = math.radians(a)
- sin=math.sin(a); cos=math.cos(a)
- for x,y,z in fig:
- newfig.append((x*cos-y*sin,x*sin+y*cos,z))
- return newfig
- pygame.key.set_repeat(50,50)
- while True:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- sys.exit()
- if event.type == pygame.KEYDOWN:
- if event.key == pygame.K_DOWN:
- cube = rotx(cube,5)
- tetrahedron = rotx(tetrahedron,5)
- tetrahedron2 = rotx(tetrahedron2,5)
- octahedron= rotx(octahedron,5)
- if event.key == pygame.K_RIGHT:
- cube = roty(cube,5)
- tetrahedron = roty(tetrahedron,5)
- tetrahedron2 = roty(tetrahedron2,5)
- octahedron= roty(octahedron,5)
- if event.key == pygame.K_a:
- tetrahedron2 = rotz(tetrahedron2,5)
- tetrahedron = rotz(tetrahedron,5)
- octahedron= rotz(octahedron,5)
- cube = rotz(cube,5)
- scr.fill(black)
- draw3d(tetrahedron, red)
- draw3d(octahedron, blue)
- #draw3d(tetrahedron2)
- #draw3d(cube, green)
- pygame.display.flip()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement