Statistiques
| Révision :

root / ase / utils / __init__.py

Historique | Voir | Annoter | Télécharger (3,34 ko)

1 1 tkerber
from math import sin, cos, radians, atan2, degrees
2 1 tkerber
3 1 tkerber
import numpy as np
4 1 tkerber
5 1 tkerber
6 1 tkerber
class DevNull:
7 1 tkerber
    def write(self, string): pass
8 1 tkerber
    def flush(self): pass
9 1 tkerber
    def tell(self): return 0
10 1 tkerber
    def close(self): pass
11 1 tkerber
12 1 tkerber
devnull = DevNull()
13 1 tkerber
14 1 tkerber
15 1 tkerber
def rotate(rotations, rotation=np.identity(3)):
16 1 tkerber
    """Convert string of format '50x,-10y,120z' to a rotation matrix.
17 1 tkerber

18 1 tkerber
    Note that the order of rotation matters, i.e. '50x,40z' is different
19 1 tkerber
    from '40z,50x'.
20 1 tkerber
    """
21 1 tkerber
22 1 tkerber
    if rotations == '':
23 1 tkerber
        return rotation.copy()
24 1 tkerber
25 1 tkerber
    for i, a in [('xyz'.index(s[-1]), radians(float(s[:-1])))
26 1 tkerber
                 for s in rotations.split(',')]:
27 1 tkerber
        s = sin(a)
28 1 tkerber
        c = cos(a)
29 1 tkerber
        if i == 0:
30 1 tkerber
            rotation = np.dot(rotation, [( 1,  0,  0),
31 1 tkerber
                                          ( 0,  c, s),
32 1 tkerber
                                          ( 0,  -s,  c)])
33 1 tkerber
        elif i == 1:
34 1 tkerber
            rotation = np.dot(rotation, [( c,  0, -s),
35 1 tkerber
                                          ( 0,  1,  0),
36 1 tkerber
                                          ( s,  0,  c)])
37 1 tkerber
        else:
38 1 tkerber
            rotation = np.dot(rotation, [( c, s,  0),
39 1 tkerber
                                          ( -s,  c,  0),
40 1 tkerber
                                          ( 0,  0,  1)])
41 1 tkerber
    return rotation
42 1 tkerber
43 1 tkerber
44 1 tkerber
def givens(a, b):
45 1 tkerber
    """Solve the equation system::
46 1 tkerber

47 1 tkerber
      [ c s]   [a]   [r]
48 1 tkerber
      [    ] . [ ] = [ ]
49 1 tkerber
      [-s c]   [b]   [0]
50 1 tkerber
    """
51 1 tkerber
    sgn = lambda x: cmp(x, 0)
52 1 tkerber
    if b == 0:
53 1 tkerber
        c = sgn(a)
54 1 tkerber
        s = 0
55 1 tkerber
        r = abs(a)
56 1 tkerber
    elif abs(b) >= abs(a):
57 1 tkerber
        cot = a / b
58 1 tkerber
        u = sgn(b) * (1 + cot**2)**.5
59 1 tkerber
        s = 1. / u
60 1 tkerber
        c = s * cot
61 1 tkerber
        r = b * u
62 1 tkerber
    else:
63 1 tkerber
        tan = b / a
64 1 tkerber
        u = sgn(a) * (1 + tan**2)**.5
65 1 tkerber
        c = 1. / u
66 1 tkerber
        s = c * tan
67 1 tkerber
        r = a * u
68 1 tkerber
    return c, s, r
69 1 tkerber
70 1 tkerber
71 1 tkerber
def irotate(rotation, initial=np.identity(3)):
72 1 tkerber
    """Determine x, y, z rotation angles from rotation matrix."""
73 1 tkerber
    a = np.dot(initial, rotation)
74 1 tkerber
    cx, sx, rx = givens(a[2, 2], a[1, 2])
75 1 tkerber
    cy, sy, ry = givens(rx, a[0, 2])
76 1 tkerber
    cz, sz, rz = givens(cx * a[1, 1] - sx * a[2, 1],
77 1 tkerber
                        cy * a[0, 1] - sy * (sx * a[1, 1] + cx * a[2, 1]))
78 1 tkerber
    x = degrees(atan2(sx, cx))
79 1 tkerber
    y = degrees(atan2(-sy, cy))
80 1 tkerber
    z = degrees(atan2(sz, cz))
81 1 tkerber
    return x, y, z
82 1 tkerber
83 1 tkerber
84 1 tkerber
def hsv2rgb(h, s, v):
85 1 tkerber
    """http://en.wikipedia.org/wiki/HSL_and_HSV
86 1 tkerber

87 1 tkerber
    h (hue) in [0, 360[
88 1 tkerber
    s (saturation) in [0, 1]
89 1 tkerber
    v (value) in [0, 1]
90 1 tkerber

91 1 tkerber
    return rgb in range [0, 1]
92 1 tkerber
    """
93 1 tkerber
    if v == 0:
94 1 tkerber
        return 0, 0, 0
95 1 tkerber
    if s == 0:
96 1 tkerber
        return v, v, v
97 1 tkerber
98 1 tkerber
    i, f = divmod(h / 60., 1)
99 1 tkerber
    p = v * (1 - s)
100 1 tkerber
    q = v * (1 - s * f)
101 1 tkerber
    t = v * (1 - s * (1 - f))
102 1 tkerber
103 1 tkerber
    if i == 0:
104 1 tkerber
        return v, t, p
105 1 tkerber
    elif i == 1:
106 1 tkerber
        return q, v, p
107 1 tkerber
    elif i == 2:
108 1 tkerber
        return p, v, t
109 1 tkerber
    elif i == 3:
110 1 tkerber
        return p, q, v
111 1 tkerber
    elif i == 4:
112 1 tkerber
        return t, p, v
113 1 tkerber
    elif i == 5:
114 1 tkerber
        return v, p, q
115 1 tkerber
    else:
116 1 tkerber
        raise RuntimeError, 'h must be in [0, 360]'
117 1 tkerber
118 1 tkerber
119 1 tkerber
def hsv(array, s=.9, v=.9):
120 1 tkerber
    array = (array + array.min()) * 359. / (array.max() - array.min())
121 1 tkerber
    result = np.empty((len(array.flat), 3))
122 1 tkerber
    for rgb, h in zip(result, array.flat):
123 1 tkerber
        rgb[:] = hsv2rgb(h, s, v)
124 1 tkerber
    return np.reshape(result, array.shape + (3,))
125 1 tkerber
126 1 tkerber
## This code does the same, but requires pylab
127 1 tkerber
## def cmap(array, name='hsv'):
128 1 tkerber
##     import pylab
129 1 tkerber
##     a = (array + array.min()) / array.ptp()
130 1 tkerber
##     rgba = getattr(pylab.cm, name)(a)
131 1 tkerber
##     return rgba[:-1] # return rgb only (not alpha)