summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert W. Ellenberg <rwe24g@gmail.com>2014-01-30 11:49:40 -0500
committerChris Radek <chris@timeguy.com>2014-06-11 14:44:04 -0500
commit101294e2ba6c0cdbdd9185df7a4d5c62deb24a1b (patch)
treea364ff54d6fb634d2302e1af0c7717ab5dd91c28
parentcf53aaab427fef41ceb40697078414f95fbf2ce7 (diff)
downloadlinuxcnc-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.c152
-rw-r--r--src/libnml/posemath/posemath.cc2
-rw-r--r--src/libnml/posemath/posemath.h8
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);