00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "posemath.h"
00024
00025 #ifdef PM_PRINT_ERROR
00026 #define PM_DEBUG // need debug with printing
00027 #endif
00028
00029
00030 static double noElement = 0.0;
00031 static PM_CARTESIAN *noCart = 0;
00032
00033
00034
00035
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;
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
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;
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
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;
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
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;
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
00290
00291
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
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
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);
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
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;
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
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;
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
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;
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
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;
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
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;
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
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
00817
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);
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
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
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
00954
00955
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
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
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
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
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
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
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
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
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
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
01447
01448
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 }