Classes | Functions | Variables
pyexotica.transformations Namespace Reference

Classes

class  Arcball
 

Functions

def _import_module (name, package=None, warn=False, prefix='_py_', ignore='_')
 
def affine_matrix_from_points (v0, v1, shear=True, scale=True, usesvd=True)
 
def angle_between_vectors (v0, v1, directed=True, axis=0)
 
def arcball_constrain_to_axis (point, axis)
 
def arcball_map_to_sphere (point, center, radius)
 
def arcball_nearest_axis (point, axes)
 
def clip_matrix (left, right, bottom, top, near, far, perspective=False)
 
def compose_matrix (scale=None, shear=None, angles=None, translate=None, perspective=None)
 
def concatenate_matrices (matrices)
 
def decompose_matrix (matrix)
 
def euler_from_matrix (matrix, axes='sxyz')
 
def euler_from_quaternion (quaternion, axes='sxyz')
 
def euler_matrix (ai, aj, ak, axes='sxyz')
 
def identity_matrix ()
 
def inverse_matrix (matrix)
 
def is_same_quaternion (q0, q1)
 
def is_same_transform (matrix0, matrix1)
 
def orthogonalization_matrix (lengths, angles)
 
def projection_from_matrix (matrix, pseudo=False)
 
def projection_matrix (point, normal, direction=None, perspective=None, pseudo=False)
 
def quaternion_about_axis (angle, axis)
 
def quaternion_conjugate (quaternion)
 
def quaternion_from_euler (ai, aj, ak, axes='sxyz')
 
def quaternion_from_matrix (matrix, isprecise=False)
 
def quaternion_imag (quaternion)
 
def quaternion_inverse (quaternion)
 
def quaternion_matrix (quaternion)
 
def quaternion_multiply (quaternion1, quaternion0)
 
def quaternion_real (quaternion)
 
def quaternion_slerp (quat0, quat1, fraction, spin=0, shortestpath=True)
 
def random_quaternion (rand=None)
 
def random_rotation_matrix (rand=None)
 
def random_vector (size)
 
def reflection_from_matrix (matrix)
 
def reflection_matrix (point, normal)
 
def rotation_from_matrix (matrix)
 
def rotation_matrix (angle, direction, point=None)
 
def scale_from_matrix (matrix)
 
def scale_matrix (factor, origin=None, direction=None)
 
def shear_from_matrix (matrix)
 
def shear_matrix (angle, direction, point, normal)
 
def superimposition_matrix (v0, v1, scale=False, usesvd=True)
 
def translation_from_matrix (matrix)
 
def translation_matrix (direction)
 
def unit_vector (data, axis=None, out=None)
 
def vector_norm (data, axis=None, out=None)
 
def vector_product (v0, v1, axis=0)
 

Variables

tuple __all__ = ()
 
string __docformat__ = 'restructuredtext en'
 
string __version__ = '2017.02.17'
 
dictionary _AXES2TUPLE
 
float _EPS = numpy.finfo(float).eps*4.0
 
list _NEXT_AXIS = [1, 2, 0, 1]
 
 _TUPLE2AXES = dict((v, k) for k, v in _AXES2TUPLE.items())
 
 precision
 
 suppress
 
 True
 

Function Documentation

def pyexotica.transformations._import_module (   name,
  package = None,
  warn = False,
  prefix = '_py_',
  ignore = '_' 
)
private
Try import all public attributes from module into global namespace.

Existing attributes with name clashes are renamed with prefix.
Attributes starting with underscore are ignored by default.

Return True on successful import.

Definition at line 1894 of file transformations.py.

def pyexotica.transformations.affine_matrix_from_points (   v0,
  v1,
  shear = True,
  scale = True,
  usesvd = True 
)
Return affine transform matrix to register two point sets.

v0 and v1 are shape (ndims, \*) arrays of at least ndims non-homogeneous
coordinates, where ndims is the dimensionality of the coordinate space.

If shear is False, a similarity transformation matrix is returned.
If also scale is False, a rigid/Euclidean transformation matrix
is returned.

By default the algorithm by Hartley and Zissermann [15] is used.
If usesvd is True, similarity and Euclidean transformation matrices
are calculated by minimizing the weighted sum of squared deviations
(RMSD) according to the algorithm by Kabsch [8].
Otherwise, and if ndims is 3, the quaternion based algorithm by Horn [9]
is used, which is slower when using this Python implementation.

The returned matrix performs rotation, translation and uniform scaling
(if specified).

>>> v0 = [[0, 1031, 1031, 0], [0, 0, 1600, 1600]]
>>> v1 = [[675, 826, 826, 677], [55, 52, 281, 277]]
>>> affine_matrix_from_points(v0, v1)
array([[   0.14549,    0.00062,  675.50008],
       [   0.00048,    0.14094,   53.24971],
       [   0.     ,    0.     ,    1.     ]])
>>> T = translation_matrix(numpy.random.random(3)-0.5)
>>> R = random_rotation_matrix(numpy.random.random(3))
>>> S = scale_matrix(random.random())
>>> M = concatenate_matrices(T, R, S)
>>> v0 = (numpy.random.rand(4, 100) - 0.5) * 20
>>> v0[3] = 1
>>> v1 = numpy.dot(M, v0)
>>> v0[:3] += numpy.random.normal(0, 1e-8, 300).reshape(3, -1)
>>> M = affine_matrix_from_points(v0[:3], v1[:3])
>>> numpy.allclose(v1, numpy.dot(M, v0))
True

More examples in superimposition_matrix()

Definition at line 889 of file transformations.py.

def pyexotica.transformations.angle_between_vectors (   v0,
  v1,
  directed = True,
  axis = 0 
)
Return angle between vectors.

If directed is False, the input vectors are interpreted as undirected axes,
i.e. the maximum angle is pi/2.

>>> a = angle_between_vectors([1, -2, 3], [-1, 2, -3])
>>> numpy.allclose(a, math.pi)
True
>>> a = angle_between_vectors([1, -2, 3], [-1, 2, -3], directed=False)
>>> numpy.allclose(a, 0)
True
>>> v0 = [[2, 0, 0, 2], [0, 2, 0, 2], [0, 0, 2, 2]]
>>> v1 = [[3], [0], [0]]
>>> a = angle_between_vectors(v0, v1)
>>> numpy.allclose(a, [0, 1.5708, 1.5708, 0.95532])
True
>>> v0 = [[2, 0, 0], [2, 0, 0], [0, 2, 0], [2, 0, 0]]
>>> v1 = [[0, 3, 0], [0, 0, 3], [0, 0, 3], [3, 3, 3]]
>>> a = angle_between_vectors(v0, v1, axis=1)
>>> numpy.allclose(a, [1.5708, 1.5708, 1.5708, 0.95532])
True

Definition at line 1808 of file transformations.py.

def pyexotica.transformations.arcball_constrain_to_axis (   point,
  axis 
)
Return sphere point perpendicular to axis.

Definition at line 1640 of file transformations.py.

def pyexotica.transformations.arcball_map_to_sphere (   point,
  center,
  radius 
)
Return unit sphere coordinates from window coordinates.

Definition at line 1627 of file transformations.py.

def pyexotica.transformations.arcball_nearest_axis (   point,
  axes 
)
Return axis, which arc is nearest to point.

Definition at line 1656 of file transformations.py.

def pyexotica.transformations.clip_matrix (   left,
  right,
  bottom,
  top,
  near,
  far,
  perspective = False 
)
Return matrix to obtain normalized device coordinates from frustum.

The frustum bounds are axis-aligned along x (left, right),
y (bottom, top) and z (near, far).

Normalized device coordinates are in range [-1, 1] if coordinates are
inside the frustum.

If perspective is True the frustum is a truncated pyramid with the
perspective point at origin and direction along z axis, otherwise an
orthographic canonical view volume (a box).

Homogeneous coordinates transformed by the perspective clip matrix
need to be dehomogenized (divided by w coordinate).

>>> frustum = numpy.random.rand(6)
>>> frustum[1] += frustum[0]
>>> frustum[3] += frustum[2]
>>> frustum[5] += frustum[4]
>>> M = clip_matrix(perspective=False, *frustum)
>>> numpy.dot(M, [frustum[0], frustum[2], frustum[4], 1])
array([-1., -1., -1.,  1.])
>>> numpy.dot(M, [frustum[1], frustum[3], frustum[5], 1])
array([ 1.,  1.,  1.,  1.])
>>> M = clip_matrix(perspective=True, *frustum)
>>> v = numpy.dot(M, [frustum[0], frustum[2], frustum[4], 1])
>>> v / v[3]
array([-1., -1., -1.,  1.])
>>> v = numpy.dot(M, [frustum[1], frustum[3], frustum[4], 1])
>>> v / v[3]
array([ 1.,  1., -1.,  1.])

Definition at line 596 of file transformations.py.

def pyexotica.transformations.compose_matrix (   scale = None,
  shear = None,
  angles = None,
  translate = None,
  perspective = None 
)
Return transformation matrix from sequence of transformations.

This is the inverse of the decompose_matrix function.

Sequence of transformations:
    scale : vector of 3 scaling factors
    shear : list of shear factors for x-y, x-z, y-z axes
    angles : list of Euler angles about static x, y, z axes
    translate : translation vector along x, y, z axes
    perspective : perspective partition of matrix

>>> scale = numpy.random.random(3) - 0.5
>>> shear = numpy.random.random(3) - 0.5
>>> angles = (numpy.random.random(3) - 0.5) * (2*math.pi)
>>> trans = numpy.random.random(3) - 0.5
>>> persp = numpy.random.random(4) - 0.5
>>> M0 = compose_matrix(scale, shear, angles, trans, persp)
>>> result = decompose_matrix(M0)
>>> M1 = compose_matrix(*result)
>>> is_same_transform(M0, M1)
True

Definition at line 810 of file transformations.py.

def pyexotica.transformations.concatenate_matrices (   matrices)
Return concatenation of series of transformation matrices.

>>> M = numpy.random.rand(16).reshape((4, 4)) - 0.5
>>> numpy.allclose(M, concatenate_matrices(M))
True
>>> numpy.allclose(numpy.dot(M, M.T), concatenate_matrices(M, M.T))
True

Definition at line 1855 of file transformations.py.

def pyexotica.transformations.decompose_matrix (   matrix)
Return sequence of transformations from transformation matrix.

matrix : array_like
    Non-degenerative homogeneous transformation matrix

Return tuple of:
    scale : vector of 3 scaling factors
    shear : list of shear factors for x-y, x-z, y-z axes
    angles : list of Euler angles about static x, y, z axes
    translate : translation vector along x, y, z axes
    perspective : perspective partition of matrix

Raise ValueError if matrix is of wrong type or degenerative.

>>> T0 = translation_matrix([1, 2, 3])
>>> scale, shear, angles, trans, persp = decompose_matrix(T0)
>>> T1 = translation_matrix(trans)
>>> numpy.allclose(T0, T1)
True
>>> S = scale_matrix(0.123)
>>> scale, shear, angles, trans, persp = decompose_matrix(S)
>>> scale[0]
0.123
>>> R0 = euler_matrix(1, 2, 3)
>>> scale, shear, angles, trans, persp = decompose_matrix(R0)
>>> R1 = euler_matrix(*angles)
>>> numpy.allclose(R0, R1)
True

Definition at line 724 of file transformations.py.

def pyexotica.transformations.euler_from_matrix (   matrix,
  axes = 'sxyz' 
)
Return Euler angles from rotation matrix for specified axis sequence.

axes : One of 24 axis sequences as string or encoded tuple

Note that many Euler angle triplets can describe one matrix.

>>> R0 = euler_matrix(1, 2, 3, 'syxz')
>>> al, be, ga = euler_from_matrix(R0, 'syxz')
>>> R1 = euler_matrix(al, be, ga, 'syxz')
>>> numpy.allclose(R0, R1)
True
>>> angles = (4*math.pi) * (numpy.random.random(3) - 0.5)
>>> for axes in _AXES2TUPLE.keys():
...    R0 = euler_matrix(axes=axes, *angles)
...    R1 = euler_matrix(axes=axes, *euler_from_matrix(R0, axes))
...    if not numpy.allclose(R0, R1): print(axes, "failed")

Definition at line 1112 of file transformations.py.

def pyexotica.transformations.euler_from_quaternion (   quaternion,
  axes = 'sxyz' 
)
Return Euler angles from quaternion for specified axis sequence.

>>> angles = euler_from_quaternion([0.99810947, 0.06146124, 0, 0])
>>> numpy.allclose(angles, [0.123, 0, 0])
True

Definition at line 1170 of file transformations.py.

def pyexotica.transformations.euler_matrix (   ai,
  aj,
  ak,
  axes = 'sxyz' 
)
Return homogeneous rotation matrix from Euler angles and axis sequence.

ai, aj, ak : Euler's roll, pitch and yaw angles
axes : One of 24 axis sequences as string or encoded tuple

>>> R = euler_matrix(1, 2, 3, 'syxz')
>>> numpy.allclose(numpy.sum(R[0]), -1.34786452)
True
>>> R = euler_matrix(1, 2, 3, (0, 1, 0, 1))
>>> numpy.allclose(numpy.sum(R[0]), -0.383436184)
True
>>> ai, aj, ak = (4*math.pi) * (numpy.random.random(3) - 0.5)
>>> for axes in _AXES2TUPLE.keys():
...    R = euler_matrix(ai, aj, ak, axes)
>>> for axes in _TUPLE2AXES.keys():
...    R = euler_matrix(ai, aj, ak, axes)

Definition at line 1049 of file transformations.py.

def pyexotica.transformations.identity_matrix ( )
Return 4x4 identity/unit matrix.

>>> I = identity_matrix()
>>> numpy.allclose(I, numpy.dot(I, I))
True
>>> numpy.sum(I), numpy.trace(I)
(4.0, 4.0)
>>> numpy.allclose(I, numpy.identity(4))
True

Definition at line 207 of file transformations.py.

def pyexotica.transformations.inverse_matrix (   matrix)
Return inverse of square transformation matrix.

>>> M0 = random_rotation_matrix()
>>> M1 = inverse_matrix(M0.T)
>>> numpy.allclose(M1, numpy.linalg.inv(M0.T))
True
>>> for size in range(1, 7):
...     M0 = numpy.random.rand(size, size)
...     M1 = inverse_matrix(M0)
...     if not numpy.allclose(M1, numpy.linalg.inv(M0)): print(size)

Definition at line 1839 of file transformations.py.

def pyexotica.transformations.is_same_quaternion (   q0,
  q1 
)
Return True if two quaternions are equal.

Definition at line 1887 of file transformations.py.

def pyexotica.transformations.is_same_transform (   matrix0,
  matrix1 
)
Return True if two matrices perform same transformation.

>>> is_same_transform(numpy.identity(4), numpy.identity(4))
True
>>> is_same_transform(numpy.identity(4), random_rotation_matrix())
False

Definition at line 1871 of file transformations.py.

def pyexotica.transformations.orthogonalization_matrix (   lengths,
  angles 
)
Return orthogonalization matrix for crystallographic cell coordinates.

Angles are expected in degrees.

The de-orthogonalization matrix is the inverse.

>>> O = orthogonalization_matrix([10, 10, 10], [90, 90, 90])
>>> numpy.allclose(O[:3, :3], numpy.identity(3, float) * 10)
True
>>> O = orthogonalization_matrix([9.8, 12.0, 15.5], [87.2, 80.7, 69.7])
>>> numpy.allclose(numpy.sum(O), 43.063229)
True

Definition at line 862 of file transformations.py.

def pyexotica.transformations.projection_from_matrix (   matrix,
  pseudo = False 
)
Return projection plane and perspective point from projection matrix.

Return values are same as arguments for projection_matrix function:
point, normal, direction, perspective, and pseudo.

>>> point = numpy.random.random(3) - 0.5
>>> normal = numpy.random.random(3) - 0.5
>>> direct = numpy.random.random(3) - 0.5
>>> persp = numpy.random.random(3) - 0.5
>>> P0 = projection_matrix(point, normal)
>>> result = projection_from_matrix(P0)
>>> P1 = projection_matrix(*result)
>>> is_same_transform(P0, P1)
True
>>> P0 = projection_matrix(point, normal, direct)
>>> result = projection_from_matrix(P0)
>>> P1 = projection_matrix(*result)
>>> is_same_transform(P0, P1)
True
>>> P0 = projection_matrix(point, normal, perspective=persp, pseudo=False)
>>> result = projection_from_matrix(P0, pseudo=False)
>>> P1 = projection_matrix(*result)
>>> is_same_transform(P0, P1)
True
>>> P0 = projection_matrix(point, normal, perspective=persp, pseudo=True)
>>> result = projection_from_matrix(P0, pseudo=True)
>>> P1 = projection_matrix(*result)
>>> is_same_transform(P0, P1)
True

Definition at line 523 of file transformations.py.

def pyexotica.transformations.projection_matrix (   point,
  normal,
  direction = None,
  perspective = None,
  pseudo = False 
)
Return matrix to project onto plane defined by point and normal.

Using either perspective point, projection direction, or none of both.

If pseudo is True, perspective projections will preserve relative depth
such that Perspective = dot(Orthogonal, PseudoPerspective).

>>> P = projection_matrix([0, 0, 0], [1, 0, 0])
>>> numpy.allclose(P[1:, 1:], numpy.identity(4)[1:, 1:])
True
>>> point = numpy.random.random(3) - 0.5
>>> normal = numpy.random.random(3) - 0.5
>>> direct = numpy.random.random(3) - 0.5
>>> persp = numpy.random.random(3) - 0.5
>>> P0 = projection_matrix(point, normal)
>>> P1 = projection_matrix(point, normal, direction=direct)
>>> P2 = projection_matrix(point, normal, perspective=persp)
>>> P3 = projection_matrix(point, normal, perspective=persp, pseudo=True)
>>> is_same_transform(P2, numpy.dot(P0, P3))
True
>>> P = projection_matrix([3, 0, 0], [1, 1, 0], [1, 0, 0])
>>> v0 = (numpy.random.rand(4, 5) - 0.5) * 20
>>> v0[3] = 1
>>> v1 = numpy.dot(P, v0)
>>> numpy.allclose(v1[1], v0[1])
True
>>> numpy.allclose(v1[0], 3-v1[1])
True

Definition at line 462 of file transformations.py.

def pyexotica.transformations.quaternion_about_axis (   angle,
  axis 
)
Return quaternion for rotation about axis.

>>> q = quaternion_about_axis(0.123, [1, 0, 0])
>>> numpy.allclose(q, [0.99810947, 0.06146124, 0, 0])
True

Definition at line 1238 of file transformations.py.

def pyexotica.transformations.quaternion_conjugate (   quaternion)
Return conjugate of quaternion.

>>> q0 = random_quaternion()
>>> q1 = quaternion_conjugate(q0)
>>> q1[0] == q0[0] and all(q1[1:] == -q0[1:])
True

Definition at line 1383 of file transformations.py.

def pyexotica.transformations.quaternion_from_euler (   ai,
  aj,
  ak,
  axes = 'sxyz' 
)
Return quaternion from Euler angles and axis sequence.

ai, aj, ak : Euler's roll, pitch and yaw angles
axes : One of 24 axis sequences as string or encoded tuple

>>> q = quaternion_from_euler(1, 2, 3, 'ryxz')
>>> numpy.allclose(q, [0.435953, 0.310622, -0.718287, 0.444435])
True

Definition at line 1181 of file transformations.py.

def pyexotica.transformations.quaternion_from_matrix (   matrix,
  isprecise = False 
)
Return quaternion from rotation matrix.

If isprecise is True, the input matrix is assumed to be a precise rotation
matrix and a faster algorithm is used.

