Advertisement
Guest User

pure-paper-packable-polyhedra-in-python

a guest
Jan 25th, 2011
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.34 KB | None | 0 0
  1. import sys
  2. import math
  3. import tokenize
  4. from StringIO import StringIO
  5.  
  6. def translate(p, a, l):
  7.     x,y = p
  8.     return x + math.cos(a) * l, y + math.sin(a) * l
  9.  
  10.  
  11. def polygon(pt, num, layers=[0]):
  12.     x,y,a,z = pt
  13.     pts = []
  14.     params = [[] for offset in layers]
  15.     da = math.pi*2.0 / num
  16.     f = 1/math.cos(da/2.0)
  17.     for i in range(num):
  18.         pts.append((x,y,a+math.pi,z))
  19.         x,y = (translate((x,y), a+math.pi/2.0, z*0.5))
  20.         j = 0
  21.         for offset in layers:
  22.             params[j].append(translate((x,y), a - da/2.0, f*offset))
  23.             j += 1
  24.         a -= da
  25.         x,y = (translate((x,y), a+math.pi/2.0, z*0.5))
  26.     ps = []
  27.     for param in params:
  28.         ps.append('M %s Z' % ' '.join(['%f,%f' % p for p in param]))
  29.     print """<path fill-rule="evenodd" d="%s" />""" % ' '.join(ps)
  30.     return pts
  31.  
  32. def p4(pt):
  33.     return polygon(pt, 4, [0, 0.1, 0.5, 1.0])
  34.  
  35. def p6(pt):
  36.     return polygon(pt, 6, [0, 0.1, 0.5, 1.0])
  37.  
  38. def p8(pt):
  39.     return polygon(pt, 8, [0, 0.1, 0.5, 1.0])
  40.  
  41. def e(pt):
  42.     x,y,a,z = pt
  43.     x1,y1 = translate(translate((x,y), a+math.pi/2.0, z*0.5), a, 1.0)
  44.     x2,y2 = translate(translate((x,y), a-math.pi/2.0, z*0.5), a, 1.0)
  45.     #print """<path stroke="black" d="M %f,%f L %f,%f" />""" % (x1,y1,x2,y2)
  46.     return []
  47.  
  48. def s(pt):
  49.     x,y,a,z = pt
  50.     x1,y1 = translate((x,y), a+math.pi/2.0, z*0.5)
  51.     x2,y2 = translate((x,y), a-math.pi/2.0, z*0.5)
  52.     #print """<path stroke="silver" d="M %f,%f L %f,%f" />""" % (x1,y1,x2,y2)
  53.     return []
  54.  
  55. def draw_shape(points, shape_data, functions):
  56.     points = points[:]
  57.     outpoints = []
  58.     instrs = tokenize.generate_tokens(StringIO(shape_data).next)
  59.     stack = [None]
  60.     for type,instr,start,end,line in instrs:
  61.         #print >>sys.stderr, 'instr:', instr
  62.         if instr == '(':
  63.             stack.append(points)
  64.             points = outpoints
  65.             outpoints = []
  66.         elif instr == ')' or instr == '':
  67.             while len(outpoints) > 0:
  68.                 if len(outpoints) == num_outpoints:
  69.                     f = functions['s']
  70.                 else:
  71.                     f = functions['e']
  72.                 inpoint = outpoints.pop(0)
  73.                 f(inpoint)
  74.             while len(points) > 0:
  75.                 f = functions['e']
  76.                 inpoint = points.pop(0)
  77.                 f(inpoint)
  78.             outpoints = points
  79.             points = stack.pop()
  80.         else:
  81.             while len(outpoints) > 0:
  82.                 if len(outpoints) == num_outpoints:
  83.                     f = functions['s']
  84.                 else:
  85.                     f = functions['e']
  86.                 inpoint = outpoints.pop(0)
  87.                 f(inpoint)
  88.             f = functions[instr]
  89.             inpoint = points.pop(0)
  90.             outpoints = f(inpoint)
  91.             num_outpoints = len(outpoints)
  92.  
  93. print """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  94. <svg width="100%" height="100%" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">"""
  95. point = 0.0,0.0,0.0,10.0
  96. cube_data = """p4(p4 p4(s e p4 e) p4 p4)"""
  97. orange_data1 = """p8(p4(s e p8(s e p4 e p4 p6)) p6 p4(s e p8(s e p4 e p4 p6)) p6 p4(s e p8(s e p4 e p4 p6)) p6 p4(s e p8(s e p4 e p4(s e p8) p6)) p6)"""
  98. orange_data2 = """p4(p6(s e p4 p6) p6(s e p4 p6) p6(s e p4 p6) p6(s e p4 p6(s e e p4)))"""
  99.  
  100. draw_shape([point], orange_data2, locals())
  101. print """</svg>"""
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement