Shapes 3D  3.0
 All Classes Functions Variables Pages
shapes3d.org.apache.commons.math.geometry.Rotation Class Reference
Inheritance diagram for shapes3d.org.apache.commons.math.geometry.Rotation:

Public Member Functions

 Rotation ()
 
 Rotation (double q0, double q1, double q2, double q3, final boolean needsNormalization)
 
 Rotation (final Vector3D axis, final double angle)
 
 Rotation (final double[][] m, final double threshold) throws NotARotationMatrixException
 
 Rotation (final Vector3D u1, final Vector3D u2, Vector3D v1, Vector3D v2)
 
 Rotation (final Vector3D u, final Vector3D v)
 
 Rotation (final RotationOrder order, final double alpha1, final double alpha2, final double alpha3)
 
Rotation revert ()
 
double getQ0 ()
 
double getQ1 ()
 
double getQ2 ()
 
double getQ3 ()
 
Vector3D getAxis ()
 
double getAngle ()
 
double[] getAngles (final RotationOrder order) throws CardanEulerSingularityException
 
double[][] getMatrix ()
 
Vector3D applyTo (final Vector3D u)
 
Vector3D applyInverseTo (final Vector3D u)
 
Rotation applyTo (final Rotation r)
 
Rotation applyInverseTo (final Rotation r)
 

Detailed Description

This class implements rotations in a three-dimensional space.

Rotations can be represented by several different mathematical entities (matrices, axe and angle, Cardan or Euler angles, quaternions). This class presents an higher level abstraction, more user-oriented and hiding this implementation details. Well, for the curious, we use quaternions for the internal representation. The user can build a rotation from any of these representations, and any of these representations can be retrieved from a Rotation instance (see the various constructors and getters). In addition, a rotation can also be built implicitely from a set of vectors and their image.

This implies that this class can be used to convert from one representation to another one. For example, converting a rotation matrix into a set of Cardan angles from can be done using the followong single line of code:

double[] angles = new Rotation(matrix, 1.0e-10).getAngles(RotationOrder.XYZ);

Focus is oriented on what a rotation do rather than on its underlying representation. Once it has been built, and regardless of its internal representation, a rotation is an operator which basically transforms three dimensional vectors into other three dimensional vectors. Depending on the application, the meaning of these vectors may vary and the semantics of the rotation also.

For example in an spacecraft attitude simulation tool, users will often consider the vectors are fixed (say the Earth direction for example) and the rotation transforms the coordinates coordinates of this vector in inertial frame into the coordinates of the same vector in satellite frame. In this case, the rotation implicitely defines the relation between the two frames. Another example could be a telescope control application, where the rotation would transform the sighting direction at rest into the desired observing direction when the telescope is pointed towards an object of interest. In this case the rotation transforms the directionf at rest in a topocentric frame into the sighting direction in the same topocentric frame. In many case, both approaches will be combined, in our telescope example, we will probably also need to transform the observing direction in the topocentric frame into the observing direction in inertial frame taking into account the observatory location and the Earth rotation.

These examples show that a rotation is what the user wants it to be, so this class does not push the user towards one specific definition and hence does not provide methods like projectVectorIntoDestinationFrame or computeTransformedDirection. It provides simpler and more generic methods: applyTo(Vector3D) and applyInverseTo(Vector3D).

Since a rotation is basically a vectorial operator, several rotations can be composed together and the composite operation r = r1 o r2 (which means that for each vector u, r(u) = r1(r2(u))) is also a rotation. Hence we can consider that in addition to vectors, a rotation can be applied to other rotations as well (or to itself). With our previous notations, we would say we can apply r1 to r2 and the result we get is r = r1 o r2. For this purpose, the class provides the methods: applyTo(Rotation) and applyInverseTo(Rotation).

Rotations are guaranteed to be immutable objects.

Version
Revision:
627994

$Date: 2008-02-15 03:16:05 -0700 (Fri, 15 Feb 2008) $

See Also
Vector3D
RotationOrder
Since
1.2

Constructor & Destructor Documentation

shapes3d.org.apache.commons.math.geometry.Rotation.Rotation ( )

Build the identity rotation.

shapes3d.org.apache.commons.math.geometry.Rotation.Rotation ( double  q0,
double  q1,
double  q2,
double  q3,
final boolean  needsNormalization 
)

Build a rotation from the quaternion coordinates.

A rotation can be built from a normalized quaternion, i.e. a quaternion for which q02 + q12 + q22 + q32 = 1. If the quaternion is not normalized, the constructor can normalize it in a preprocessing step.