>>> q = quaternion_from_matrix(numpy.identity(4), True)
>>> numpy.allclose(q, [1, 0, 0, 0])
True
>>> q = quaternion_from_matrix(numpy.diag([1, -1, -1, 1]))
>>> numpy.allclose(q, [0, 1, 0, 0]) or numpy.allclose(q, [0, -1, 0, 0])
True
>>> R = rotation_matrix(0.123, (1, 2, 3))
>>> q = quaternion_from_matrix(R, True)
>>> numpy.allclose(q, [0.9981095, 0.0164262, 0.0328524, 0.0492786])
True
>>> R = [[-0.545, 0.797, 0.260, 0], [0.733, 0.603, -0.313, 0],
...      [-0.407, 0.021, -0.913, 0], [0, 0, 0, 1]]
>>> q = quaternion_from_matrix(R)
>>> numpy.allclose(q, [0.19069, 0.43736, 0.87485, -0.083611])
True
>>> R = [[0.395, 0.362, 0.843, 0], [-0.626, 0.796, -0.056, 0],
...      [-0.677, -0.498, 0.529, 0], [0, 0, 0, 1]]
>>> q = quaternion_from_matrix(R)
>>> numpy.allclose(q, [0.82336615, -0.13610694, 0.46344705, -0.29792603])
True
>>> R = random_rotation_matrix()
>>> q = quaternion_from_matrix(R)
>>> is_same_transform(R, quaternion_matrix(q))
True
>>> is_same_quaternion(quaternion_from_matrix(R, isprecise=False),
...                    quaternion_from_matrix(R, isprecise=True))
True
>>> R = euler_matrix(0.0, 0.0, numpy.pi/2.0)
>>> is_same_quaternion(quaternion_from_matrix(R, isprecise=False),
...                    quaternion_from_matrix(R, isprecise=True))
True

Definition at line 1281 of file transformations.py.

def pyexotica.transformations.quaternion_imag (   quaternion)
Return imaginary part of quaternion.

>>> quaternion_imag([3, 0, 1, 2])
array([ 0.,  1.,  2.])

Definition at line 1421 of file transformations.py.

def pyexotica.transformations.quaternion_inverse (   quaternion)
Return inverse of quaternion.

>>> q0 = random_quaternion()
>>> q1 = quaternion_inverse(q0)
>>> numpy.allclose(quaternion_multiply(q0, q1), [1, 0, 0, 0])
True

Definition at line 1397 of file transformations.py.

def pyexotica.transformations.quaternion_matrix (   quaternion)
Return homogeneous rotation matrix from quaternion.

>>> M = quaternion_matrix([0.99810947, 0.06146124, 0, 0])
>>> numpy.allclose(M, rotation_matrix(0.123, [1, 0, 0]))
True
>>> M = quaternion_matrix([1, 0, 0, 0])
>>> numpy.allclose(M, numpy.identity(4))
True
>>> M = quaternion_matrix([0, 1, 0, 0])
>>> numpy.allclose(M, numpy.diag([1, -1, -1, 1]))
True

Definition at line 1254 of file transformations.py.

def pyexotica.transformations.quaternion_multiply (   quaternion1,
  quaternion0 
)
Return multiplication of two quaternions.

>>> q = quaternion_multiply([4, 1, -2, 3], [8, -5, 6, 7])
>>> numpy.allclose(q, [28, -44, -14, 48])
True

Definition at line 1366 of file transformations.py.

def pyexotica.transformations.quaternion_real (   quaternion)
Return real part of quaternion.

>>> quaternion_real([3, 0, 1, 2])
3.0

Definition at line 1411 of file transformations.py.

def pyexotica.transformations.quaternion_slerp (   quat0,
  quat1,
  fraction,
  spin = 0,
  shortestpath = True 
)
Return spherical linear interpolation between two quaternions.

>>> q0 = random_quaternion()
>>> q1 = random_quaternion()
>>> q = quaternion_slerp(q0, q1, 0)
>>> numpy.allclose(q, q0)
True
>>> q = quaternion_slerp(q0, q1, 1, 1)
>>> numpy.allclose(q, q1)
True
>>> q = quaternion_slerp(q0, q1, 0.5)
>>> angle = math.acos(numpy.dot(q0, q))
>>> numpy.allclose(2, math.acos(numpy.dot(q0, q1)) / angle) or \
    numpy.allclose(2, math.acos(-numpy.dot(q0, q1)) / angle)
True

Definition at line 1431 of file transformations.py.

def pyexotica.transformations.random_quaternion (   rand = None)
Return uniform random unit quaternion.

rand: array like or None
    Three independent random variables that are uniformly distributed
    between 0 and 1.

>>> q = random_quaternion()
>>> numpy.allclose(1, vector_norm(q))
True
>>> q = random_quaternion(numpy.random.random(3))
>>> len(q.shape), q.shape[0]==4
(1, True)

Definition at line 1472 of file transformations.py.

def pyexotica.transformations.random_rotation_matrix (   rand = None)
Return uniform random rotation matrix.

