⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 posemath.cc

📁 Source code for an Numeric Cmputer
💻 CC
📖 第 1 页 / 共 2 页
字号:
/********************************************************************* Description: posemath.cc*    C++ definitions for pose math library data types and manipulation*    functions.**   Derived from a work by Fred Proctor & Will Shackleford** Author:* License: LGPL Version 2* System: Linux*    * Copyright (c) 2004 All rights reserved.** Last change: * $Revision: 1.6 $* $Author: paul_c $* $Date: 2005/06/13 14:38:50 $********************************************************************/#include "posemath.h"#ifdef PM_PRINT_ERROR#define PM_DEBUG		// need debug with printing#endif// place to reference arrays when bounds are exceededstatic double noElement = 0.0;static PM_CARTESIAN *noCart = 0;// PM_CARTESIAN classPM_CARTESIAN::PM_CARTESIAN(double _x, double _y, double _z){    x = _x;    y = _y;    z = _z;}PM_CARTESIAN::PM_CARTESIAN(PM_CONST PM_CYLINDRICAL PM_REF c){    PmCylindrical cyl;    PmCartesian cart;    toCyl(c, &cyl);    pmCylCartConvert(cyl, &cart);    toCart(cart, this);}PM_CARTESIAN::PM_CARTESIAN(PM_CONST PM_SPHERICAL PM_REF s){    PmSpherical sph;    PmCartesian cart;    toSph(s, &sph);    pmSphCartConvert(sph, &cart);    toCart(cart, this);}double &PM_CARTESIAN::operator [] (int n) {    switch (n) {    case 0:	return x;    case 1:	return y;    case 2:	return z;    default:	return noElement;	// need to return a double &    }}#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORSPM_CARTESIAN::PM_CARTESIAN(PM_CCONST PM_CARTESIAN & v){    x = v.x;    y = v.y;    z = v.z;}#endifPM_CARTESIAN PM_CARTESIAN::operator =(PM_CARTESIAN v){    x = v.x;    y = v.y;    z = v.z;    return v;}// PM_SPHERICALPM_SPHERICAL::PM_SPHERICAL(double _theta, double _phi, double _r){    theta = _theta;    phi = _phi;    r = _r;}PM_SPHERICAL::PM_SPHERICAL(PM_CONST PM_CARTESIAN PM_REF v){    PmCartesian cart;    PmSpherical sph;    toCart(v, &cart);    pmCartSphConvert(cart, &sph);    toSph(sph, this);}PM_SPHERICAL::PM_SPHERICAL(PM_CONST PM_CYLINDRICAL PM_REF c){    PmCylindrical cyl;    PmSpherical sph;    toCyl(c, &cyl);    pmCylSphConvert(cyl, &sph);    toSph(sph, this);}double &PM_SPHERICAL::operator [] (int n) {    switch (n) {    case 0:	return theta;    case 1:	return phi;    case 2:	return r;    default:	return noElement;	// need to return a double &    }}#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORSPM_SPHERICAL::PM_SPHERICAL(PM_CCONST PM_SPHERICAL & s){    theta = s.theta;    phi = s.phi;    r = s.r;}#endifPM_SPHERICAL PM_SPHERICAL::operator =(PM_SPHERICAL s){    theta = s.theta;    phi = s.phi;    r = s.r;    return s;}// PM_CYLINDRICALPM_CYLINDRICAL::PM_CYLINDRICAL(double _theta, double _r, double _z){    theta = _theta;    r = _r;    z = _z;}PM_CYLINDRICAL::PM_CYLINDRICAL(PM_CONST PM_CARTESIAN PM_REF v){    PmCartesian cart;    PmCylindrical cyl;    toCart(v, &cart);    pmCartCylConvert(cart, &cyl);    toCyl(cyl, this);}PM_CYLINDRICAL::PM_CYLINDRICAL(PM_CONST PM_SPHERICAL PM_REF s){    PmSpherical sph;    PmCylindrical cyl;    toSph(s, &sph);    pmSphCylConvert(sph, &cyl);    toCyl(cyl, this);}double &PM_CYLINDRICAL::operator [] (int n) {    switch (n) {    case 0:	return theta;    case 1:	return r;    case 2:	return z;    default:	return noElement;	// need to return a double &    }}#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORSPM_CYLINDRICAL::PM_CYLINDRICAL(PM_CCONST PM_CYLINDRICAL & c){    theta = c.theta;    r = c.r;    z = c.z;}#endifPM_CYLINDRICAL PM_CYLINDRICAL::operator =(PM_CYLINDRICAL c){    theta = c.theta;    r = c.r;    z = c.z;    return c;}// PM_ROTATION_VECTORPM_ROTATION_VECTOR::PM_ROTATION_VECTOR(double _s, double _x,    double _y, double _z){    PmRotationVector rv;    rv.s = _s;    rv.x = _x;    rv.y = _y;    rv.z = _z;    pmRotNorm(rv, &rv);    toRot(rv, this);}PM_ROTATION_VECTOR::PM_ROTATION_VECTOR(PM_CONST PM_QUATERNION PM_REF q){    PmQuaternion quat;    PmRotationVector rv;    toQuat(q, &quat);    pmQuatRotConvert(quat, &rv);    toRot(rv, this);}double &PM_ROTATION_VECTOR::operator [] (int n) {    switch (n) {    case 0:	return s;    case 1:	return x;    case 2:	return y;    case 3:	return z;    default:	return noElement;	// need to return a double &    }}#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORSPM_ROTATION_VECTOR::PM_ROTATION_VECTOR(PM_CCONST PM_ROTATION_VECTOR & r){    s = r.s;    x = r.x;    y = r.y;    z = r.z;}#endifPM_ROTATION_VECTOR PM_ROTATION_VECTOR::operator =(PM_ROTATION_VECTOR r){    s = r.s;    x = r.x;    y = r.y;    z = r.z;    return r;}// PM_ROTATION_MATRIX class// ctors/dtorsPM_ROTATION_MATRIX::PM_ROTATION_MATRIX(double xx, double xy, double xz,    double yx, double yy, double yz, double zx, double zy, double zz){    x.x = xx;    x.y = xy;    x.z = xz;    y.x = yx;    y.y = yy;    y.z = yz;    z.x = zx;    z.y = zy;    z.z = zz;    /*! \todo FIXME-- need a matrix orthonormalization function pmMatNorm() */}PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CARTESIAN _x, PM_CARTESIAN _y,    PM_CARTESIAN _z){    x = _x;    y = _y;    z = _z;}PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CONST PM_ROTATION_VECTOR PM_REF v){    PmRotationVector rv;    PmRotationMatrix mat;    toRot(v, &rv);    pmRotMatConvert(rv, &mat);    toMat(mat, this);}PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CONST PM_QUATERNION PM_REF q){    PmQuaternion quat;    PmRotationMatrix mat;    toQuat(q, &quat);    pmQuatMatConvert(quat, &mat);    toMat(mat, this);}PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CONST PM_RPY PM_REF rpy){    PmRpy _rpy;    PmRotationMatrix mat;    toRpy(rpy, &_rpy);    pmRpyMatConvert(_rpy, &mat);    toMat(mat, this);}PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CONST PM_EULER_ZYZ PM_REF zyz){    PmEulerZyz _zyz;    PmRotationMatrix mat;    toEulerZyz(zyz, &_zyz);    pmZyzMatConvert(_zyz, &mat);    toMat(mat, this);}PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CONST PM_EULER_ZYX PM_REF zyx){    PmEulerZyx _zyx;    PmRotationMatrix mat;    toEulerZyx(zyx, &_zyx);    pmZyxMatConvert(_zyx, &mat);    toMat(mat, this);}// operatorsPM_CARTESIAN & PM_ROTATION_MATRIX::operator [](int n) {    switch (n) {    case 0:	return x;    case 1:	return y;    case 2:	return z;    default:	if (0 == noCart) {	    noCart = new PM_CARTESIAN(0.0, 0.0, 0.0);	}	return (*noCart);	// need to return a PM_CARTESIAN &    }}#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORSPM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CCONST PM_ROTATION_MATRIX & m){    x = m.x;    y = m.y;    z = m.z;}#endifPM_ROTATION_MATRIX PM_ROTATION_MATRIX::operator =(PM_ROTATION_MATRIX m){    x = m.x;    y = m.y;    z = m.z;    return m;}// PM_QUATERNION classPM_QUATERNION::PM_QUATERNION(double _s, double _x, double _y, double _z){    PmQuaternion quat;    quat.s = _s;    quat.x = _x;    quat.y = _y;    quat.z = _z;    pmQuatNorm(quat, &quat);    s = quat.s;    x = quat.x;    y = quat.y;    z = quat.z;}PM_QUATERNION::PM_QUATERNION(PM_CONST PM_ROTATION_VECTOR PM_REF v){    PmRotationVector rv;    PmQuaternion quat;    toRot(v, &rv);    pmRotQuatConvert(rv, &quat);    toQuat(quat, this);}PM_QUATERNION::PM_QUATERNION(PM_CONST PM_ROTATION_MATRIX PM_REF m){    PmRotationMatrix mat;    PmQuaternion quat;    toMat(m, &mat);    pmMatQuatConvert(mat, &quat);    toQuat(quat, this);}PM_QUATERNION::PM_QUATERNION(PM_CONST PM_EULER_ZYZ PM_REF zyz){    PmEulerZyz _zyz;    PmQuaternion quat;    toEulerZyz(zyz, &_zyz);    pmZyzQuatConvert(_zyz, &quat);    toQuat(quat, this);}PM_QUATERNION::PM_QUATERNION(PM_CONST PM_EULER_ZYX PM_REF zyx){    PmEulerZyx _zyx;    PmQuaternion quat;    toEulerZyx(zyx, &_zyx);    pmZyxQuatConvert(_zyx, &quat);    toQuat(quat, this);}PM_QUATERNION::PM_QUATERNION(PM_CONST PM_RPY PM_REF rpy){    PmRpy _rpy;    PmQuaternion quat;    toRpy(rpy, &_rpy);    pmRpyQuatConvert(_rpy, &quat);    toQuat(quat, this);}PM_QUATERNION::PM_QUATERNION(PM_AXIS _axis, double _angle){    PmQuaternion quat;    pmAxisAngleQuatConvert((PmAxis) _axis, _angle, &quat);    toQuat(quat, this);}void PM_QUATERNION::axisAngleMult(PM_AXIS _axis, double _angle){    PmQuaternion quat;    toQuat((*this), &quat);    pmQuatAxisAngleMult(quat, (PmAxis) _axis, _angle, &quat);    toQuat(quat, this);}double &PM_QUATERNION::operator [] (int n) {    switch (n) {    case 0:	return s;    case 1:	return x;    case 2:	return y;    case 3:	return z;    default:	return noElement;	// need to return a double &    }}PM_QUATERNION PM_QUATERNION::operator =(PM_QUATERNION q){    s = q.s;    x = q.x;    y = q.y;    z = q.z;    return q;}#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORSPM_QUATERNION::PM_QUATERNION(PM_CCONST PM_QUATERNION & q){    s = q.s;    x = q.x;    y = q.y;    z = q.z;}#endif// PM_EULER_ZYZ classPM_EULER_ZYZ::PM_EULER_ZYZ(double _z, double _y, double _zp){    z = _z;    y = _y;    zp = _zp;}PM_EULER_ZYZ::PM_EULER_ZYZ(PM_CONST PM_QUATERNION PM_REF q){    PmQuaternion quat;    PmEulerZyz zyz;    toQuat(q, &quat);    pmQuatZyzConvert(quat, &zyz);    toEulerZyz(zyz, this);}PM_EULER_ZYZ::PM_EULER_ZYZ(PM_CONST PM_ROTATION_MATRIX PM_REF m){    PmRotationMatrix mat;    PmEulerZyz zyz;    toMat(m, &mat);    pmMatZyzConvert(mat, &zyz);    toEulerZyz(zyz, this);}double &PM_EULER_ZYZ::operator [] (int n) {    switch (n) {    case 0:	return z;    case 1:	return y;    case 2:	return zp;    default:	return noElement;	// need to return a double &    }}#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORSPM_EULER_ZYZ::PM_EULER_ZYZ(PM_CCONST PM_EULER_ZYZ & zyz){    z = zyz.z;    y = zyz.y;    zp = zyz.zp;}#endifPM_EULER_ZYZ PM_EULER_ZYZ::operator =(PM_EULER_ZYZ zyz){    z = zyz.z;    y = zyz.y;    zp = zyz.zp;    return zyz;}// PM_EULER_ZYX classPM_EULER_ZYX::PM_EULER_ZYX(double _z, double _y, double _x){    z = _z;    y = _y;    x = _x;}PM_EULER_ZYX::PM_EULER_ZYX(PM_CONST PM_QUATERNION PM_REF q){    PmQuaternion quat;    PmEulerZyx zyx;    toQuat(q, &quat);    pmQuatZyxConvert(quat, &zyx);    toEulerZyx(zyx, this);}PM_EULER_ZYX::PM_EULER_ZYX(PM_CONST PM_ROTATION_MATRIX PM_REF m){    PmRotationMatrix mat;    PmEulerZyx zyx;    toMat(m, &mat);    pmMatZyxConvert(mat, &zyx);    toEulerZyx(zyx, this);}double &PM_EULER_ZYX::operator [] (int n) {    switch (n) {    case 0:	return z;    case 1:	return y;    case 2:	return x;    default:	return noElement;	// need to return a double &    }}#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORSPM_EULER_ZYX::PM_EULER_ZYX(PM_CCONST PM_EULER_ZYX & zyx){    z = zyx.z;    y = zyx.y;    x = zyx.x;}#endifPM_EULER_ZYX PM_EULER_ZYX::operator =(PM_EULER_ZYX zyx){    z = zyx.z;    y = zyx.y;    x = zyx.x;    return zyx;}// PM_RPY class#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORSPM_RPY::PM_RPY(PM_CCONST PM_RPY & rpy){    r = rpy.r;    p = rpy.p;    y = rpy.y;}#endifPM_RPY::PM_RPY(double _r, double _p, double _y){    r = _r;    p = _p;    y = _y;}PM_RPY::PM_RPY(PM_CONST PM_QUATERNION PM_REF q){    PmQuaternion quat;    PmRpy rpy;    toQuat(q, &quat);    pmQuatRpyConvert(quat, &rpy);    toRpy(rpy, this);}PM_RPY::PM_RPY(PM_CONST PM_ROTATION_MATRIX PM_REF m){    PmRotationMatrix mat;    PmRpy rpy;    toMat(m, &mat);    pmMatRpyConvert(mat, &rpy);    toRpy(rpy, this);}double &PM_RPY::operator [] (int n) {    switch (n) {    case 0:	return r;    case 1:	return p;    case 2:	return y;    default:	return noElement;	// need to return a double &    }}PM_RPY PM_RPY::operator =(PM_RPY rpy){    r = rpy.r;    p = rpy.p;    y = rpy.y;    return rpy;}// PM_POSE classPM_POSE::PM_POSE(PM_CARTESIAN v, PM_QUATERNION q){    tran.x = v.x;    tran.y = v.y;    tran.z = v.z;    rot.s = q.s;    rot.x = q.x;    rot.y = q.y;    rot.z = q.z;}PM_POSE::PM_POSE(double x, double y, double z,    double s, double sx, double sy, double sz){    tran.x = x;    tran.y = y;    tran.z = z;    rot.s = s;    rot.x = sx;    rot.y = sy;    rot.z = sz;}PM_POSE::PM_POSE(PM_CONST PM_HOMOGENEOUS PM_REF h){    PmHomogeneous hom;    PmPose pose;    toHom(h, &hom);    pmHomPoseConvert(hom, &pose);    toPose(pose, this);}double &PM_POSE::operator [] (int n) {    switch (n) {    case 0:	return tran.x;    case 1:	return tran.y;    case 2:	return tran.z;    case 3:	return rot.s;    case 4:	return rot.x;    case 5:	return rot.y;    case 6:	return rot.z;    default:	return noElement;	// need to return a double &    }}#ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORSPM_POSE::PM_POSE(PM_CCONST PM_POSE & p){    tran = p.tran;    rot = p.rot;}#endifPM_POSE PM_POSE::operator =(PM_POSE p){    tran = p.tran;    rot = p.rot;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -