Statistiques
| Révision :

root / ase / gui / rot_tools.py @ 15

Historique | Voir | Annoter | Télécharger (1,58 ko)

1 1 tkerber
# Gives the rotation matrix which rotates theta degrees about
2 1 tkerber
# vecU
3 1 tkerber
4 1 tkerber
#  Generates the rotation matrix that rotate theta degrees about the vecU
5 1 tkerber
def rotate_about_vec(vecU, theta):
6 1 tkerber
    import numpy as np
7 1 tkerber
    vecU = np.array(vecU)
8 1 tkerber
    vecU = vecU / (sum(vecU ** 2) ** 0.5)
9 1 tkerber
    ux, uy, uz = vecU
10 1 tkerber
    st = np.sin(theta)
11 1 tkerber
    ct = np.cos(theta)
12 1 tkerber
    mat = np.array([[ux ** 2 + ct * (1 - ux ** 2),
13 1 tkerber
                     ux * uy * (1 - ct) - uz * st,
14 1 tkerber
                     uz * ux * (1 - ct) + uy * st],
15 1 tkerber
                    [ux * uy * (1 - ct) + uz * st,
16 1 tkerber
                     uy ** 2 + ct * (1 - uy ** 2),
17 1 tkerber
                     uy * uz * (1 - ct) - ux * st],
18 1 tkerber
                    [uz * ux * (1 - ct) - uy * st,
19 1 tkerber
                     uy * uz * (1 - ct) + ux * st,
20 1 tkerber
                     uz ** 2 + ct * (1 - uz **2)]])
21 1 tkerber
    return (mat)
22 1 tkerber
23 1 tkerber
# Generates the rotation matrix which rotates aVec into intoVec
24 1 tkerber
def rotate_vec_into_newvec(aVec, intoVec):
25 1 tkerber
    def length(v):
26 1 tkerber
        return((sum(v ** 2)) ** 0.5)
27 1 tkerber
28 1 tkerber
    import numpy as np
29 1 tkerber
    from math import acos
30 1 tkerber
    fac = 1.0
31 1 tkerber
    aVec = np.array(aVec)
32 1 tkerber
    intoVec = np.array(intoVec)
33 1 tkerber
    nor = np.cross(aVec, intoVec)
34 1 tkerber
    if length(nor) == 0:
35 1 tkerber
        nor = np.array([1, 0, 0])
36 1 tkerber
    nor = nor / length(nor)
37 1 tkerber
    theta = acos(np.dot(aVec, intoVec) / (length(aVec) * length(intoVec)))
38 1 tkerber
    if np.dot(aVec, intoVec) < 0:
39 1 tkerber
        theta = theta + np.pi
40 1 tkerber
        fac = -1
41 1 tkerber
    return(fac * rotate_about_vec(nor, theta))
42 1 tkerber
43 1 tkerber
# Applies the rotation matrix to the vector and returns the rotated vector
44 1 tkerber
def rotate_vec (rot_mat, vec):
45 1 tkerber
    import numpy as np
46 1 tkerber
    rot_vec = np.dot(rot_mat, vec)
47 1 tkerber
48 1 tkerber
    return (rot_vec)