Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

posemath.cc

Go to the documentation of this file.
00001 /*
00002    posemath.cc
00003 
00004    C++ definitions for pose math library data types and
00005    manipulation functions.
00006 
00007    Modification history:
00008 
00009   15-Nov-1999 WPS added PM_QUATERNION::PM_QUATERNION(PM_AXIS,angle) and
00010   5-Nov-1998 WPS made modifications to PM_QUATERNION operator /
00011     so that it could be compiled with the newer GNU compiler.
00012    1-Sep-1998  FMP added PM_CARTESIAN operator * (PM_POSE, PM_CARTESIAN)
00013    15-Jan-1998  FMP added inv(PM_HOMOGENEOUS)
00014    18-Dec-1997  FMP changed line, circle to use poses
00015    11-Sep-1997  FMP added PM_PRINT_ERROR
00016    11-Jul-1997  FMP added conversion from C++ structs to C struct when
00017    calling C functions
00018    7-May-1997 WPS added copy constructors to avoid
00019    ambigous type error from VxWorks compiler.
00020    14-Apr-1997  FMP created from posemath.c C/C++ hybrid
00021 */
00022 
00023 #include "posemath.h"
00024 
00025 #ifdef PM_PRINT_ERROR
00026 #define PM_DEBUG                // need debug with printing
00027 #endif
00028 
00029 // place to reference arrays when bounds are exceeded
00030 static double noElement = 0.0;
00031 static PM_CARTESIAN *noCart = 0;
00032 
00033 //
00034 
00035 // PM_CARTESIAN class
00036 
00037 PM_CARTESIAN::PM_CARTESIAN(double _x, double _y, double _z)
00038 {
00039   x = _x;
00040   y = _y;
00041   z = _z;
00042 }
00043 
00044 PM_CARTESIAN::PM_CARTESIAN(PM_CONST  PM_CYLINDRICAL PM_REF c)
00045 {
00046   PmCylindrical cyl;
00047   PmCartesian cart;
00048 
00049   toCyl(c, &cyl);
00050   pmCylCartConvert(cyl, &cart);
00051   toCart(cart, this);
00052 }
00053 
00054 PM_CARTESIAN::PM_CARTESIAN(PM_CONST PM_SPHERICAL PM_REF s)
00055 {
00056   PmSpherical sph;
00057   PmCartesian cart;
00058 
00059   toSph(s, &sph);
00060   pmSphCartConvert(sph, &cart);
00061   toCart(cart, this);
00062 }
00063 
00064 double & PM_CARTESIAN::operator [] (int n)
00065 {
00066   switch (n)
00067   {
00068   case 0:
00069     return x;
00070   case 1:
00071     return y;
00072   case 2:
00073     return z;
00074   default:
00075     return noElement;           // need to return a double &
00076   }
00077 }
00078 
00079 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00080 PM_CARTESIAN::PM_CARTESIAN(PM_CCONST PM_CARTESIAN &v)
00081 {
00082   x = v.x;
00083   y = v.y;
00084   z = v.z;
00085 }
00086 #endif
00087 
00088 
00089 PM_CARTESIAN PM_CARTESIAN::operator = (PM_CARTESIAN v)
00090 {
00091   x = v.x;
00092   y = v.y;
00093   z = v.z;
00094 
00095   return v;
00096 }
00097 
00098 // PM_SPHERICAL
00099 
00100 PM_SPHERICAL::PM_SPHERICAL(double _theta, double _phi, double _r)
00101 {
00102   theta = _theta;
00103   phi = _phi;
00104   r = _r;
00105 }
00106 
00107 PM_SPHERICAL::PM_SPHERICAL(PM_CONST PM_CARTESIAN PM_REF v)
00108 {
00109   PmCartesian cart;
00110   PmSpherical sph;
00111 
00112   toCart(v, &cart);
00113   pmCartSphConvert(cart, &sph);
00114   toSph(sph, this);
00115 }
00116 
00117 PM_SPHERICAL::PM_SPHERICAL(PM_CONST PM_CYLINDRICAL PM_REF c)
00118 {
00119   PmCylindrical cyl;
00120   PmSpherical sph;
00121 
00122   toCyl(c, &cyl);
00123   pmCylSphConvert(cyl, &sph);
00124   toSph(sph, this);
00125 }
00126 
00127 double & PM_SPHERICAL::operator [] (int n)
00128 {
00129   switch (n)
00130   {
00131   case 0:
00132     return theta;
00133   case 1:
00134     return phi;
00135   case 2:
00136     return r;
00137   default:
00138     return noElement;           // need to return a double &
00139   }
00140 }
00141 
00142 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00143 PM_SPHERICAL::PM_SPHERICAL(PM_CCONST PM_SPHERICAL &s)
00144 {
00145   theta = s.theta;
00146   phi = s.phi;
00147   r = s.r;
00148 }
00149 #endif
00150 
00151 
00152 PM_SPHERICAL PM_SPHERICAL::operator = (PM_SPHERICAL s)
00153 {
00154   theta = s.theta;
00155   phi = s.phi;
00156   r = s.r;
00157 
00158   return s;
00159 }
00160 
00161 // PM_CYLINDRICAL
00162 
00163 PM_CYLINDRICAL::PM_CYLINDRICAL(double _theta, double _r, double _z)
00164 {
00165   theta = _theta;
00166   r = _r;
00167   z = _z;
00168 }
00169 
00170 PM_CYLINDRICAL::PM_CYLINDRICAL(PM_CONST PM_CARTESIAN PM_REF v)
00171 {
00172   PmCartesian cart;
00173   PmCylindrical cyl;
00174 
00175   toCart(v, &cart);
00176   pmCartCylConvert(cart, &cyl);
00177   toCyl(cyl, this);
00178 }
00179 
00180 
00181 
00182 PM_CYLINDRICAL::PM_CYLINDRICAL(PM_CONST PM_SPHERICAL PM_REF s)
00183 {
00184   PmSpherical sph;
00185   PmCylindrical cyl;
00186 
00187   toSph(s, &sph);
00188   pmSphCylConvert(sph, &cyl);
00189   toCyl(cyl, this);
00190 }
00191 
00192 double & PM_CYLINDRICAL::operator [] (int n)
00193 {
00194   switch (n)
00195   {
00196   case 0:
00197     return theta;
00198   case 1:
00199     return r;
00200   case 2:
00201     return z;
00202   default:
00203     return noElement;           // need to return a double &
00204   }
00205 }
00206 
00207 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00208 PM_CYLINDRICAL::PM_CYLINDRICAL(PM_CCONST PM_CYLINDRICAL &c)
00209 {
00210   theta = c.theta;
00211   r = c.r;
00212   z = c.z;
00213 }
00214 #endif
00215 
00216 PM_CYLINDRICAL PM_CYLINDRICAL::operator = (PM_CYLINDRICAL c)
00217 {
00218   theta = c.theta;
00219   r = c.r;
00220   z = c.z;
00221 
00222   return c;
00223 }
00224 
00225 
00226 // PM_ROTATION_VECTOR
00227 
00228 PM_ROTATION_VECTOR::PM_ROTATION_VECTOR(double _s, double _x,
00229                                        double _y, double _z)
00230 {
00231   PmRotationVector rv;
00232 
00233   rv.s = _s;
00234   rv.x = _x;
00235   rv.y = _y;
00236   rv.z = _z;
00237 
00238   pmRotNorm(rv, &rv);
00239   toRot(rv, this);
00240 }
00241 
00242 PM_ROTATION_VECTOR::PM_ROTATION_VECTOR(PM_CONST PM_QUATERNION PM_REF q)
00243 {
00244   PmQuaternion quat;
00245   PmRotationVector rv;
00246 
00247   toQuat(q, &quat);
00248   pmQuatRotConvert(quat, &rv);
00249   toRot(rv, this);
00250 }
00251 
00252 double & PM_ROTATION_VECTOR::operator [] (int n)
00253 {
00254   switch (n)
00255   {
00256   case 0:
00257     return s;
00258   case 1:
00259     return x;
00260   case 2:
00261     return y;
00262   case 3:
00263     return z;
00264   default:
00265     return noElement;           // need to return a double &
00266   }
00267 }
00268 
00269 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00270 PM_ROTATION_VECTOR::PM_ROTATION_VECTOR(PM_CCONST PM_ROTATION_VECTOR &r)
00271 {
00272   s = r.s;
00273   x = r.x;
00274   y = r.y;
00275   z = r.z;
00276 }
00277 #endif
00278 
00279 PM_ROTATION_VECTOR PM_ROTATION_VECTOR::operator = (PM_ROTATION_VECTOR r)
00280 {
00281   s = r.s;
00282   x = r.x;
00283   y = r.y;
00284   z = r.z;
00285 
00286   return r;
00287 }
00288 
00289 // PM_ROTATION_MATRIX class
00290 
00291 // ctors/dtors
00292 
00293 PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(double xx, double xy, double xz,
00294                                        double yx, double yy, double yz,
00295                                        double zx, double zy, double zz)
00296 {
00297   x.x = xx;
00298   x.y = xy;
00299   x.z = xz;
00300 
00301   y.x = yx;
00302   y.y = yy;
00303   y.z = yz;
00304 
00305   z.x = zx;
00306   z.y = zy;
00307   z.z = zz;
00308 
00309   // FIXME-- need a matrix orthonormalization function pmMatNorm()
00310 }
00311 
00312 PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CARTESIAN _x, PM_CARTESIAN _y, PM_CARTESIAN _z)
00313 {
00314   x = _x;
00315   y = _y;
00316   z = _z;
00317 }
00318 
00319 PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CONST PM_ROTATION_VECTOR PM_REF v)
00320 {
00321   PmRotationVector rv;
00322   PmRotationMatrix mat;
00323 
00324   toRot(v, &rv);
00325   pmRotMatConvert(rv, &mat);
00326   toMat(mat, this);
00327 }
00328 
00329 PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CONST PM_QUATERNION PM_REF q)
00330 {
00331   PmQuaternion quat;
00332   PmRotationMatrix mat;
00333 
00334   toQuat(q, &quat);
00335   pmQuatMatConvert(quat, &mat);
00336   toMat(mat, this);
00337 }
00338 
00339 PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CONST PM_RPY PM_REF rpy)
00340 {
00341   PmRpy _rpy;
00342   PmRotationMatrix mat;
00343 
00344   toRpy(rpy, &_rpy);
00345   pmRpyMatConvert(_rpy, &mat);
00346   toMat(mat, this);
00347 }
00348 
00349 PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CONST PM_EULER_ZYZ PM_REF zyz)
00350 {
00351   PmEulerZyz _zyz;
00352   PmRotationMatrix mat;
00353 
00354   toEulerZyz(zyz, &_zyz);
00355   pmZyzMatConvert(_zyz, &mat);
00356   toMat(mat, this);
00357 }
00358 
00359 PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CONST PM_EULER_ZYX PM_REF zyx)
00360 {
00361   PmEulerZyx _zyx;
00362   PmRotationMatrix mat;
00363 
00364   toEulerZyx(zyx, &_zyx);
00365   pmZyxMatConvert(_zyx, &mat);
00366   toMat(mat, this);
00367 }
00368 
00369 // operators
00370 
00371 PM_CARTESIAN & PM_ROTATION_MATRIX::operator [] (int n)
00372 {
00373   switch (n)
00374   {
00375   case 0:
00376     return x;
00377   case 1:
00378     return y;
00379   case 2:
00380     return z;
00381   default:
00382     if(0 == noCart)
00383       {
00384         noCart = new PM_CARTESIAN(0.0,0.0,0.0);
00385       }
00386     return (*noCart);           // need to return a PM_CARTESIAN &
00387   }
00388 }
00389 
00390 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00391 PM_ROTATION_MATRIX::PM_ROTATION_MATRIX(PM_CCONST PM_ROTATION_MATRIX &m)
00392 {
00393   x = m.x;
00394   y = m.y;
00395   z = m.z;
00396 }
00397 #endif
00398 
00399 PM_ROTATION_MATRIX PM_ROTATION_MATRIX::operator = (PM_ROTATION_MATRIX m)
00400 {
00401   x = m.x;
00402   y = m.y;
00403   z = m.z;
00404 
00405   return m;
00406 }
00407 
00408 // PM_QUATERNION class
00409 
00410 PM_QUATERNION::PM_QUATERNION(double _s, double _x, double _y, double _z)
00411 {
00412   PmQuaternion quat;
00413 
00414   quat.s = _s;
00415   quat.x = _x;
00416   quat.y = _y;
00417   quat.z = _z;
00418 
00419   pmQuatNorm(quat, &quat);
00420 
00421   s = quat.s;
00422   x = quat.x;
00423   y = quat.y;
00424   z = quat.z;
00425 }
00426 
00427 
00428 PM_QUATERNION::PM_QUATERNION(PM_CONST PM_ROTATION_VECTOR PM_REF v)
00429 {
00430   PmRotationVector rv;
00431   PmQuaternion quat;
00432 
00433   toRot(v, &rv);
00434   pmRotQuatConvert(rv, &quat);
00435   toQuat(quat, this);
00436 }
00437 
00438 PM_QUATERNION::PM_QUATERNION(PM_CONST PM_ROTATION_MATRIX PM_REF m)
00439 {
00440   PmRotationMatrix mat;
00441   PmQuaternion quat;
00442 
00443   toMat(m, &mat);
00444   pmMatQuatConvert(mat, &quat);
00445   toQuat(quat, this);
00446 }
00447 
00448 PM_QUATERNION::PM_QUATERNION(PM_CONST PM_EULER_ZYZ PM_REF zyz)
00449 {
00450   PmEulerZyz _zyz;
00451   PmQuaternion quat;
00452 
00453   toEulerZyz(zyz, &_zyz);
00454   pmZyzQuatConvert(_zyz, &quat);
00455   toQuat(quat, this);
00456 }
00457 
00458 PM_QUATERNION::PM_QUATERNION(PM_CONST PM_EULER_ZYX PM_REF zyx)
00459 {
00460   PmEulerZyx _zyx;
00461   PmQuaternion quat;
00462 
00463   toEulerZyx(zyx, &_zyx);
00464   pmZyxQuatConvert(_zyx, &quat);
00465   toQuat(quat, this);
00466 }
00467 
00468 PM_QUATERNION::PM_QUATERNION(PM_CONST PM_RPY PM_REF rpy)
00469 {
00470   PmRpy _rpy;
00471   PmQuaternion quat;
00472 
00473   toRpy(rpy, &_rpy);
00474   pmRpyQuatConvert(_rpy, &quat);
00475   toQuat(quat, this);
00476 }
00477 
00478 
00479 PM_QUATERNION::PM_QUATERNION( PM_AXIS _axis,  double _angle)
00480 {
00481   PmQuaternion quat;
00482 
00483   pmAxisAngleQuatConvert((PmAxis) _axis,_angle, &quat);
00484   toQuat(quat, this);
00485 }
00486 
00487 
00488 void PM_QUATERNION::axisAngleMult( PM_AXIS _axis,  double _angle)
00489 {
00490   PmQuaternion quat;
00491 
00492   toQuat((*this), &quat);
00493   pmQuatAxisAngleMult(quat, (PmAxis) _axis,_angle, &quat);
00494   toQuat(quat, this);
00495 }
00496 
00497 
00498 double & PM_QUATERNION::operator [] (int n)
00499 {
00500   switch (n)
00501   {
00502   case 0:
00503     return s;
00504   case 1:
00505     return x;
00506   case 2:
00507     return y;
00508   case 3:
00509     return z;
00510   default:
00511     return noElement;           // need to return a double &
00512   }
00513 }
00514 
00515 PM_QUATERNION PM_QUATERNION::operator = (PM_QUATERNION q)
00516 {
00517   s = q.s;
00518   x = q.x;
00519   y = q.y;
00520   z = q.z;
00521 
00522   return q;
00523 }
00524 
00525 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00526 PM_QUATERNION::PM_QUATERNION(PM_CCONST PM_QUATERNION &q)
00527 {
00528   s = q.s;
00529   x = q.x;
00530   y = q.y;
00531   z = q.z;
00532 }
00533 #endif
00534 
00535 // PM_EULER_ZYZ class
00536 
00537 PM_EULER_ZYZ::PM_EULER_ZYZ(double _z, double _y, double _zp)
00538 {
00539   z = _z;
00540   y = _y;
00541   zp = _zp;
00542 }
00543 
00544 PM_EULER_ZYZ::PM_EULER_ZYZ(PM_CONST PM_QUATERNION PM_REF q)
00545 {
00546   PmQuaternion quat;
00547   PmEulerZyz zyz;
00548 
00549   toQuat(q, &quat);
00550   pmQuatZyzConvert(quat, &zyz);
00551   toEulerZyz(zyz, this);
00552 }
00553 
00554 PM_EULER_ZYZ::PM_EULER_ZYZ(PM_CONST PM_ROTATION_MATRIX PM_REF m)
00555 {
00556   PmRotationMatrix mat;
00557   PmEulerZyz zyz;
00558 
00559   toMat(m, &mat);
00560   pmMatZyzConvert(mat, &zyz);
00561   toEulerZyz(zyz, this);
00562 }
00563 
00564 double & PM_EULER_ZYZ::operator [] (int n)
00565 {
00566   switch (n)
00567   {
00568   case 0:
00569     return z;
00570   case 1:
00571     return y;
00572   case 2:
00573     return zp;
00574   default:
00575     return noElement;           // need to return a double &
00576   }
00577 }
00578 
00579 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00580 PM_EULER_ZYZ::PM_EULER_ZYZ(PM_CCONST PM_EULER_ZYZ &zyz)
00581 {
00582   z = zyz.z;
00583   y = zyz.y;
00584   zp = zyz.zp;
00585 }
00586 #endif
00587 
00588 PM_EULER_ZYZ PM_EULER_ZYZ::operator = (PM_EULER_ZYZ zyz)
00589 {
00590   z = zyz.z;
00591   y = zyz.y;
00592   zp = zyz.zp;
00593 
00594   return zyz;
00595 }
00596 
00597 // PM_EULER_ZYX class
00598 
00599 PM_EULER_ZYX::PM_EULER_ZYX(double _z, double _y, double _x)
00600 {
00601   z = _z;
00602   y = _y;
00603   x = _x;
00604 }
00605 
00606 PM_EULER_ZYX::PM_EULER_ZYX(PM_CONST PM_QUATERNION PM_REF q)
00607 {
00608   PmQuaternion quat;
00609   PmEulerZyx zyx;
00610 
00611   toQuat(q, &quat);
00612   pmQuatZyxConvert(quat, &zyx);
00613   toEulerZyx(zyx, this);
00614 }
00615 
00616 PM_EULER_ZYX::PM_EULER_ZYX(PM_CONST PM_ROTATION_MATRIX PM_REF m)
00617 {
00618   PmRotationMatrix mat;
00619   PmEulerZyx zyx;
00620 
00621   toMat(m, &mat);
00622   pmMatZyxConvert(mat, &zyx);
00623   toEulerZyx(zyx, this);
00624 }
00625 
00626 double & PM_EULER_ZYX::operator [] (int n)
00627 {
00628   switch (n)
00629   {
00630   case 0:
00631     return z;
00632   case 1:
00633     return y;
00634   case 2:
00635     return x;
00636   default:
00637     return noElement;           // need to return a double &
00638   }
00639 }
00640 
00641 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00642 PM_EULER_ZYX::PM_EULER_ZYX(PM_CCONST PM_EULER_ZYX &zyx)
00643 {
00644   z = zyx.z;
00645   y = zyx.y;
00646   x = zyx.x;
00647 }
00648 #endif
00649 
00650 PM_EULER_ZYX PM_EULER_ZYX::operator = (PM_EULER_ZYX zyx)
00651 {
00652   z = zyx.z;
00653   y = zyx.y;
00654   x = zyx.x;
00655 
00656   return zyx;
00657 }
00658 
00659 // PM_RPY class
00660 
00661 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00662 PM_RPY::PM_RPY(PM_CCONST PM_RPY &rpy)
00663 {
00664   r = rpy.r;
00665   p = rpy.p;
00666   y = rpy.y;
00667 }
00668 #endif
00669 
00670 PM_RPY::PM_RPY(double _r, double _p, double _y)
00671 {
00672   r = _r;
00673   p = _p;
00674   y = _y;
00675 }
00676 
00677 PM_RPY::PM_RPY(PM_CONST PM_QUATERNION PM_REF q)
00678 {
00679   PmQuaternion quat;
00680   PmRpy rpy;
00681 
00682   toQuat(q, &quat);
00683   pmQuatRpyConvert(quat, &rpy);
00684   toRpy(rpy, this);
00685 }
00686 
00687 PM_RPY::PM_RPY(PM_CONST PM_ROTATION_MATRIX PM_REF m)
00688 {
00689   PmRotationMatrix mat;
00690   PmRpy rpy;
00691 
00692   toMat(m, &mat);
00693   pmMatRpyConvert(mat, &rpy);
00694   toRpy(rpy, this);
00695 }
00696 
00697 double & PM_RPY::operator [] (int n)
00698 {
00699   switch (n)
00700   {
00701   case 0:
00702     return r;
00703     case 1:
00704     return p;
00705   case 2:
00706     return y;
00707   default:
00708     return noElement;           // need to return a double &
00709   }
00710 }
00711 
00712 PM_RPY PM_RPY::operator = (PM_RPY rpy)
00713 {
00714   r = rpy.r;
00715   p = rpy.p;
00716   y = rpy.y;
00717 
00718   return rpy;
00719 }
00720 
00721 // PM_POSE class
00722 
00723 PM_POSE::PM_POSE(PM_CARTESIAN v, PM_QUATERNION q)
00724 {
00725   tran.x = v.x;
00726   tran.y = v.y;
00727   tran.z = v.z;
00728   rot.s = q.s;
00729   rot.x = q.x;
00730   rot.y = q.y;
00731   rot.z = q.z;
00732 }
00733 
00734 PM_POSE::PM_POSE(double x, double y, double z,
00735            double s, double sx, double sy, double sz)
00736 {
00737   tran.x = x;
00738   tran.y = y;
00739   tran.z = z;
00740   rot.s = s;
00741   rot.x = sx;
00742   rot.y = sy;
00743   rot.z = sz;
00744 }
00745 
00746 PM_POSE::PM_POSE(PM_CONST PM_HOMOGENEOUS PM_REF h)
00747 {
00748   PmHomogeneous hom;
00749   PmPose pose;
00750 
00751   toHom(h, &hom);
00752   pmHomPoseConvert(hom, &pose);
00753   toPose(pose, this);
00754 }
00755 
00756 double & PM_POSE::operator [] (int n)
00757 {
00758   switch (n)
00759   {
00760   case 0:
00761     return tran.x;
00762   case 1:
00763     return tran.y;
00764   case 2:
00765     return tran.z;
00766   case 3:
00767     return rot.s;
00768   case 4:
00769     return rot.x;
00770   case 5:
00771     return rot.y;
00772   case 6:
00773     return rot.z;
00774   default:
00775     return noElement;           // need to return a double &
00776   }
00777 }
00778 
00779 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00780 PM_POSE::PM_POSE(PM_CCONST PM_POSE &p)
00781 {
00782   tran = p.tran;
00783   rot = p.rot;
00784 }
00785 #endif
00786 
00787 
00788 PM_POSE PM_POSE::operator = (PM_POSE p)
00789 {
00790   tran = p.tran;
00791   rot = p.rot;
00792 
00793   return p;
00794 }
00795 
00796 // PM_HOMOGENEOUS class
00797 
00798 PM_HOMOGENEOUS::PM_HOMOGENEOUS(PM_CARTESIAN v, PM_ROTATION_MATRIX m)
00799 {
00800   tran = v;
00801   rot = m;
00802 }
00803 
00804 PM_HOMOGENEOUS::PM_HOMOGENEOUS(PM_CONST PM_POSE PM_REF p)
00805 {
00806   PmPose pose;
00807   PmHomogeneous hom;
00808 
00809   toPose(p, &pose);
00810   pmPoseHomConvert(pose, &hom);
00811   toHom(hom, this);
00812 }
00813 
00814 PM_CARTESIAN & PM_HOMOGENEOUS::operator [] (int n)
00815 {
00816   // if it is a rotation vector, stuff 0 as default bottom
00817   // if it is a translation vector, stuff 1 as default bottom
00818 
00819   switch (n)
00820   {
00821   case 0:
00822     noElement = 0.0;
00823     return rot.x;
00824   case 1:
00825     noElement = 0.0;
00826     return rot.y;
00827   case 2:
00828     noElement = 0.0;
00829     return rot.z;
00830   case 3:
00831     noElement = 1.0;
00832     return tran;
00833   default:
00834     if(0 == noCart)
00835       {
00836         noCart = new PM_CARTESIAN(0.0,0.0,0.0);
00837       }
00838     return (*noCart);           // need to return a PM_CARTESIAN &
00839   }
00840 }
00841 
00842 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00843 PM_HOMOGENEOUS::PM_HOMOGENEOUS(PM_CCONST PM_HOMOGENEOUS &h)
00844 {
00845   tran = h.tran;
00846   rot = h.rot;
00847 }
00848 #endif
00849 
00850 
00851 PM_HOMOGENEOUS PM_HOMOGENEOUS::operator = (PM_HOMOGENEOUS h)
00852 {
00853   tran = h.tran;
00854   rot = h.rot;
00855 
00856   return h;
00857 }
00858 
00859 // PM_LINE class
00860 
00861 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00862 PM_LINE::PM_LINE(PM_CCONST PM_LINE &l)
00863 {
00864   start = l.start;
00865   end = l.end;
00866   uVec = l.uVec;
00867 }
00868 #endif
00869 
00870 int PM_LINE::init(PM_POSE start, PM_POSE end)
00871 {
00872   PmLine _line;
00873   PmPose _start, _end;
00874   int retval;
00875 
00876   toPose(start, &_start);
00877   toPose(end, &_end);
00878 
00879   retval = pmLineInit(&_line, _start, _end);
00880 
00881   toLine(_line, this);
00882 
00883   return retval;
00884 }
00885 
00886 int PM_LINE::point(double len, PM_POSE * point)
00887 {
00888   PmLine _line;
00889   PmPose _point;
00890   int retval;
00891 
00892   toLine(*this, &_line);
00893 
00894   retval = pmLinePoint(&_line, len, &_point);
00895 
00896   toPose(_point, point);
00897 
00898   return retval;
00899 }
00900 
00901 // PM_CIRCLE class
00902 
00903 #ifdef INCLUDE_POSEMATH_COPY_CONSTRUCTORS
00904 PM_CIRCLE::PM_CIRCLE(PM_CCONST PM_CIRCLE &c)
00905 {
00906   center = c.center;
00907   normal = c.normal;
00908   rTan = c.rTan;
00909   rPerp = c.rPerp;
00910   rHelix = c.rHelix;
00911   radius = c.radius;
00912   angle = c.angle;
00913   spiral = c.spiral;
00914 }
00915 #endif
00916 
00917 int PM_CIRCLE::init(PM_POSE start, PM_POSE end,
00918                     PM_CARTESIAN center, PM_CARTESIAN normal,
00919                     int turn)
00920 {
00921   PmCircle _circle;
00922   PmPose _start, _end;
00923   PmCartesian _center, _normal;
00924   int retval;
00925 
00926   toPose(start, &_start);
00927   toPose(end, &_end);
00928   toCart(center, &_center);
00929   toCart(normal, &_normal);
00930 
00931   retval = pmCircleInit(&_circle, _start, _end, _center, _normal, turn);
00932 
00933   toCircle(_circle, this);
00934 
00935   return retval;
00936 }
00937 
00938 int PM_CIRCLE::point(double angle, PM_POSE * point)
00939 {
00940   PmCircle _circle;
00941   PmPose _point;
00942   int retval;
00943 
00944   toCircle(*this, &_circle);
00945 
00946   retval = pmCirclePoint(&_circle, angle, &_point);
00947 
00948   toPose(_point, point);
00949 
00950   return retval;
00951 }
00952 
00953 // overloaded external functions
00954 
00955 // dot
00956 
00957 double dot(PM_CARTESIAN v1, PM_CARTESIAN v2)
00958 {
00959   double d;
00960   PmCartesian _v1, _v2;
00961 
00962   toCart(v1, &_v1);
00963   toCart(v2, &_v2);
00964 
00965   pmCartCartDot(_v1, _v2, &d);
00966 
00967   return d;
00968 }
00969 
00970 // cross
00971 
00972 PM_CARTESIAN cross(PM_CARTESIAN v1, PM_CARTESIAN v2)
00973 {
00974   PM_CARTESIAN ret;
00975   PmCartesian _v1, _v2;
00976 
00977   toCart(v1, &_v1);
00978   toCart(v2, &_v2);
00979 
00980   pmCartCartCross(_v1, _v2, &_v1);
00981 
00982   toCart(_v1, &ret);
00983 
00984   return ret;
00985 }
00986 
00987 
00988 //unit
00989 
00990 PM_CARTESIAN unit(PM_CARTESIAN v)
00991 {
00992   PM_CARTESIAN vout;
00993   PmCartesian _v;
00994 
00995   toCart(v, &_v);
00996 
00997   pmCartUnit(_v, &_v);
00998 
00999   toCart(_v, &vout);
01000 
01001   return vout;
01002 }
01003 
01004 
01005 // norm
01006 #if 0
01007 
01008 PM_CARTESIAN norm(PM_CARTESIAN v)
01009 {
01010   PM_CARTESIAN vout;
01011   PmCartesian _v;
01012 
01013   toCart(v, &_v);
01014 
01015   pmCartNorm(_v, &_v);
01016 
01017   toCart(_v, &vout);
01018 
01019   return vout;
01020 }
01021 #endif
01022 
01023 PM_QUATERNION norm(PM_QUATERNION q)
01024 {
01025   PM_QUATERNION qout;
01026   PmQuaternion _q;
01027 
01028   toQuat(q, &_q);
01029   pmQuatNorm(_q, &_q);
01030 
01031   toQuat(_q, &qout);
01032 
01033   return qout;
01034 }
01035 
01036 PM_ROTATION_VECTOR norm(PM_ROTATION_VECTOR r)
01037 {
01038   PM_ROTATION_VECTOR rout;
01039   PmRotationVector _r;
01040 
01041   toRot(r, &_r);
01042 
01043   pmRotNorm(_r, &_r);
01044 
01045   toRot(_r, &rout);
01046 
01047   return rout;
01048 }
01049 
01050 PM_ROTATION_MATRIX norm(PM_ROTATION_MATRIX m)
01051 {
01052   PM_ROTATION_MATRIX mout;
01053   PmRotationMatrix _m;
01054 
01055   toMat(m, &_m);
01056 
01057   pmMatNorm(_m, &_m);
01058 
01059   toMat(_m, &mout);
01060 
01061   return mout;
01062 }
01063 
01064 // isNorm
01065 
01066 int isNorm(PM_CARTESIAN v)
01067 {
01068   PmCartesian _v;
01069 
01070   toCart(v, &_v);
01071 
01072   return pmCartIsNorm(_v);
01073 }
01074 
01075 int isNorm(PM_QUATERNION q)
01076 {
01077   PmQuaternion _q;
01078 
01079   toQuat(q, &_q);
01080 
01081   return pmQuatIsNorm(_q);
01082 }
01083 
01084 int isNorm(PM_ROTATION_VECTOR r)
01085 {
01086   PmRotationVector _r;
01087 
01088   toRot(r, &_r);
01089 
01090   return pmRotIsNorm(_r);
01091 }
01092 
01093 int isNorm(PM_ROTATION_MATRIX m)
01094 {
01095   PmRotationMatrix _m;
01096 
01097   toMat(m, &_m);
01098 
01099   return pmMatIsNorm(_m);
01100 }
01101 
01102 // mag
01103 
01104 double mag(PM_CARTESIAN v)
01105 {
01106   double ret;
01107   PmCartesian _v;
01108 
01109   toCart(v, &_v);
01110 
01111   pmCartMag(_v, &ret);
01112 
01113   return ret;
01114 }
01115 
01116 // disp
01117 
01118 double disp(PM_CARTESIAN v1, PM_CARTESIAN v2)
01119 {
01120   double ret;
01121   PmCartesian _v1, _v2;
01122 
01123   toCart(v1, &_v1);
01124   toCart(v2, &_v2);
01125 
01126   pmCartCartDisp(_v1, _v2, &ret);
01127 
01128   return ret;
01129 }
01130 
01131 // inv
01132 
01133 PM_CARTESIAN inv(PM_CARTESIAN v)
01134 {
01135   PM_CARTESIAN ret;
01136   PmCartesian _v;
01137 
01138   toCart(v, &_v);
01139 
01140   pmCartInv(_v, &_v);
01141 
01142   toCart(_v, &ret);
01143 
01144   return ret;
01145 }
01146 
01147 PM_ROTATION_MATRIX inv(PM_ROTATION_MATRIX m)
01148 {
01149   PM_ROTATION_MATRIX ret;
01150   PmRotationMatrix _m;
01151 
01152   toMat(m, &_m);
01153 
01154   pmMatInv(_m, &_m);
01155 
01156   toMat(_m, &ret);
01157 
01158   return ret;
01159 }
01160 
01161 PM_QUATERNION inv(PM_QUATERNION q)
01162 {
01163   PM_QUATERNION ret;
01164   PmQuaternion _q;
01165 
01166   toQuat(q, &_q);
01167 
01168   pmQuatInv(_q, &_q);
01169 
01170   toQuat(_q, &ret);
01171 
01172   return ret;
01173 }
01174 
01175 PM_POSE inv(PM_POSE p)
01176 {
01177   PM_POSE ret;
01178   PmPose _p;
01179 
01180   toPose(p, &_p);
01181 
01182   pmPoseInv(_p, &_p);
01183 
01184   toPose(_p, &ret);
01185 
01186   return ret;
01187 }
01188 
01189 PM_HOMOGENEOUS inv(PM_HOMOGENEOUS h)
01190 {
01191   PM_HOMOGENEOUS ret;
01192   PmHomogeneous _h;
01193 
01194   toHom(h, &_h);
01195 
01196   pmHomInv(_h, &_h);
01197 
01198   toHom(_h, &ret);
01199 
01200   return ret;
01201 }
01202 
01203 // project
01204 
01205 PM_CARTESIAN proj(PM_CARTESIAN v1, PM_CARTESIAN v2)
01206 {
01207   PM_CARTESIAN ret;
01208   PmCartesian _v1, _v2;
01209 
01210   toCart(v1, &_v1);
01211   toCart(v2, &_v2);
01212 
01213   pmCartCartProj(_v1, _v2, &_v1);
01214 
01215   toCart(_v1, &ret);
01216 
01217   return ret;
01218 }
01219 
01220 // overloaded arithmetic operators
01221 
01222 PM_CARTESIAN operator + (PM_CARTESIAN v)
01223 {
01224   return v;
01225 }
01226 
01227 PM_CARTESIAN operator - (PM_CARTESIAN v)
01228 {
01229   PM_CARTESIAN ret;
01230 
01231   ret.x = -v.x;
01232   ret.y = -v.y;
01233   ret.z = -v.z;
01234 
01235   return ret;
01236 }
01237 
01238 PM_QUATERNION operator + (PM_QUATERNION q)
01239 {
01240   return q;
01241 }
01242 
01243 PM_QUATERNION operator - (PM_QUATERNION q)
01244 {
01245   PM_QUATERNION ret;
01246   PmQuaternion _q;
01247 
01248   toQuat(q, &_q);
01249 
01250   pmQuatInv(_q, &_q);
01251 
01252   toQuat(_q, &ret);
01253 
01254   return ret;
01255 }
01256 
01257 PM_POSE operator + (PM_POSE p)
01258 {
01259   return p;
01260 }
01261 
01262 PM_POSE operator - (PM_POSE p)
01263 {
01264   PM_POSE ret;
01265   PmPose _p;
01266 
01267   toPose(p, &_p);
01268 
01269   pmPoseInv(_p, &_p);
01270 
01271   toPose(_p, &ret);
01272 
01273   return ret;
01274 }
01275 
01276 int operator == (PM_CARTESIAN v1, PM_CARTESIAN v2)
01277 {
01278   PmCartesian _v1, _v2;
01279 
01280   toCart(v1, &_v1);
01281   toCart(v2, &_v2);
01282 
01283   return pmCartCartCompare(_v1, _v2);
01284 }
01285 
01286 int operator == (PM_QUATERNION q1, PM_QUATERNION q2)
01287 {
01288   PmQuaternion _q1, _q2;
01289 
01290   toQuat(q1, &_q1);
01291   toQuat(q2, &_q2);
01292 
01293   return pmQuatQuatCompare(_q1, _q2);
01294 }
01295 
01296 int operator == (PM_POSE p1, PM_POSE p2)
01297 {
01298   PmPose _p1, _p2;
01299 
01300   toPose(p1, &_p1);
01301   toPose(p2, &_p2);
01302 
01303   return pmPosePoseCompare(_p1, _p2);
01304 }
01305 
01306 int operator != (PM_CARTESIAN v1, PM_CARTESIAN v2)
01307 {
01308   PmCartesian _v1, _v2;
01309 
01310   toCart(v1, &_v1);
01311   toCart(v2, &_v2);
01312 
01313   return ! pmCartCartCompare(_v1, _v2);
01314 }
01315 
01316 int operator != (PM_QUATERNION q1, PM_QUATERNION q2)
01317 {
01318   PmQuaternion _q1, _q2;
01319 
01320   toQuat(q1, &_q1);
01321   toQuat(q2, &_q2);
01322 
01323   return ! pmQuatQuatCompare(_q1, _q2);
01324 }
01325 
01326 int operator != (PM_POSE p1, PM_POSE p2)
01327 {
01328   PmPose _p1, _p2;
01329 
01330   toPose(p1, &_p1);
01331   toPose(p2, &_p2);
01332 
01333   return ! pmPosePoseCompare(_p1, _p2);
01334 }
01335 
01336 PM_CARTESIAN operator + (PM_CARTESIAN v1, PM_CARTESIAN v2)
01337 {
01338   PM_CARTESIAN ret;
01339 
01340   ret.x = v1.x + v2.x;
01341   ret.y = v1.y + v2.y;
01342   ret.z = v1.z + v2.z;
01343 
01344   return ret;
01345 }
01346 
01347 PM_CARTESIAN operator - (PM_CARTESIAN v1, PM_CARTESIAN v2)
01348 {
01349   PM_CARTESIAN ret;
01350 
01351   ret.x = v1.x - v2.x;
01352   ret.y = v1.y - v2.y;
01353   ret.z = v1.z - v2.z;
01354 
01355   return ret;
01356 }
01357 
01358 PM_CARTESIAN operator * (PM_CARTESIAN v, double s)
01359 {
01360   PM_CARTESIAN ret;
01361 
01362   ret.x = v.x * s;
01363   ret.y = v.y * s;
01364   ret.z = v.z * s;
01365 
01366   return ret;
01367 }
01368 
01369 PM_CARTESIAN operator * (double s, PM_CARTESIAN v)
01370 {
01371   PM_CARTESIAN ret;
01372 
01373   ret.x = v.x * s;
01374   ret.y = v.y * s;
01375   ret.z = v.z * s;
01376 
01377   return ret;
01378 }
01379 
01380 PM_CARTESIAN operator / (PM_CARTESIAN v, double s)
01381 {
01382   PM_CARTESIAN ret;
01383 
01384 #ifdef PM_DEBUG
01385   if (s == 0.0)
01386   {
01387 #ifdef PM_PRINT_ERROR
01388     pmPrintError("PM_CARTESIAN::operator / : divide by 0\n");
01389 #endif
01390     pmErrno = PM_DIV_ERR;
01391     return ret;
01392   }
01393 #endif
01394 
01395   ret.x = v.x / s;
01396   ret.y = v.y / s;
01397   ret.z = v.z / s;
01398 
01399   return ret;
01400 }
01401 
01402 PM_QUATERNION operator * (double s, PM_QUATERNION q)
01403 {
01404   PM_QUATERNION qout;
01405   PmQuaternion _q;
01406 
01407   toQuat(q, &_q);
01408 
01409   pmQuatScalMult(_q, s, &_q);
01410 
01411   toQuat(_q, &qout);
01412 
01413   return qout;
01414 }
01415 
01416 PM_QUATERNION operator * ( PM_QUATERNION q, double s)
01417 {
01418   PM_QUATERNION qout;
01419   PmQuaternion _q;
01420 
01421   toQuat(q, &_q);
01422 
01423   pmQuatScalMult(_q, s, &_q);
01424 
01425   toQuat(_q, &qout);
01426 
01427   return qout;
01428 }
01429 
01430 PM_QUATERNION operator / ( PM_QUATERNION q, double s)
01431 {
01432   PM_QUATERNION qout;
01433   PmQuaternion _q;
01434 
01435   toQuat(q, &_q);
01436 
01437 #ifdef PM_DEBUG
01438   if (s == 0.0)
01439   {
01440 #ifdef PM_PRINT_ERROR
01441     pmPrintError("Divide by 0 in operator /\n");
01442 #endif
01443     pmErrno = PM_NORM_ERR;
01444 
01445 #if 0
01446  // g++/gcc versions 2.8.x and 2.9.x
01447   // will complain that the call to PM_QUATERNION(PM_QUATERNION) is
01448   // ambigous. (2.7.x and some others allow it)
01449   return qout = PM_QUATERNION((double) 0, (double)0, (double)0, (double)0);
01450 #else
01451 
01452   PmQuaternion quat;
01453 
01454   quat.s = 0;
01455   quat.x = 0;
01456   quat.y = 0;
01457   quat.z = 0;
01458 
01459   pmQuatNorm(quat, &quat);
01460 
01461   qout.s = quat.s;
01462   qout.x = quat.x;
01463   qout.y = quat.y;
01464   qout.z = quat.z;
01465   return qout;
01466 #endif
01467 
01468   }
01469 #endif
01470 
01471   pmQuatScalMult(_q, 1.0 / s, &_q);
01472   toQuat(_q, &qout);
01473 
01474   pmErrno = 0;
01475   return qout;
01476 }
01477 
01478 PM_CARTESIAN operator * (PM_QUATERNION q, PM_CARTESIAN v)
01479 {
01480   PM_CARTESIAN vout;
01481   PmQuaternion _q;
01482   PmCartesian _v;
01483 
01484   toQuat(q, &_q);
01485   toCart(v, &_v);
01486 
01487   pmQuatCartMult(_q, _v, &_v);
01488 
01489   toCart(_v, &vout);
01490 
01491   return vout;
01492 }
01493 
01494 PM_QUATERNION operator * (PM_QUATERNION q1, PM_QUATERNION q2)
01495 {
01496   PM_QUATERNION ret;
01497   PmQuaternion _q1, _q2;
01498 
01499   toQuat(q1, &_q1);
01500   toQuat(q2, &_q2);
01501 
01502   pmQuatQuatMult(_q1, _q2, &_q1);
01503 
01504   toQuat(_q1, &ret);
01505 
01506   return ret;
01507 }
01508 
01509 PM_ROTATION_MATRIX operator * (PM_ROTATION_MATRIX m1, PM_ROTATION_MATRIX m2)
01510 {
01511   PM_ROTATION_MATRIX ret;
01512   PmRotationMatrix _m1, _m2;
01513 
01514   toMat(m1, &_m1);
01515   toMat(m2, &_m2);
01516 
01517   pmMatMatMult(_m1, _m2, &_m1);
01518 
01519   toMat(_m1, &ret);
01520 
01521   return ret;
01522 }
01523 
01524 PM_POSE operator * (PM_POSE p1, PM_POSE p2)
01525 {
01526   PM_POSE ret;
01527   PmPose _p1, _p2;
01528 
01529   toPose(p1, &_p1);
01530   toPose(p2, &_p2);
01531 
01532   pmPosePoseMult(_p1, _p2, &_p1);
01533 
01534   toPose(_p1, &ret);
01535 
01536   return ret;
01537 }
01538 
01539 PM_CARTESIAN operator * (PM_POSE p, PM_CARTESIAN v)
01540 {
01541   PM_CARTESIAN ret;
01542   PmPose _p;
01543   PmCartesian _v;
01544 
01545   toPose(p, &_p);
01546   toCart(v, &_v);
01547 
01548   pmPoseCartMult(_p, _v, &_v);
01549 
01550   toCart(_v, &ret);
01551 
01552   return ret;
01553 }

Generated on Sun Dec 2 15:56:51 2001 for rcslib by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001