Parameters
q0scalar part of the quaternion
q1first coordinate of the vectorial part of the quaternion
q2second coordinate of the vectorial part of the quaternion
q3third coordinate of the vectorial part of the quaternion
needsNormalizationif true, the coordinates are considered not to be normalized, a normalization preprocessing step is performed before using them
shapes3d.org.apache.commons.math.geometry.Rotation.Rotation ( final Vector3D  axis,
final double  angle 
)

Build a rotation from an axis and an angle.

We use the convention that angles are oriented according to the effect of the rotation on vectors around the axis. That means that if (i, j, k) is a direct frame and if we first provide +k as the axis and PI/2 as the angle to this constructor, and then apply the instance to +i, we will get +j.

Parameters
axisaxis around which to rotate
anglerotation angle.
Exceptions
ArithmeticExceptionif the axis norm is zero
shapes3d.org.apache.commons.math.geometry.Rotation.Rotation ( final double  m[][],
final double  threshold 
) throws NotARotationMatrixException

Build a rotation from a 3X3 matrix.

Rotation matrices are orthogonal matrices, i.e. unit matrices (which are matrices for which m.m<sup>T = I) with real coefficients. The module of the determinant of unit matrices is 1, among the orthogonal 3X3 matrices, only the ones having a positive determinant (+1) are rotation matrices.

When a rotation is defined by a matrix with truncated values (typically when it is extracted from a technical sheet where only four to five significant digits are available), the matrix is not orthogonal anymore. This constructor handles this case transparently by using a copy of the given matrix and applying a correction to the copy in order to perfect its orthogonality. If the Frobenius norm of the correction needed is above the given threshold, then the matrix is considered to be too far from a true rotation matrix and an exception is thrown.

Parameters
mrotation matrix
thresholdconvergence threshold for the iterative orthogonality correction (convergence is reached when the difference between two steps of the Frobenius norm of the correction is below this threshold)
Exceptions
NotARotationMatrixExceptionif the matrix is not a 3X3 matrix, or if it cannot be transformed into an orthogonal matrix with the given threshold, or if the determinant of the resulting orthogonal matrix is negative
shapes3d.org.apache.commons.math.geometry.Rotation.Rotation ( final Vector3D  u1,
final Vector3D  u2,
Vector3D  v1,
Vector3D  v2 
)

Build the rotation that transforms a pair of vector into another pair.

Except for possible scale factors, if the instance were applied to the pair (u1, u2) it will produce the pair (v1, v2).

If the angular separation between u1 and u2 is not the same as the angular separation between v1 and v2, then a corrected v'2 will be used rather than v2, the corrected vector will be in the (v1, v2) plane.

Parameters
u1first vector of the origin pair
u2second vector of the origin pair
v1desired image of u1 by the rotation
v2desired image of u2 by the rotation
Exceptions
IllegalArgumentExceptionif the norm of one of the vectors is zero
shapes3d.org.apache.commons.math.geometry.Rotation.Rotation ( final Vector3D  u,
final Vector3D  v 
)

Build one of the rotations that transform one vector into another one.

Except for a possible scale factor, if the instance were applied to the vector u it will produce the vector v. There is an infinite number of such rotations, this constructor choose the one with the smallest associated angle (i.e. the one whose axis is orthogonal to the (u, v) plane). If u and v are colinear, an arbitrary rotation axis is chosen.

Parameters
uorigin vector
vdesired image of u by the rotation
Exceptions
IllegalArgumentExceptionif the norm of one of the vectors is zero
shapes3d.org.apache.commons.math.geometry.Rotation.Rotation ( final RotationOrder  order,
final double  alpha1,
final double  alpha2,
final double  alpha3 
)

Build a rotation from three Cardan or Euler elementary rotations.

Cardan rotations are three successive rotations around the canonical axes X, Y and Z, each axis beeing used once. There are 6 such sets of rotations (XYZ, XZY, YXZ, YZX, ZXY and ZYX). Euler rotations are three successive rotations around the canonical axes X, Y and Z, the first and last rotations beeing around the same axis. There are 6 such sets of rotations (XYX, XZX, YXY, YZY, ZXZ and ZYZ), the most popular one being ZXZ.

Beware that many people routinely use the term Euler angles even for what really are Cardan angles (this confusion is especially widespread in the aerospace business where Roll, Pitch and Yaw angles are often wrongly tagged as Euler angles).

Parameters
orderorder of rotations to use
alpha1angle of the first elementary rotation
alpha2angle of the second elementary rotation
alpha3angle of the third elementary rotation

Member Function Documentation

Vector3D shapes3d.org.apache.commons.math.geometry.Rotation.applyInverseTo ( final Vector3D  u)

