diff options
author | Robert W. Ellenberg <rwe24g@gmail.com> | 2014-01-30 11:49:40 -0500 |
---|---|---|
committer | Chris Radek <chris@timeguy.com> | 2014-06-11 14:44:04 -0500 |
commit | 101294e2ba6c0cdbdd9185df7a4d5c62deb24a1b (patch) | |
tree | a364ff54d6fb634d2302e1af0c7717ab5dd91c28 | |
parent | cf53aaab427fef41ceb40697078414f95fbf2ce7 (diff) | |
download | linuxcnc-101294e2ba6c0cdbdd9185df7a4d5c62deb24a1b.tar.gz linuxcnc-101294e2ba6c0cdbdd9185df7a4d5c62deb24a1b.zip |
Posemath fixes for self-assignment in C PmCartesian functions
Conflicts:
src/libnml/posemath/_posemath.c
-rw-r--r-- | src/libnml/posemath/_posemath.c | 152 | ||||
-rw-r--r-- | src/libnml/posemath/posemath.cc | 2 | ||||
-rw-r--r-- | src/libnml/posemath/posemath.h | 8 |
3 files changed, 112 insertions, 50 deletions
diff --git a/src/libnml/posemath/_posemath.c b/src/libnml/posemath/_posemath.c index 49c4bd098..123a917a2 100644 --- a/src/libnml/posemath/_posemath.c +++ b/src/libnml/posemath/_posemath.c @@ -813,6 +813,9 @@ int pmCartCartDiv(PmCartesian const * const v1, PmCartesian const * const v2, int pmCartCartCross(PmCartesian const * const v1, PmCartesian const * const v2, PmCartesian * const vout) { + if (vout == v1 || vout == v2) { + return pmErrno = PM_IMPL_ERR; + } vout->x = v1->y * v2->z - v1->z * v2->y; vout->y = v1->z * v2->x - v1->x * v2->z; vout->z = v1->x * v2->y - v1->y * v2->x; @@ -865,61 +868,62 @@ int pmCartCartSub(PmCartesian const * const v1, PmCartesian const * const v2, int pmCartScalMult(PmCartesian const * const v1, double d, PmCartesian * const vout) { - vout->x = v1->x * d; - vout->y = v1->y * d; - vout->z = v1->z * d; - - return pmErrno = 0; + if (v1 != vout) { + *vout = *v1; + } + return pmCartScalMultEq(vout, d); } int pmCartScalDiv(PmCartesian const * const v1, double d, PmCartesian * const vout) { - if (d == 0.0) { -#ifdef PM_PRINT_ERROR - pmPrintError(&"Divide by 0 in pmCartScalDiv\n"); -#endif - vout->x = DBL_MAX; - vout->y = DBL_MAX; - vout->z = DBL_MAX; - - return pmErrno = PM_DIV_ERR; + if (v1 != vout) { + *vout = *v1; } + return pmCartScalDivEq(vout, d); +} - vout->x = v1->x / d; - vout->y = v1->y / d; - vout->z = v1->z / d; +int pmCartNeg(PmCartesian const * const v1, PmCartesian * const vout) +{ + if (v1 != vout) { + *vout = *v1; + } - return pmErrno = 0; + return pmCartNegEq(vout); } -int pmCartNeg(PmCartesian const * const v1, PmCartesian * const vout) +int pmCartNegEq(PmCartesian * const v1) { - vout->x = -v1->x; - vout->y = -v1->y; - vout->z = -v1->z; + v1->x = -v1->x; + v1->y = -v1->y; + v1->z = -v1->z; return pmErrno = 0; } int pmCartInv(PmCartesian const * const v1, PmCartesian * const vout) { - double size_sq = pmSq(v1->x) + pmSq(v1->y) + pmSq(v1->z); + if (v1 != vout) { + *vout = *v1; + } + + return pmCartInvEq(vout); +} + +int pmCartInvEq(PmCartesian * const v) +{ + double size_sq; + pmCartMagSq(v,&size_sq); if (size_sq == 0.0) { #ifdef PM_PRINT_ERROR - pmPrintError(&"Zero vector in pmCartInv\n"); + pmPrintError(&"Zero vector in pmCartInv\n"); #endif - - vout->x = DBL_MAX; - vout->y = DBL_MAX; - vout->z = DBL_MAX; - - return pmErrno = PM_NORM_ERR; + return pmErrno = PM_NORM_ERR; } - vout->x = v1->x / size_sq; - vout->y = v1->y / size_sq; - vout->z = v1->z / size_sq; + v->x /= size_sq; + v->y /= size_sq; + v->z /= size_sq; return pmErrno = 0; } @@ -928,33 +932,84 @@ int pmCartInv(PmCartesian const * const v1, PmCartesian * const vout) int pmCartUnit(PmCartesian const * const v, PmCartesian * const vout) { - double size = pmSqrt(pmSq(v->x) + pmSq(v->y) + pmSq(v->z)); + if (vout != v) { + *vout = *v; + } + return pmCartUnitEq(vout); +} - if (size == 0.0) { +int pmCartAbs(PmCartesian const * const v, PmCartesian * const vout) +{ + + vout->x = fabs(v->x); + vout->y = fabs(v->y); + vout->z = fabs(v->z); + + return pmErrno = 0; +} + +/* Compound assign operator equivalent functions. These are to prevent issues with passing the same variable as both input (const) and output */ + +int pmCartCartAddEq(PmCartesian * const v, PmCartesian const * const v_add) +{ + v->x += v_add->x; + v->y += v_add->y; + v->z += v_add->z; + + return pmErrno = 0; +} + +int pmCartCartSubEq(PmCartesian * const v, PmCartesian const * const v_sub) +{ + v->x -= v_sub->x; + v->y -= v_sub->y; + v->z -= v_sub->z; + + return pmErrno = 0; +} + +int pmCartScalMultEq(PmCartesian * const v, double d) +{ + + v->x *= d; + v->y *= d; + v->z *= d; + + return pmErrno = 0; +} + +int pmCartScalDivEq(PmCartesian * const v, double d) +{ + + if (d == 0.0) { #ifdef PM_PRINT_ERROR - pmPrintError(&"Zero vector in pmCartUnit\n"); + pmPrintError(&"Divide by 0 in pmCartScalDiv\n"); #endif - vout->x = DBL_MAX; - vout->y = DBL_MAX; - vout->z = DBL_MAX; - - return pmErrno = PM_NORM_ERR; + return pmErrno = PM_DIV_ERR; } - vout->x = v->x / size; - vout->y = v->y / size; - vout->z = v->z / size; + v->x /= d; + v->y /= d; + v->z /= d; return pmErrno = 0; } -int pmCartAbs(PmCartesian const * const v, PmCartesian * const vout) +int pmCartUnitEq(PmCartesian * const v) { + double size = pmSqrt(pmSq(v->x) + pmSq(v->y) + pmSq(v->z)); - vout->x = fabs(v->x); - vout->y = fabs(v->y); - vout->z = fabs(v->z); + if (size == 0.0) { +#ifdef PM_PRINT_ERROR + pmPrintError("Zero vector in pmCartUnit\n"); +#endif + return pmErrno = PM_NORM_ERR; + } + + v->x /= size; + v->y /= size; + v->z /= size; return pmErrno = 0; } @@ -1632,7 +1687,6 @@ int pmCartLinePoint(PmCartLine const * const line, double len, PmCartesian * con return pmErrno = (r1 || r2) ? PM_NORM_ERR : 0; } - /* circle functions */ /* diff --git a/src/libnml/posemath/posemath.cc b/src/libnml/posemath/posemath.cc index 52f0fc100..b817b4cbc 100644 --- a/src/libnml/posemath/posemath.cc +++ b/src/libnml/posemath/posemath.cc @@ -950,7 +950,7 @@ PM_CARTESIAN unit(PM_CARTESIAN v) toCart(v, &_v); - pmCartUnit(&_v, &_v); + pmCartUnitEq(&_v); toCart(_v, &vout); diff --git a/src/libnml/posemath/posemath.h b/src/libnml/posemath/posemath.h index 9646c34d3..951a9fbc6 100644 --- a/src/libnml/posemath/posemath.h +++ b/src/libnml/posemath/posemath.h @@ -858,6 +858,13 @@ extern "C" { extern int pmCartNeg(PmCartesian const * const, PmCartesian * const); extern int pmCartUnit(PmCartesian const * const, PmCartesian * const); extern int pmCartAbs(PmCartesian const * const, PmCartesian * const); + // Equivalent of compound operators like +=, -=, etc. Basically, these functions work directly on the first PmCartesian + 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); /*! \todo Another #if 0 */ #if 0 extern int pmCartNorm(PmCartesian const * const v, PmCartesian * const vout); @@ -868,6 +875,7 @@ extern "C" { 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); |