-
Notifications
You must be signed in to change notification settings - Fork 0
/
flake_generator.py
90 lines (73 loc) · 2.94 KB
/
flake_generator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
'''
Created on Nov 23, 2015
@author: ams
'''
import svgwrite
from svgwrite import cm, mm
import math
import sys
def toCm(coords):
return (coords[0] * cm, coords[1] * cm)
def toUser(coords):
uuPerCm = 35.43307
return (coords[0] * uuPerCm, coords[1] * uuPerCm)
def distance(a,b):
return abs(ord(a) - ord(b))
def length(a):
return ord(a) - 97
def angle(a):
#1 degree is 0.0174533 radians
return (((ord(a)-97)*(360/26))/2.0) * 0.0174533
def snowflake(center, strSeed, dwg):
#center = (size[0]/2, size[1]/2)
edge = dwg.defs.add(dwg.g(id="flake_edge{0}_{1}".format(center[0], center[1])))
bg = dwg.defs.add(dwg.g(id="background{0}_{1}".format(center[0], center[1]), stroke="aqua", stroke_width=15, stroke_linecap='round'))
fg = dwg.defs.add(dwg.g(id="foreground{0}_{1}".format(center[0], center[1]), stroke="black", stroke_width=2, stroke_linecap='round'))
start = toUser((center[0], center[1]-3.3))
end = toUser(center)
edge.add(dwg.path(d="M {0},{1} L {2},{3}".format(start[0], start[1], end[0], end[1])))
for index in range(len(strSeed) - 1):
d = distance(strSeed[index], strSeed[index + 1])/5.5
a = angle(strSeed[index])
r = length(strSeed[index + 1])/5.5
x = abs(math.cos(a) * r)
y = abs(math.sin(a) * r)
start = toUser((center[0],center[1] - d))
end = toUser((center[0] + x, center[1] - y))
edge.add(dwg.path(d="M {0},{1} L {2},{3}".format(start[0], start[1], end[0], end[1])))
#edge.add(dwg.line(toCm((center[0],center[1] - d)), toCm((center[0] + x, center[1] - y))))
#Reflect the whole group across the centerline
edge_m = dwg.defs.add(dwg.g(id="edge_b{0}_{1}".format(center[0], center[1])))
edge_m.add(dwg.use(edge, insert=(0, 0)))
edge_m.scale(-1, 1)
edge_m.translate(-2*center[0]*35.43307 ,0)
#Rotate and duplicate for 6-way symmmetry
for i in range(6):
rotation = i * 60
newEdge = dwg.g(id="edge_{0}_{1}_{2}".format(rotation, center[0], center[1]))
newEdge.add(dwg.use(edge_m, insert = (0,0)))
newEdge.add(dwg.use(edge, insert = (0,0)))
newEdge.rotate(rotation, center=(toUser((center))))
bg.add(newEdge)
fg.add(newEdge)
dwg.add(bg)
dwg.add(fg)
def single_flake(path, string)
size = (10,10)
fullpath = path + string + ".svg"
dwg = svgwrite.Drawing(fullpath, size=(toCm(size)), profile='full')
snowflake(5,5,string,dwg)
dwg.save()
if __name__ == '__main__':
size = (50, 30)
dwg = svgwrite.Drawing('test.svg', size=(toCm(size)), profile='full')
index = 0
names=["bookkeeper","dumbwaiter","madamimadam","wysiwyg"]
for yPos in range(5, 28, 9):
for xPos in range(5, 48, 9):
center = (xPos, yPos)
snowflake(center, names[index], dwg)
index += 1
if index >= len(names):
dwg.save()
sys.exit()