Apply the inverse of the rotation to a vector.

Parameters
uvector to apply the inverse of the rotation to
Returns
a new vector which such that u is its image by the rotation
Rotation shapes3d.org.apache.commons.math.geometry.Rotation.applyInverseTo ( final Rotation  r)

Apply the inverse of the instance to another rotation. Applying the inverse of the instance to a rotation is computing the composition in an order compliant with the following rule : let u be any vector and v its image by r (i.e. r.applyTo(u) = v), let w be the inverse image of v by the instance (i.e. applyInverseTo(v) = w), then w = comp.applyTo(u), where comp = applyInverseTo(r).

Parameters
rrotation to apply the rotation to
Returns
a new rotation which is the composition of r by the inverse of the instance
Vector3D shapes3d.org.apache.commons.math.geometry.Rotation.applyTo ( final Vector3D  u)

Apply the rotation to a vector.

Parameters
uvector to apply the rotation to
Returns
a new vector which is the image of u by the rotation
Rotation shapes3d.org.apache.commons.math.geometry.Rotation.applyTo ( final Rotation  r)

Apply the instance to another rotation. Applying the instance to a rotation is computing the composition in an order compliant with the following rule : let u be any vector and v its image by r (i.e. r.applyTo(u) = v), let w be the image of v by the instance (i.e. applyTo(v) = w), then w = comp.applyTo(u), where comp = applyTo(r).

Parameters
rrotation to apply the rotation to
Returns
a new rotation which is the composition of r by the instance
double shapes3d.org.apache.commons.math.geometry.Rotation.getAngle ( )

Get the angle of the rotation.

Returns
angle of the rotation (between 0 and π)
double [] shapes3d.org.apache.commons.math.geometry.Rotation.getAngles ( final RotationOrder  order) throws CardanEulerSingularityException

Get the Cardan or Euler angles corresponding to the instance.

The equations show that each rotation can be defined by two different values of the Cardan or Euler angles set. For example if Cardan angles are used, the rotation defined by the angles a1, a2 and a3 is the same as the rotation defined by the angles π

  • a1, π - a2 and π + a3. This method implements the following arbitrary choices:
  • for Cardan angles, the chosen set is the one for which the second angle is between -π/2 and π/2 (i.e its cosine is positive),
  • for Euler angles, the chosen set is the one for which the second angle is between 0 and π (i.e its sine is positive).

Cardan and Euler angle have a very disappointing drawback: all of them have singularities. This means that if the instance is too close to the singularities corresponding to the given rotation order, it will be impossible to retrieve the angles. For Cardan angles, this is often called gimbal lock. There is nothing to do to prevent this, it is an intrinsic problem with Cardan and Euler representation (but not a problem with the rotation itself, which is perfectly well defined). For Cardan angles, singularities occur when the second angle is close to -π/2 or +π/2, for Euler angle singularities occur when the second angle is close to 0 or π, this implies that the identity rotation is always singular for Euler angles!

Parameters
orderrotation order to use
Returns
an array of three angles, in the order specified by the set
Exceptions
CardanEulerSingularityExceptionif the rotation is singular with respect to the angles set specified
Vector3D shapes3d.org.apache.commons.math.geometry.Rotation.getAxis ( )

Get the normalized axis of the rotation.

Returns
normalized axis of the rotation
double [][] shapes3d.org.apache.commons.math.geometry.Rotation.getMatrix ( )

Get the 3X3 matrix corresponding to the instance

Returns
the matrix corresponding to the instance
double shapes3d.org.apache.commons.math.geometry.Rotation.getQ0 ( )

Get the scalar coordinate of the quaternion.

Returns
scalar coordinate of the quaternion
double shapes3d.org.apache.commons.math.geometry.Rotation.getQ1 ( )

Get the first coordinate of the vectorial part of the quaternion.

Returns
first coordinate of the vectorial part of the quaternion
double shapes3d.org.apache.commons.math.geometry.Rotation.getQ2 ( )

Get the second coordinate of the vectorial part of the quaternion.

Returns
second coordinate of the vectorial part of the quaternion
double shapes3d.org.apache.commons.math.geometry.Rotation.getQ3 ( )

Get the third coordinate of the vectorial part of the quaternion.

Returns
third coordinate of the vectorial part of the quaternion
Rotation shapes3d.org.apache.commons.math.geometry.Rotation.revert ( )

Revert a rotation. Build a rotation which reverse the effect of another rotation. This means that if r(u) = v, then r.revert(v) = u. The instance is not changed.

Returns
a new rotation whose effect is the reverse of the effect of the instance

The documentation for this class was generated from the following file: