summaryrefslogtreecommitdiff
path: root/transform.py
blob: 299da46ffdba8f246d57a12fe1183c04adb5c479 (plain)
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