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
|
import numpy as np
def make_rotation_matrix(phi, n):
"""
Make the rotation matrix to rotate points through an angle `phi`
counter-clockwise around the axis `n` (when looking towards +infinity).
Source: Weissten, Eric W. "Rotation Formula." Mathworld.
"""
n = np.asarray(n)/np.linalg.norm(n)
return np.cos(phi)*np.identity(3) + (1-np.cos(phi))*np.outer(n,n) + \
np.sin(phi)*np.array([[0,n[2],-n[1]],[-n[2],0,n[0]],[n[1],-n[0],0]])
def rotate(x, phi, n):
"""
Rotate an array of points `x` through an angle phi counter-clockwise
around the axis `n` (when looking towards +infinity).
"""
return np.inner(np.asarray(x),make_rotation_matrix(phi, n))
def normalize(x):
"Returns unit vectors in the direction of `x`."
x = np.asarray(x)
if x.shape[-1] != 3:
raise ValueError('dimension of last axis must be 3.')
d = len(x.shape)
if d == 1:
norm = np.sqrt(x.dot(x))
elif d == 2:
norm = np.sqrt(np.sum(x*x, axis=1))[:,np.newaxis]
else:
raise ValueError('len(`x`.shape) must be zero or one.')
return x/norm
|