| 1 | #include "slalib.h"
|
|---|
| 2 | #include "slamac.h"
|
|---|
| 3 | void slaEuler ( char *order, float phi, float theta, float psi,
|
|---|
| 4 | float rmat[3][3] )
|
|---|
| 5 | /*
|
|---|
| 6 | ** - - - - - - - - -
|
|---|
| 7 | ** s l a E u l e r
|
|---|
| 8 | ** - - - - - - - - -
|
|---|
| 9 | **
|
|---|
| 10 | ** Form a rotation matrix from the Euler angles - three successive
|
|---|
| 11 | ** rotations about specified Cartesian axes.
|
|---|
| 12 | **
|
|---|
| 13 | ** (single precision)
|
|---|
| 14 | **
|
|---|
| 15 | ** Given:
|
|---|
| 16 | ** *order char specifies about which axes the rotations occur
|
|---|
| 17 | ** phi float 1st rotation (radians)
|
|---|
| 18 | ** theta float 2nd rotation ( " )
|
|---|
| 19 | ** psi float 3rd rotation ( " )
|
|---|
| 20 | **
|
|---|
| 21 | ** Returned:
|
|---|
| 22 | ** rmat float[3][3] rotation matrix
|
|---|
| 23 | **
|
|---|
| 24 | ** A rotation is positive when the reference frame rotates
|
|---|
| 25 | ** anticlockwise as seen looking towards the origin from the
|
|---|
| 26 | ** positive region of the specified axis.
|
|---|
| 27 | **
|
|---|
| 28 | ** The characters of order define which axes the three successive
|
|---|
| 29 | ** rotations are about. A typical value is 'ZXZ', indicating that
|
|---|
| 30 | ** rmat is to become the direction cosine matrix corresponding to
|
|---|
| 31 | ** rotations of the reference frame through phi radians about the
|
|---|
| 32 | ** old z-axis, followed by theta radians about the resulting x-axis,
|
|---|
| 33 | ** then psi radians about the resulting z-axis.
|
|---|
| 34 | **
|
|---|
| 35 | ** The axis names can be any of the following, in any order or
|
|---|
| 36 | ** combination: x, y, z, uppercase or lowercase, 1, 2, 3. Normal
|
|---|
| 37 | ** axis labelling/numbering conventions apply; the xyz (=123)
|
|---|
| 38 | ** triad is right-handed. Thus, the 'ZXZ' example given above
|
|---|
| 39 | ** could be written 'ZXZ' or '313' (or even 'zxz' or '3xz'). Order
|
|---|
| 40 | ** is terminated by length or by the first unrecognized character.
|
|---|
| 41 | **
|
|---|
| 42 | ** Fewer than three rotations are acceptable, in which case the later
|
|---|
| 43 | ** angle arguments are ignored. Zero rotations leaves rmat set to the
|
|---|
| 44 | ** identity matrix.
|
|---|
| 45 | **
|
|---|
| 46 | ** Called: slaDeuler
|
|---|
| 47 | **
|
|---|
| 48 | ** Last revision: 9 December 1996
|
|---|
| 49 | **
|
|---|
| 50 | ** Copyright P.T.Wallace. All rights reserved.
|
|---|
| 51 | */
|
|---|
| 52 | {
|
|---|
| 53 | int j, i;
|
|---|
| 54 | double w[3][3];
|
|---|
| 55 |
|
|---|
| 56 | /* Compute matrix in double precision */
|
|---|
| 57 | slaDeuler ( order, (double) phi, (double) theta, (double) psi, w );
|
|---|
| 58 |
|
|---|
| 59 | /* Copy the result */
|
|---|
| 60 | for ( j = 0; j < 3; j++ ) {
|
|---|
| 61 | for ( i = 0; i < 3; i++ ) {
|
|---|
| 62 | rmat[i][j] = (float) w[i][j];
|
|---|
| 63 | }
|
|---|
| 64 | }
|
|---|
| 65 | }
|
|---|