#ifndef POSEMATH_H
#define POSEMATH_H
#ifdef __cplusplus
#define USE_CONST
#define USE_CCONST
#define USE_REF
#ifdef USE_CCONST
#define PM_CCONST const
#else
#define PM_CCONST
#endif
#ifdef USE_CONST
#define PM_CONST const
#else
#define PM_CONST
#endif
#ifdef USE_REF
#define PM_REF &
#else
#define PM_REF
#endif
#define INCLUDE_POSEMATH_COPY_CONSTRUCTORS
struct PM_CARTESIAN;
struct PM_SPHERICAL;
struct PM_CYLINDRICAL;
struct PM_ROTATION_VECTOR;
struct PM_ROTATION_MATRIX;
struct PM_QUATERNION;
struct PM_EULER_ZYZ;
struct PM_EULER_ZYX;
struct PM_RPY;
struct PM_POSE;
struct PM_HOMOGENEOUS;
struct PM_CARTESIAN {
PM_CARTESIAN() {
};
PM_CARTESIAN(double _x, double _y, double _z);
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_CARTESIAN(PM_CCONST PM_CARTESIAN & cart); #endif
PM_CARTESIAN(PM_CONST PM_CYLINDRICAL PM_REF c);
PM_CARTESIAN(PM_CONST PM_SPHERICAL PM_REF s);
double &operator[] (int n);
PM_CARTESIAN & operator += (const PM_CARTESIAN &o);
PM_CARTESIAN & operator -= (const PM_CARTESIAN &o);
PM_CARTESIAN & operator *= (double o);
PM_CARTESIAN & operator /= (double o);
double x, y, z;
};
struct PM_SPHERICAL {
PM_SPHERICAL() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_SPHERICAL(PM_CCONST PM_SPHERICAL & s);
#endif
PM_SPHERICAL(double _theta, double _phi, double _r);
PM_SPHERICAL(PM_CONST PM_CYLINDRICAL PM_REF v);
PM_SPHERICAL(PM_CONST PM_CARTESIAN PM_REF v);
double &operator[] (int n);
double theta, phi, r;
};
struct PM_CYLINDRICAL {
PM_CYLINDRICAL() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_CYLINDRICAL(PM_CCONST PM_CYLINDRICAL & c);
#endif
PM_CYLINDRICAL(double _theta, double _r, double _z);
PM_CYLINDRICAL(PM_CONST PM_CARTESIAN PM_REF v);
PM_CYLINDRICAL(PM_CONST PM_SPHERICAL PM_REF v);
double &operator[] (int n);
double theta, r, z;
};
struct PM_ROTATION_VECTOR {
PM_ROTATION_VECTOR() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_ROTATION_VECTOR(PM_CCONST PM_ROTATION_VECTOR & r);
#endif
PM_ROTATION_VECTOR(double _r, double _x, double _y, double _z);
PM_ROTATION_VECTOR(PM_CONST PM_QUATERNION PM_REF q);
double &operator[] (int n);
double s, x, y, z;
};
struct PM_ROTATION_MATRIX {
PM_ROTATION_MATRIX() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_ROTATION_MATRIX(PM_CCONST PM_ROTATION_MATRIX & mat);
#endif
PM_ROTATION_MATRIX(double xx, double xy, double xz,
double yx, double yy, double yz, double zx, double zy, double zz);
PM_ROTATION_MATRIX(PM_CARTESIAN _x, PM_CARTESIAN _y, PM_CARTESIAN _z);
PM_ROTATION_MATRIX(PM_CONST PM_ROTATION_VECTOR PM_REF v);
PM_ROTATION_MATRIX(PM_CONST PM_QUATERNION PM_REF q);
PM_ROTATION_MATRIX(PM_CONST PM_EULER_ZYZ PM_REF zyz);
PM_ROTATION_MATRIX(PM_CONST PM_EULER_ZYX PM_REF zyx);
PM_ROTATION_MATRIX(PM_CONST PM_RPY PM_REF rpy);
PM_CARTESIAN & operator[](int n);
PM_CARTESIAN x, y, z;
};
enum PM_AXIS { PM_X, PM_Y, PM_Z };
struct PM_QUATERNION {
PM_QUATERNION() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_QUATERNION(PM_CCONST PM_QUATERNION & quat);
#endif
PM_QUATERNION(double _s, double _x, double _y, double _z);
PM_QUATERNION(PM_CONST PM_ROTATION_VECTOR PM_REF v);
PM_QUATERNION(PM_CONST PM_ROTATION_MATRIX PM_REF m);
PM_QUATERNION(PM_CONST PM_EULER_ZYZ PM_REF zyz);
PM_QUATERNION(PM_CONST PM_EULER_ZYX PM_REF zyx);
PM_QUATERNION(PM_CONST PM_RPY PM_REF rpy);
PM_QUATERNION(PM_AXIS axis, double angle);
double &operator[] (int n);
void axisAngleMult(PM_AXIS axis, double angle);
double s, x, y, z;
};
struct PM_EULER_ZYZ {
PM_EULER_ZYZ() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_EULER_ZYZ(PM_CCONST PM_EULER_ZYZ & zyz);
#endif
PM_EULER_ZYZ(double _z, double _y, double _zp);
PM_EULER_ZYZ(PM_CONST PM_QUATERNION PM_REF q);
PM_EULER_ZYZ(PM_CONST PM_ROTATION_MATRIX PM_REF m);
double &operator[] (int n);
double z, y, zp;
};
struct PM_EULER_ZYX {
PM_EULER_ZYX() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_EULER_ZYX(PM_CCONST PM_EULER_ZYX & zyx);
#endif
PM_EULER_ZYX(double _z, double _y, double _x);
PM_EULER_ZYX(PM_CONST PM_QUATERNION PM_REF q);
PM_EULER_ZYX(PM_CONST PM_ROTATION_MATRIX PM_REF m);
double &operator[] (int n);
double z, y, x;
};
struct PM_RPY {
PM_RPY() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_RPY(PM_CCONST PM_RPY PM_REF rpy);
#endif
PM_RPY(double _r, double _p, double _y);
PM_RPY(PM_CONST PM_QUATERNION PM_REF q);
PM_RPY(PM_CONST PM_ROTATION_MATRIX PM_REF m);
double &operator[] (int n);
double r, p, y;
};
struct PM_POSE {
PM_POSE() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_POSE(PM_CCONST PM_POSE & p);
#endif
PM_POSE(PM_CARTESIAN v, PM_QUATERNION q);
PM_POSE(double x, double y, double z,
double s, double sx, double sy, double sz);
PM_POSE(PM_CONST PM_HOMOGENEOUS PM_REF h);
double &operator[] (int n);
PM_CARTESIAN tran;
PM_QUATERNION rot;
};
struct PM_HOMOGENEOUS {
PM_HOMOGENEOUS() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_HOMOGENEOUS(PM_CCONST PM_HOMOGENEOUS & h);
#endif
PM_HOMOGENEOUS(PM_CARTESIAN v, PM_ROTATION_MATRIX m);
PM_HOMOGENEOUS(PM_CONST PM_POSE PM_REF p);
PM_CARTESIAN & operator[](int n);
PM_CARTESIAN tran;
PM_ROTATION_MATRIX rot;
};
struct PM_LINE {
PM_LINE() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_LINE(PM_CCONST PM_LINE &);
#endif
int init(PM_POSE start, PM_POSE end);
int point(double len, PM_POSE * point);
PM_POSE start;
PM_POSE end;
PM_CARTESIAN uVec;
};
struct PM_CIRCLE {
PM_CIRCLE() {
};
#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
PM_CIRCLE(PM_CCONST PM_CIRCLE &);
#endif
int init(PM_POSE start, PM_POSE end,
PM_CARTESIAN center, PM_CARTESIAN normal, int turn);
int point(double angle, PM_POSE * point);
PM_CARTESIAN center;
PM_CARTESIAN normal;
PM_CARTESIAN rTan;
PM_CARTESIAN rPerp;
PM_CARTESIAN rHelix;
double radius;
double angle;
double spiral;
};
extern double dot(const PM_CARTESIAN &v1, const PM_CARTESIAN &v2);
extern PM_CARTESIAN cross(const PM_CARTESIAN &v1, const PM_CARTESIAN &v2);
#if 0#endif
extern PM_CARTESIAN unit(const PM_CARTESIAN &v);
extern PM_QUATERNION unit(const PM_QUATERNION &q);
extern PM_ROTATION_VECTOR unit(const PM_ROTATION_VECTOR &r);
extern PM_ROTATION_MATRIX unit(const PM_ROTATION_MATRIX &m);
extern int isNorm(const PM_CARTESIAN &v);
extern int isNorm(const PM_QUATERNION &q);
extern int isNorm(const PM_ROTATION_VECTOR &r);
extern int isNorm(const PM_ROTATION_MATRIX &m);
extern double mag(const PM_CARTESIAN &v);
extern double disp(const PM_CARTESIAN &v1, const PM_CARTESIAN &v2);
extern PM_CARTESIAN inv(const PM_CARTESIAN &v);
extern PM_ROTATION_MATRIX inv(const PM_ROTATION_MATRIX &m);
extern PM_QUATERNION inv(const PM_QUATERNION &q);
extern PM_POSE inv(const PM_POSE &p);
extern PM_HOMOGENEOUS inv(const PM_HOMOGENEOUS &h);
extern PM_CARTESIAN proj(const PM_CARTESIAN &v1, const PM_CARTESIAN &v2);
extern PM_CARTESIAN operator + (const PM_CARTESIAN &v);
extern PM_CARTESIAN operator - (const PM_CARTESIAN &v);
extern PM_QUATERNION operator + (const PM_QUATERNION &q);
extern PM_QUATERNION operator - (const PM_QUATERNION &q);
extern PM_POSE operator + (const PM_POSE &p);
extern PM_POSE operator - (const PM_POSE &p);
extern int operator == (const PM_CARTESIAN &v1, const PM_CARTESIAN &v2);
extern int operator == (const PM_QUATERNION &q1, const PM_QUATERNION &q2);
extern int operator == (const PM_POSE &p1, const PM_POSE &p2);
extern int operator != (const PM_CARTESIAN &v1, const PM_CARTESIAN &v2);
extern int operator != (const PM_QUATERNION &q1, const PM_QUATERNION &q2);
extern int operator != (const PM_POSE &p1, const PM_POSE &p2);
extern PM_CARTESIAN operator + (PM_CARTESIAN v1, const PM_CARTESIAN &v2);
extern PM_CARTESIAN operator - (PM_CARTESIAN v1, const PM_CARTESIAN &v2);
extern PM_CARTESIAN operator *(PM_CARTESIAN v, double s);
extern PM_CARTESIAN operator *(double s, PM_CARTESIAN v);
extern PM_CARTESIAN operator / (const PM_CARTESIAN &v, double s);
extern PM_QUATERNION operator *(double s, const PM_QUATERNION &q);
extern PM_QUATERNION operator *(const PM_QUATERNION &q, double s);
extern PM_QUATERNION operator / (const PM_QUATERNION &q, double s);
extern PM_CARTESIAN operator *(const PM_QUATERNION &q, const PM_CARTESIAN &v);
extern PM_QUATERNION operator *(const PM_QUATERNION &q1, const PM_QUATERNION &q2);
extern PM_ROTATION_MATRIX operator *(const PM_ROTATION_MATRIX &m1,
const PM_ROTATION_MATRIX &m2);
extern PM_POSE operator *(const PM_QUATERNION &q, const PM_POSE &p);
extern PM_POSE operator *(const PM_POSE &p1, const PM_POSE &p2);
extern PM_CARTESIAN operator *(const PM_POSE &p, const PM_CARTESIAN &v);
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
double x, y, z;
} PmCartesian;
typedef struct {
double theta, phi, r;
} PmSpherical;
typedef struct {
double theta, r, z;
} PmCylindrical;
#ifdef __cplusplus
typedef PM_AXIS PmAxis;
#else
typedef enum { PM_X, PM_Y, PM_Z } PmAxis;
#endif
typedef struct {
double s, x, y, z;
} PmRotationVector;
typedef struct {
PmCartesian x, y, z;
} PmRotationMatrix;
typedef struct {
double s, x, y, z;
} PmQuaternion;
typedef struct {
double z, y, zp;
} PmEulerZyz;
typedef struct {
double z, y, x;
} PmEulerZyx;
typedef struct {
double r, p, y;
} PmRpy;
typedef struct {
PmCartesian tran;
PmQuaternion rot;
} PmPose;
typedef struct {
PmCartesian start;
PmCartesian end;
PmCartesian uVec;
double tmag;
int tmag_zero;
} PmCartLine;
typedef struct {
PmCartesian tran;
PmRotationMatrix rot;
} PmHomogeneous;
typedef struct {
PmPose start;
PmPose end;
PmCartesian uVec;
PmQuaternion qVec;
double tmag;
double rmag;
int tmag_zero;
int rmag_zero;
} PmLine;
typedef struct {
PmCartesian center;
PmCartesian normal;
PmCartesian rTan;
PmCartesian rPerp;
PmCartesian rHelix;
double radius;
double angle;
double spiral;
} PmCircle;
#define PM_PI 3.14159265358979323846
#define PM_PI_2 1.57079632679489661923
#define PM_PI_4 0.78539816339744830962
#define PM_2_PI 6.28318530717958647692
#ifdef PM_LOOSE_NAMESPACE
typedef PmCartesian VECTOR;
typedef PmSpherical SPHERICAL;
typedef PmCylindrical CYLINDRICAL;
typedef PmQuaternion QUATERNION;
typedef PmRotationMatrix MATRIX;
typedef PmEulerZyz ZYZ;
typedef PmEulerZyx ZYX;
typedef PmRpy RPY;
typedef PmPose POSE;
typedef PmHomogeneous HX;
typedef PmCircle CIRCLE;
typedef PmLine LINE;
#define PI PM_PI
#define PI_2 PM_PI_2
#define PI_4 PM_PI_4
#define TWO_PI PM_2_PI
#endif
#define pmClose(a, b, eps) ((fabs((a) - (b)) < (eps)) ? 1 : 0)
#define pmSq(x) ((x)*(x))
#ifdef TO_DEG
#undef TO_DEG
#endif
#define TO_DEG (180./PM_PI)
#ifdef TO_RAD
#undef TO_RAD
#endif
#define TO_RAD (PM_PI/180.)
#define DOUBLE_FUZZ 2.2204460492503131e-16
#define DOUBLECP_FUZZ 1.0842021724855044e-19
#define CART_FUZZ (1.0e-8)
#define Q_FUZZ (1.0e-06)
#define QS_FUZZ (1.0e-6)
#define RS_FUZZ (1.0e-6)
#define QSIN_FUZZ (1.0e-6)
#define V_FUZZ (1.0e-8)
#define SQRT_FUZZ (-1.0e-6)
#define UNIT_VEC_FUZZ (1.0e-6)
#define UNIT_QUAT_FUZZ (1.0e-6)
#define UNIT_SC_FUZZ (1.0e-6)
#define E_EPSILON (1.0e-6)
#define SINGULAR_EPSILON (1.0e-6)
#define RPY_P_FUZZ (1.0e-6)
#define ZYZ_Y_FUZZ (1.0e-6)
#define ZYX_Y_FUZZ (1.0e-6)
#define CIRCLE_FUZZ (1.0e-6)
extern void pmPrintError(const char *fmt, ...) __attribute__((format(printf,1,2)));
extern int pmErrno;
extern void pmPerror(const char *fmt);
#define PM_ERR -1
#define PM_IMPL_ERR -2
#define PM_NORM_ERR -3
#define PM_DIV_ERR -4
extern double pmSqrt(double x);
extern int pmCartSphConvert(PmCartesian const * const, PmSpherical * const);
extern int pmCartCylConvert(PmCartesian const * const, PmCylindrical * const);
extern int pmSphCartConvert(PmSpherical const * const, PmCartesian * const);
extern int pmSphCylConvert(PmSpherical const * const, PmCylindrical * const);
extern int pmCylCartConvert(PmCylindrical const * const, PmCartesian * const);
extern int pmCylSphConvert(PmCylindrical const * const, PmSpherical * const);
extern int pmAxisAngleQuatConvert(PmAxis, double, PmQuaternion * const);
extern int pmRotQuatConvert(PmRotationVector const * const, PmQuaternion * const);
extern int pmRotMatConvert(PmRotationVector const * const, PmRotationMatrix * const);
extern int pmRotZyzConvert(PmRotationVector const * const, PmEulerZyz * const);
extern int pmRotZyxConvert(PmRotationVector const * const, PmEulerZyx * const);
extern int pmRotRpyConvert(PmRotationVector const * const, PmRpy * const);
extern int pmQuatRotConvert(PmQuaternion const * const, PmRotationVector * const);
extern int pmQuatMatConvert(PmQuaternion const * const, PmRotationMatrix * const);
extern int pmQuatZyzConvert(PmQuaternion const * const, PmEulerZyz * const);
extern int pmQuatZyxConvert(PmQuaternion const * const, PmEulerZyx * const);
extern int pmQuatRpyConvert(PmQuaternion const * const, PmRpy * const);
extern int pmMatRotConvert(PmRotationMatrix const * const, PmRotationVector * const);
extern int pmMatQuatConvert(PmRotationMatrix const * const, PmQuaternion * const);
extern int pmMatZyzConvert(PmRotationMatrix const * const, PmEulerZyz * const);
extern int pmMatZyxConvert(PmRotationMatrix const * const, PmEulerZyx * const);
extern int pmMatRpyConvert(PmRotationMatrix const * const, PmRpy * const);
extern int pmZyzRotConvert(PmEulerZyz const * const, PmRotationVector * const);
extern int pmZyzQuatConvert(PmEulerZyz const * const, PmQuaternion * const);
extern int pmZyzMatConvert(PmEulerZyz const * const, PmRotationMatrix * const);
extern int pmZyzZyxConvert(PmEulerZyz const * const, PmEulerZyx * const);
extern int pmZyzRpyConvert(PmEulerZyz const * const, PmRpy * const);
extern int pmZyxRotConvert(PmEulerZyx const * const, PmRotationVector * const);
extern int pmZyxQuatConvert(PmEulerZyx const * const, PmQuaternion * const);
extern int pmZyxMatConvert(PmEulerZyx const * const, PmRotationMatrix * const);
extern int pmZyxZyzConvert(PmEulerZyx const * const, PmEulerZyz * const);
extern int pmZyxRpyConvert(PmEulerZyx const * const, PmRpy * const);
extern int pmRpyRotConvert(PmRpy const * const, PmRotationVector * const);
extern int pmRpyQuatConvert(PmRpy const * const, PmQuaternion * const);
extern int pmRpyMatConvert(PmRpy const * const, PmRotationMatrix * const);
extern int pmRpyZyzConvert(PmRpy const * const, PmEulerZyz * const);
extern int pmRpyZyxConvert(PmRpy const * const, PmEulerZyx * const);
extern int pmPoseHomConvert(PmPose const * const, PmHomogeneous* const);
extern int pmHomPoseConvert(PmHomogeneous const * const, PmPose * const);
extern int pmCartCartCompare(PmCartesian const * const, PmCartesian const * const);
extern int pmCartCartDot(PmCartesian const * const, PmCartesian const * const, double * const);
extern int pmCartCartCross(PmCartesian const * const, PmCartesian const * const, PmCartesian * const);
extern int pmCartCartMult(PmCartesian const * const, PmCartesian const * const, PmCartesian * const);
extern int pmCartCartDiv(PmCartesian const * const, PmCartesian const * const, PmCartesian * const);
extern int pmCartInfNorm(PmCartesian const * v, double * out);
extern int pmCartMag(PmCartesian const * const, double * const);
extern int pmCartMagSq(PmCartesian const * const, double * const);
extern int pmCartCartDisp(PmCartesian const * const v1, PmCartesian const * const v2, double *d);
extern int pmCartCartAdd(PmCartesian const * const, PmCartesian const * const, PmCartesian * const);
extern int pmCartCartSub(PmCartesian const * const, PmCartesian const * const, PmCartesian * const);
extern int pmCartScalMult(PmCartesian const * const, double, PmCartesian * const);
extern int pmCartScalDiv(PmCartesian const * const, double, PmCartesian * const);
extern int pmCartNeg(PmCartesian const * const, PmCartesian * const);
extern int pmCartUnit(PmCartesian const * const, PmCartesian * const);
extern int pmCartAbs(PmCartesian const * const, PmCartesian * const);
extern int pmCartCartAddEq(PmCartesian * const, PmCartesian const * const);
extern int pmCartCartSubEq(PmCartesian * const, PmCartesian const * const);
extern int pmCartScalMultEq(PmCartesian * const, double);
extern int pmCartScalDivEq(PmCartesian * const, double);
extern int pmCartUnitEq(PmCartesian * const);
extern int pmCartNegEq(PmCartesian * const);
#if 0#else
#define pmCartNorm(a,b,c,d,e) bad{a.b.c.d.e}
#endif
extern int pmCartIsNorm(PmCartesian const * const v);
extern int pmCartInv(PmCartesian const * const, PmCartesian * const);
extern int pmCartInvEq(PmCartesian * const);
extern int pmCartCartProj(PmCartesian const * const, PmCartesian const * const, PmCartesian * const);
extern int pmCartPlaneProj(PmCartesian const * const v, PmCartesian const * const normal,
PmCartesian * vout);
extern int pmQuatQuatCompare(PmQuaternion const * const, PmQuaternion const * const);
extern int pmQuatMag(PmQuaternion const * const q, double *d);
extern int pmQuatNorm(PmQuaternion const * const, PmQuaternion * const);
extern int pmQuatInv(PmQuaternion const * const, PmQuaternion * const);
extern int pmQuatIsNorm(PmQuaternion const * const);
extern int pmQuatScalMult(PmQuaternion const * const q, double s, PmQuaternion * const qout);
extern int pmQuatScalDiv(PmQuaternion const * const q, double s, PmQuaternion * const qout);
extern int pmQuatQuatMult(PmQuaternion const * const, PmQuaternion const * const, PmQuaternion * const);
extern int pmQuatCartMult(PmQuaternion const * const, PmCartesian const * const, PmCartesian * const);
extern int pmQuatAxisAngleMult(PmQuaternion const * const, PmAxis, double,
PmQuaternion *);
extern int pmRotScalMult(PmRotationVector const * const, double, PmRotationVector * const);
extern int pmRotScalDiv(PmRotationVector const * const, double, PmRotationVector * const);
extern int pmRotIsNorm(PmRotationVector const * const);
extern int pmRotNorm(PmRotationVector const * const, PmRotationVector * const);
extern int pmMatNorm(PmRotationMatrix const * const m, PmRotationMatrix * const mout);
extern int pmMatIsNorm(PmRotationMatrix const * const m);
extern int pmMatInv(PmRotationMatrix const * const m, PmRotationMatrix * const mout);
extern int pmMatCartMult(PmRotationMatrix const * const m, PmCartesian const * const v,
PmCartesian * const vout);
extern int pmMatMatMult(PmRotationMatrix const * const m1, PmRotationMatrix const * const m2,
PmRotationMatrix * const mout);
extern int pmPosePoseCompare(PmPose const * const, PmPose const * const);
extern int pmPoseInv(PmPose const * const p, PmPose * const);
extern int pmPoseCartMult(PmPose const * const, PmCartesian const * const, PmCartesian * const);
extern int pmPosePoseMult(PmPose const * const, PmPose const * const, PmPose * const);
extern int pmHomInv(PmHomogeneous const * const, PmHomogeneous * const);
extern int pmLineInit(PmLine * const line, PmPose const * const start, PmPose const * const end);
extern int pmLinePoint(PmLine const * const line, double len, PmPose * const point);
extern int pmCartLineInit(PmCartLine * const line, PmCartesian const * const start, PmCartesian const * const end);
extern int pmCartLinePoint(PmCartLine const * const line, double len, PmCartesian * const point);
extern int pmCartLineStretch(PmCartLine * const line, double new_len, int from_end);
extern int pmCircleInit(PmCircle * const circle,
PmCartesian const * const start, PmCartesian const * const end,
PmCartesian const * const center, PmCartesian const * const normal, int turn);
extern int pmCirclePoint(PmCircle const * const circle, double angle, PmCartesian * const point);
extern int pmCircleStretch(PmCircle * const circ, double new_angle, int from_end);
#define toCart(src,dst) {(dst)->x = (src).x; (dst)->y = (src).y; (dst)->z = (src).z;}
#define toCyl(src,dst) {(dst)->theta = (src).theta; (dst)->r = (src).r; (dst)->z = (src).z;}
#define toSph(src,dst) {(dst)->theta = (src).theta; (dst)->phi = (src).phi; (dst)->r = (src).r;}
#define toQuat(src,dst) {(dst)->s = (src).s; (dst)->x = (src).x; (dst)->y = (src).y; (dst)->z = (src).z;}
#define toRot(src,dst) {(dst)->s = (src).s; (dst)->x = (src).x; (dst)->y = (src).y; (dst)->z = (src).z;}
#define toMat(src,dst) {toCart((src).x, &((dst)->x)); toCart((src).y, &((dst)->y)); toCart((src).z, &((dst)->z));}
#define toEulerZyz(src,dst) {(dst)->z = (src).z; (dst)->y = (src).y; (dst)->zp = (src).zp;}
#define toEulerZyx(src,dst) {(dst)->z = (src).z; (dst)->y = (src).y; (dst)->x = (src).x;}
#define toRpy(src,dst) {(dst)->r = (src).r; (dst)->p = (src).p; (dst)->y = (src).y;}
#define toPose(src,dst) {toCart((src).tran, &((dst)->tran)); toQuat((src).rot, &((dst)->rot));}
#define toHom(src,dst) {toCart((src).tran, &((dst)->tran)); toMat((src).rot, &((dst)->rot));}
#define toLine(src,dst) {toPose((src).start, &((dst)->start)); toPose((src).end, &((dst)->end)); toCart((src).uVec, &((dst)->uVec));}
#define toCircle(src,dst) {toCart((src).center, &((dst)->center)); toCart((src).normal, &((dst)->normal)); toCart((src).rTan, &((dst)->rTan)); toCart((src).rPerp, &((dst)->rPerp)); toCart((src).rHelix, &((dst)->rHelix)); (dst)->radius = (src).radius; (dst)->angle = (src).angle; (dst)->spiral = (src).spiral;}
#ifdef __cplusplus
}
#endif
#endif