-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathorigami.py
48 lines (37 loc) · 983 Bytes
/
origami.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
import numpy as np
import numpy.linalg as la
def ext_mat(v):
return np.array([[0, -v[2], v[1]], [v[2], 0, -v[0]], [-v[1], v[0], 0]])
def rot_mat(u, phi):
return (
np.tensordot(u, u, axes=0)
+ np.cos(phi) * (np.eye(3) - np.tensordot(u, u, axes=0))
+ np.sin(phi) * ext_mat(u)
)
def comp_rot_mat(u_v, phi_v):
if len(phi_v) == 1:
return rot_mat(u_v[0], phi_v[0])
else:
return rot_mat(np.dot(comp_rot_mat(u_v[1:], phi_v[1:]), u_v[0]), phi_v[0])
def angle_mat(u_v, phi_v):
R = np.eye(3)
for i in range(len(phi_v)):
R = np.dot(R, comp_rot_mat(u_v[i:], phi_v[i:]))
return R
u_v = [
np.array([1, 1, 0]) / np.sqrt(2),
np.array([-1, 1, 0]) / np.sqrt(2),
np.array([-1, 0, 0]),
np.array([-1, -1, 0]) / np.sqrt(2),
np.array([1, -1, 0]) / np.sqrt(2),
np.array([1, 0, 0]),
]
phi_v = [
np.pi,
np.pi,
-np.pi,
np.pi,
np.pi,
-np.pi,
]
print(angle_mat(u_v, phi_v))