mirror of
https://github.com/nasa/trick.git
synced 2024-12-28 08:58:53 +00:00
143 lines
3.1 KiB
C
143 lines
3.1 KiB
C
/*
|
|
PURPOSE:
|
|
(Quaternion math in line code macros.)
|
|
|
|
REFERENCE:
|
|
((None))
|
|
|
|
PROGRAMMERS:
|
|
(((David Hammen) (Odyssey) (May 2005) (RDLaa07016) (Initial release.)))
|
|
*/
|
|
|
|
/*
|
|
* $Id: quat_macros.h 1028 2010-08-28 00:04:23Z penn $
|
|
*/
|
|
|
|
/**
|
|
@page QUATERNIAN_MACROS Quaternian Macros
|
|
|
|
Include:
|
|
$TRICK_HOME/trick_source/trick_utils/math/include/quat_macros.h
|
|
|
|
This set of macros operates on quaternians which are represented
|
|
as an array of four floating point types (i,e., double quat[4] or float quat[4]).
|
|
|
|
- Element 0 of the array represents the scalar part of the quaternian.
|
|
- Elements 1..3 of the array represent the vector part of the quaternian.
|
|
*/
|
|
|
|
#ifndef _QUAT_MACROS_H_
|
|
#define _QUAT_MACROS_H_
|
|
|
|
#include "vector_macros.h"
|
|
|
|
/**
|
|
@page QUATERNIAN_MACROS
|
|
\b Q_IDENT( Q)
|
|
|
|
Set Q to the identity quaternian.
|
|
Q = (1.0, 0.0, 0.0, 0.0)
|
|
*/
|
|
#define Q_IDENT(quat) { \
|
|
*quat = 1.0; \
|
|
V_INIT ((quat+1)); \
|
|
}
|
|
|
|
/**
|
|
@page QUATERNIAN_MACROS
|
|
\b Q_COPY(D, S)
|
|
|
|
Copy quaternian S to quaternian D.
|
|
*/
|
|
#define Q_COPY(dest,src) { \
|
|
*dest = *src; \
|
|
V_COPY ((dest+1), (src+1)); \
|
|
}
|
|
|
|
/**
|
|
@page QUATERNIAN_MACROS
|
|
\b Q_SCALE(D, Q, C)
|
|
|
|
Assign the product of quaternian Q and scalar C to quaternian D.
|
|
*/
|
|
#define Q_SCALE(dest,src,scale) { \
|
|
*dest = *src * scale; \
|
|
V_SCALE ((dest+1), (src+1), scale); \
|
|
}
|
|
|
|
/**
|
|
@page QUATERNIAN_MACROS
|
|
\b Q_TRANS(D, Q)
|
|
|
|
Assign the conjugate of quaternian Q to quaternian D.
|
|
*/
|
|
#define Q_TRANS(dest,src) { \
|
|
*dest = *src; \
|
|
V_NEGATE ((dest+1), (src+1)); \
|
|
}
|
|
|
|
/**
|
|
@page QUATERNIAN_MACROS
|
|
\b QxQ(D, A, B)
|
|
|
|
Assign the product of quaternian A and quaternian B to quaternian D.
|
|
*/
|
|
#define QxQ(dest,quat1,quat2) { \
|
|
*dest = *quat1 * *quat2 - V_DOT ((quat1+1), (quat2+1)); \
|
|
V_SCALE ((dest+1), (quat2+1), *quat1); \
|
|
VxS_ADD ((dest+1), (quat1+1), *quat2); \
|
|
VxV_ADD ((dest+1), (quat1+1), (quat2+1)); \
|
|
}
|
|
|
|
/**
|
|
@page QUATERNIAN_MACROS
|
|
\b QtxQ(D, A, B)
|
|
|
|
Assign the product of quaternian A conjugate and B to quaternian D.
|
|
*/
|
|
#define QtxQ(dest,quat1,quat2) { \
|
|
*dest = *quat1 * *quat2 + V_DOT ((quat1+1), (quat2+1)); \
|
|
V_SCALE ((dest+1), (quat2+1), *quat1); \
|
|
VxS_SUB ((dest+1), (quat1+1), *quat2); \
|
|
VxV_SUB ((dest+1), (quat1+1), (quat2+1)); \
|
|
}
|
|
|
|
/**
|
|
@page QUATERNIAN_MACROS
|
|
\b QxQt(D, A, B)
|
|
|
|
Assign the product of quaternian A and quaternian B conjugate to quaternian D.
|
|
*/
|
|
#define QxQt(dest,quat1,quat2) { \
|
|
*dest = *quat1 * *quat2 + V_DOT ((quat1+1), (quat2+1)); \
|
|
V_SCALE ((dest+1), (quat1+1), *quat2); \
|
|
VxS_SUB ((dest+1), (quat2+1), *quat1); \
|
|
VxV_SUB ((dest+1), (quat1+1), (quat2+1)); \
|
|
}
|
|
|
|
/**
|
|
@page QUATERNIAN_MACROS
|
|
\b VxQ(D, V, Q)
|
|
|
|
Assign the product of vector V and quaternian Q to quaternian D.
|
|
*/
|
|
#define VxQ(dest,vec,quat) { \
|
|
*dest = - V_DOT (vec, (quat+1)); \
|
|
V_SCALE ((dest+1), vec, *quat); \
|
|
VxV_ADD ((dest+1), vec, (quat+1)); \
|
|
}
|
|
|
|
/**
|
|
@page QUATERNIAN_MACROS
|
|
\b QxV(D, Q, V)
|
|
|
|
Assign the product of quaternian Q and vector V to quaternian D.
|
|
*/
|
|
#define QxV(dest,quat,vec) { \
|
|
*dest = - V_DOT ((quat+1), vec); \
|
|
V_SCALE ((dest+1), vec, *quat); \
|
|
VxV_ADD ((dest+1), (quat+1), vec); \
|
|
}
|
|
|
|
#endif /* _QUAT_MACROS_H_ DO NOT PUT ANYTHING AFTER THIS LINE */
|