rand: array like
    Three independent random variables that are uniformly distributed
    between 0 and 1 for each returned quaternion.

>>> R = random_rotation_matrix()
>>> numpy.allclose(numpy.dot(R.T, R), numpy.identity(4))
True

Definition at line 1500 of file transformations.py.

def pyexotica.transformations.random_vector (   size)
Return array of random doubles in the half-open interval [0.0, 1.0).

>>> v = random_vector(10000)
>>> numpy.all(v >= 0) and numpy.all(v < 1)
True
>>> v0 = random_vector(10)
>>> v1 = random_vector(10)
>>> numpy.any(v0 == v1)
False

Definition at line 1772 of file transformations.py.

def pyexotica.transformations.reflection_from_matrix (   matrix)
Return mirror plane point and normal vector from reflection matrix.

>>> v0 = numpy.random.random(3) - 0.5
>>> v1 = numpy.random.random(3) - 0.5
>>> M0 = reflection_matrix(v0, v1)
>>> point, normal = reflection_from_matrix(M0)
>>> M1 = reflection_matrix(point, normal)
>>> is_same_transform(M0, M1)
True

Definition at line 273 of file transformations.py.

def pyexotica.transformations.reflection_matrix (   point,
  normal 
)
Return matrix to mirror at plane defined by point and normal vector.

>>> v0 = numpy.random.random(4) - 0.5
>>> v0[3] = 1.
>>> v1 = numpy.random.random(3) - 0.5
>>> R = reflection_matrix(v0, v1)
>>> numpy.allclose(2, numpy.trace(R))
True
>>> numpy.allclose(v0, numpy.dot(R, v0))
True
>>> v2 = v0.copy()
>>> v2[:3] += v1
>>> v3 = v0.copy()
>>> v2[:3] -= v1
>>> numpy.allclose(v2, numpy.dot(R, v3))
True

Definition at line 247 of file transformations.py.

def pyexotica.transformations.rotation_from_matrix (   matrix)
Return rotation angle and axis from rotation matrix.

>>> angle = (random.random() - 0.5) * (2*math.pi)
>>> direc = numpy.random.random(3) - 0.5
>>> point = numpy.random.random(3) - 0.5
>>> R0 = rotation_matrix(angle, direc, point)
>>> angle, direc, point = rotation_from_matrix(R0)
>>> R1 = rotation_matrix(angle, direc, point)
>>> is_same_transform(R0, R1)
True

Definition at line 346 of file transformations.py.

def pyexotica.transformations.rotation_matrix (   angle,
  direction,
  point = None 
)
Return matrix to rotate about axis defined by point and direction.

>>> R = rotation_matrix(math.pi/2, [0, 0, 1], [1, 0, 0])
>>> numpy.allclose(numpy.dot(R, [0, 0, 0, 1]), [1, -1, 0, 1])
True
>>> angle = (random.random() - 0.5) * (2*math.pi)
>>> direc = numpy.random.random(3) - 0.5
>>> point = numpy.random.random(3) - 0.5
>>> R0 = rotation_matrix(angle, direc, point)
>>> R1 = rotation_matrix(angle-2*math.pi, direc, point)
>>> is_same_transform(R0, R1)
True
>>> R0 = rotation_matrix(angle, direc, point)
>>> R1 = rotation_matrix(-angle, -direc, point)
>>> is_same_transform(R0, R1)
True
>>> I = numpy.identity(4, numpy.float64)
>>> numpy.allclose(I, rotation_matrix(math.pi*2, direc))
True
>>> numpy.allclose(2, numpy.trace(rotation_matrix(math.pi/2,
...                                               direc, point)))
True

Definition at line 302 of file transformations.py.

def pyexotica.transformations.scale_from_matrix (   matrix)
Return scaling factor, origin and direction from scaling matrix.

>>> factor = random.random() * 10 - 5
>>> origin = numpy.random.random(3) - 0.5
>>> direct = numpy.random.random(3) - 0.5
>>> S0 = scale_matrix(factor, origin)
>>> factor, origin, direction = scale_from_matrix(S0)
>>> S1 = scale_matrix(factor, origin, direction)
>>> is_same_transform(S0, S1)
True
>>> S0 = scale_matrix(factor, origin, direct)
>>> factor, origin, direction = scale_from_matrix(S0)
>>> S1 = scale_matrix(factor, origin, direction)
>>> is_same_transform(S0, S1)
True

Definition at line 420 of file transformations.py.

def pyexotica.transformations.scale_matrix (   factor,
  origin = None,
  direction = None 
)
Return matrix to scale by factor around origin in direction.

Use factor -1 for point symmetry.

>>> v = (numpy.random.rand(4, 5) - 0.5) * 20
>>> v[3] = 1
>>> S = scale_matrix(-1.234)
>>> numpy.allclose(numpy.dot(S, v)[:3], -1.234*v[:3])
True
>>> factor = random.random() * 10 - 5
>>> origin = numpy.random.random(3) - 0.5
>>> direct = numpy.random.random(3) - 0.5
>>> S = scale_matrix(factor, origin)
>>> S = scale_matrix(factor, origin, direct)

Definition at line 386 of file transformations.py.

def pyexotica.transformations.shear_from_matrix (   matrix)
Return shear angle, direction and plane from shear matrix.

>>> angle = (random.random() - 0.5) * 4*math.pi
>>> direct = numpy.random.random(3) - 0.5
>>> point = numpy.random.random(3) - 0.5
>>> normal = numpy.cross(direct, numpy.random.random(3))
>>> S0 = shear_matrix(angle, direct, point, normal)
>>> angle, direct, point, normal = shear_from_matrix(S0)
>>> S1 = shear_matrix(angle, direct, point, normal)
>>> is_same_transform(S0, S1)
True

Definition at line 679 of file transformations.py.

def pyexotica.transformations.shear_matrix (   angle,
  direction,
  point,
  normal 
)
Return matrix to shear by angle along direction vector on shear plane.

The shear plane is defined by a point and normal vector. The direction
vector must be orthogonal to the plane's normal vector.

A point P is transformed by the shear matrix into P" such that
the vector P-P" is parallel to the direction vector and its extent is
given by the angle of P-P'-P", where P' is the orthogonal projection
of P onto the shear plane.

>>> angle = (random.random() - 0.5) * 4*math.pi
>>> direct = numpy.random.random(3) - 0.5
>>> point = numpy.random.random(3) - 0.5
>>> normal = numpy.cross(direct, numpy.random.random(3))
>>> S = shear_matrix(angle, direct, point, normal)
>>> numpy.allclose(1, numpy.linalg.det(S))
True

Definition at line 648 of file transformations.py.

def pyexotica.transformations.superimposition_matrix (   v0,
  v1,
  scale = False,
  usesvd = True 
)
Return matrix to transform given 3D point set into second point set.

v0 and v1 are shape (3, \*) or (4, \*) arrays of at least 3 points.

The parameters scale and usesvd are explained in the more general
affine_matrix_from_points function.

The returned matrix is a similarity or Euclidean transformation matrix.
This function has a fast C implementation in transformations.c.

>>> v0 = numpy.random.rand(3, 10)
>>> M = superimposition_matrix(v0, v0)
>>> numpy.allclose(M, numpy.identity(4))
True
>>> R = random_rotation_matrix(numpy.random.random(3))
>>> v0 = [[1,0,0], [0,1,0], [0,0,1], [1,1,1]]
>>> v1 = numpy.dot(R, v0)
>>> M = superimposition_matrix(v0, v1)
>>> numpy.allclose(v1, numpy.dot(M, v0))
True
>>> v0 = (numpy.random.rand(4, 100) - 0.5) * 20
>>> v0[3] = 1
>>> v1 = numpy.dot(R, v0)
>>> M = superimposition_matrix(v0, v1)
>>> numpy.allclose(v1, numpy.dot(M, v0))
True
>>> S = scale_matrix(random.random())
>>> T = translation_matrix(numpy.random.random(3)-0.5)
>>> M = concatenate_matrices(T, R, S)
>>> v1 = numpy.dot(M, v0)
>>> v0[:3] += numpy.random.normal(0, 1e-9, 300).reshape(3, -1)
>>> M = superimposition_matrix(v0, v1, scale=True)
>>> numpy.allclose(v1, numpy.dot(M, v0))
True
>>> M = superimposition_matrix(v0, v1, scale=True, usesvd=False)
>>> numpy.allclose(v1, numpy.dot(M, v0))
True
>>> v = numpy.empty((4, 100, 3))
>>> v[:, :, 0] = v0
>>> M = superimposition_matrix(v0, v1, scale=True, usesvd=False)
>>> numpy.allclose(v1, numpy.dot(M, v[:, :, 0]))
True

Definition at line 998 of file transformations.py.

def pyexotica.transformations.translation_from_matrix (   matrix)
Return translation vector from translation matrix.

>>> v0 = numpy.random.random(3) - 0.5
>>> v1 = translation_from_matrix(translation_matrix(v0))
>>> numpy.allclose(v0, v1)
True

Definition at line 235 of file transformations.py.

def pyexotica.transformations.translation_matrix (   direction)
Return matrix to translate by direction vector.

>>> v = numpy.random.random(3) - 0.5
>>> numpy.allclose(v, translation_matrix(v)[:3, 3])
True

Definition at line 222 of file transformations.py.

def pyexotica.transformations.unit_vector (   data,
  axis = None,
  out = None 
)
Return ndarray normalized by length, i.e. Euclidean norm, along axis.

>>> v0 = numpy.random.random(3)
>>> v1 = unit_vector(v0)
>>> numpy.allclose(v1, v0 / numpy.linalg.norm(v0))
True
>>> v0 = numpy.random.rand(5, 4, 3)
>>> v1 = unit_vector(v0, axis=-1)
>>> v2 = v0 / numpy.expand_dims(numpy.sqrt(numpy.sum(v0*v0, axis=2)), 2)
>>> numpy.allclose(v1, v2)
True
>>> v1 = unit_vector(v0, axis=1)
>>> v2 = v0 / numpy.expand_dims(numpy.sqrt(numpy.sum(v0*v0, axis=1)), 1)
>>> numpy.allclose(v1, v2)
True
>>> v1 = numpy.empty((5, 4, 3))
>>> unit_vector(v0, axis=1, out=v1)
>>> numpy.allclose(v1, v2)
True
>>> list(unit_vector([]))
[]
>>> list(unit_vector([1]))
[1.0]

