/
dodecahedron.py
executable file
·94 lines (74 loc) · 2.13 KB
/
dodecahedron.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
91
92
93
94
#!/usr/bin/env python
from functools import partial
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
import numpy as np
from craftmath import rotation_matrix, margin
from craftdraw import polyline
EDGE_LENGTH = 3.5 * cm
WITH_MARGIN = True
MARGIN_SIZE = .6 * cm
MARGIN_ANG = np.pi * 36 / 180
ROTMAT = rotation_matrix(np.pi * 72 / 180)
def polygon(v1, v2, n=5):
v = v2 - v1
vs = v2.copy()
v3 = v2.copy()
for i in range(min(n, 3)):
v = np.dot(ROTMAT, v)
v3 += v
vs = np.c_[vs, v3]
if n >= 4:
vs = np.c_[vs, v1]
if n == 5:
vs = np.c_[vs, v2]
return vs.T
margin = partial(margin, MARGIN_ANG, MARGIN_SIZE)
def main():
# Paper size (A4)
width = 21.0 * cm
height = 29.7 * cm
pdf = canvas.Canvas("./dodecahedron.pdf")
pdf.saveState()
pdf.setAuthor("Kimikazu Kato")
pdf.setTitle("Regular Dodecahedron")
pdf.setPageSize((width, height))
# Lower half
v1 = np.array([width / 2 + EDGE_LENGTH / 2, height / 2])
v2 = np.array([width / 2 - EDGE_LENGTH / 2, height / 2])
vs = polygon(v1, v2)
polyline(pdf, vs)
if WITH_MARGIN:
for j in range(2, 4):
mvs = margin(vs[j + 1, :], vs[j, :])
polyline(pdf, mvs)
vs2 = polygon(vs[2, :], vs[1, :], 4)
polyline(pdf, vs2)
for i in range(4):
vs3 = polygon(vs2[i + 1, :], vs2[i, :], 4)
polyline(pdf, vs3)
if WITH_MARGIN:
for j in range(3):
mvs = margin(vs3[j + 1, :], vs3[j, :])
polyline(pdf, mvs)
# Upper half
vs = polygon(v2, v1)
polyline(pdf, vs)
if WITH_MARGIN:
mvs = margin(vs[1, :], vs[0, :])
polyline(pdf, mvs)
mvs = margin(vs[3, :], vs[2, :])
polyline(pdf, mvs)
vs2 = polygon(vs[2, :], vs[1, :], 4)
polyline(pdf, vs2)
for i in range(4):
vs3 = polygon(vs2[i + 1, :], vs2[i, :], 4)
polyline(pdf, vs3)
if WITH_MARGIN:
if i != 3:
mvs = margin(vs3[4, :], vs3[3, :])
polyline(pdf, mvs)
pdf.saveState()
pdf.save()
if __name__ == '__main__':
main()