Definition at line 1728 of file transformations.py.

def pyexotica.transformations.vector_norm (   data,
  axis = None,
  out = None 
)
Return length, i.e. Euclidean norm, of ndarray along axis.

>>> v = numpy.random.random(3)
>>> n = vector_norm(v)
>>> numpy.allclose(n, numpy.linalg.norm(v))
True
>>> v = numpy.random.rand(6, 5, 3)
>>> n = vector_norm(v, axis=-1)
>>> numpy.allclose(n, numpy.sqrt(numpy.sum(v*v, axis=2)))
True
>>> n = vector_norm(v, axis=1)
>>> numpy.allclose(n, numpy.sqrt(numpy.sum(v*v, axis=1)))
True
>>> v = numpy.random.rand(5, 4, 3)
>>> n = numpy.empty((5, 3))
>>> vector_norm(v, axis=1, out=n)
>>> numpy.allclose(n, numpy.sqrt(numpy.sum(v*v, axis=1)))
True
>>> vector_norm([])
0.0
>>> vector_norm([1])
1.0

Definition at line 1689 of file transformations.py.

def pyexotica.transformations.vector_product (   v0,
  v1,
  axis = 0 
)
Return vector perpendicular to vectors.

>>> v = vector_product([2, 0, 0], [0, 3, 0])
>>> numpy.allclose(v, [0, 0, 6])
True
>>> v0 = [[2, 0, 0, 2], [0, 2, 0, 2], [0, 0, 2, 2]]
>>> v1 = [[3], [0], [0]]
>>> v = vector_product(v0, v1)
>>> numpy.allclose(v, [[0, 0, 0, 0], [0, 0, 6, 6], [0, -6, 0, -6]])
True
>>> v0 = [[2, 0, 0], [2, 0, 0], [0, 2, 0], [2, 0, 0]]
>>> v1 = [[0, 3, 0], [0, 0, 3], [0, 0, 3], [3, 3, 3]]
>>> v = vector_product(v0, v1, axis=1)
>>> numpy.allclose(v, [[0, 0, 6], [0, -6, 0], [6, 0, 0], [0, -6, 6]])
True

Definition at line 1787 of file transformations.py.

Variable Documentation

tuple pyexotica.transformations.__all__ = ()
private

Definition at line 204 of file transformations.py.

string pyexotica.transformations.__docformat__ = 'restructuredtext en'
private

Definition at line 203 of file transformations.py.

string pyexotica.transformations.__version__ = '2017.02.17'
private

Definition at line 202 of file transformations.py.

dictionary pyexotica.transformations._AXES2TUPLE
private
Initial value:
1 = {
2  'sxyz': (0, 0, 0, 0), 'sxyx': (0, 0, 1, 0), 'sxzy': (0, 1, 0, 0),
3  'sxzx': (0, 1, 1, 0), 'syzx': (1, 0, 0, 0), 'syzy': (1, 0, 1, 0),
4  'syxz': (1, 1, 0, 0), 'syxy': (1, 1, 1, 0), 'szxy': (2, 0, 0, 0),
5  'szxz': (2, 0, 1, 0), 'szyx': (2, 1, 0, 0), 'szyz': (2, 1, 1, 0),
6  'rzyx': (0, 0, 0, 1), 'rxyx': (0, 0, 1, 1), 'ryzx': (0, 1, 0, 1),
7  'rxzx': (0, 1, 1, 1), 'rxzy': (1, 0, 0, 1), 'ryzy': (1, 0, 1, 1),
8  'rzxy': (1, 1, 0, 1), 'ryxy': (1, 1, 1, 1), 'ryxz': (2, 0, 0, 1),
9  'rzxz': (2, 0, 1, 1), 'rxyz': (2, 1, 0, 1), 'rzyz': (2, 1, 1, 1)}

Definition at line 1676 of file transformations.py.

float pyexotica.transformations._EPS = numpy.finfo(float).eps*4.0
private

Definition at line 1670 of file transformations.py.

list pyexotica.transformations._NEXT_AXIS = [1, 2, 0, 1]
private

Definition at line 1673 of file transformations.py.

pyexotica.transformations._TUPLE2AXES = dict((v, k) for k, v in _AXES2TUPLE.items())
private

Definition at line 1686 of file transformations.py.

pyexotica.transformations.precision

Definition at line 1931 of file transformations.py.

pyexotica.transformations.suppress

Definition at line 1931 of file transformations.py.

pyexotica.transformations.True

Definition at line 1931 of file transformations.py.



exotica_python
Author(s):
autogenerated on Mon Feb 22 2021 03:33:27