Revision: 53839
http://brlcad.svn.sourceforge.net/brlcad/?rev=53839&view=rev
Author: r_weiss
Date: 2012-11-27 21:29:41 +0000 (Tue, 27 Nov 2012)
Log Message:
-----------
Updated test function "bn_distsq_pt3_lseg3_v2" in file "plane.c". Added test
for when dot product is undefined.
Modified Paths:
--------------
brlcad/trunk/src/libbn/plane.c
Modified: brlcad/trunk/src/libbn/plane.c
===================================================================
--- brlcad/trunk/src/libbn/plane.c 2012-11-27 20:57:07 UTC (rev 53838)
+++ brlcad/trunk/src/libbn/plane.c 2012-11-27 21:29:41 UTC (rev 53839)
@@ -2412,14 +2412,11 @@
fastf_t AtoB_mag, AtoP_mag, AtoPCA_mag, PtoPCA_mag, BtoP_mag;
fastf_t dot, dt, dist;
int ret;
+ int flip;
dt = tol->dist;
- VSUB2(AtoB, b, a);
- VSUB2(AtoP, p, a);
- AtoB_mag = MAGNITUDE(AtoB);
- AtoP_mag = MAGNITUDE(AtoP);
-
+ flip = 0;
if (bn_pt3_pt3_equal(a, b, tol)) {
/* (A=B) */
if (bn_pt3_pt3_equal(a, p, tol)) {
@@ -2428,7 +2425,7 @@
ret = 1;
} else {
/* (A=B) (A!=P) */
- dist = AtoP_mag;
+ dist = MAGNITUDE(AtoP);
ret = 3;
}
} else {
@@ -2443,22 +2440,38 @@
ret = 2;
} else {
/* (A!=B) (A!=P) (B!=P) */
+ VSUB2(AtoB, b, a);
+ VSUB2(AtoP, p, a);
+ VSUB2(BtoP, p, b);
+
dot = VDOT(AtoP, AtoB);
+
if ZERO(dot) {
- /* (A=PCA), lsegs AtoB and AtoP are perpendicular */
- dist = AtoP_mag;
- ret = 3;
- } else if (dot > SMALL_FASTF) {
+ /* dot product undefined with (AtoP dot AtoB) */
+ /* try flipping A and B */
+ VSUB2(AtoB, a, b);
+ VSUB2(AtoP, p, b);
+ VSUB2(BtoP, p, a);
+ dot = VDOT(AtoP, AtoB);
+ flip = 1;
+ }
+ if ZERO(dot) {
+ bu_bomb("bn_distsq_pt3_lseg3_v2(): failed");
+ }
+
+ AtoB_mag = MAGNITUDE(AtoB);
+ AtoP_mag = MAGNITUDE(AtoP);
+ BtoP_mag = MAGNITUDE(BtoP);
+
+ if (dot > SMALL_FASTF) {
AtoPCA_mag = dot / AtoB_mag;
- if (NEAR_ZERO(AtoPCA_mag, dt)) {
+ if (are_equal(AtoPCA_mag, 0.0, dt)) {
/* (PCA=A) (B!=P) */
/* lsegs AtoB and AtoP are perpendicular */
dist = AtoP_mag;
ret = 3;
- } else if (are_equal(AtoPCA_mag, AtoB_mag, dt) ||
EQUAL(AtoPCA_mag, AtoB_mag)) {
+ } else if (are_equal(AtoPCA_mag, AtoB_mag, dt)) {
/* (PCA=B) (B!=P) */
- VSUB2(BtoP, p, b);
- BtoP_mag = MAGNITUDE(BtoP);
dist = BtoP_mag;
ret = 4;
} else if (AtoPCA_mag < AtoB_mag) {
@@ -2477,8 +2490,6 @@
/* AtoPCA_mag > AtoB_mag */
/* P is to the right of B, above/below lseg AtoB. */
/* both P and PCA and not within tolerance of lseg AtoB */
- VSUB2(BtoP, p, b);
- BtoP_mag = MAGNITUDE(BtoP);
dist = BtoP_mag;
ret = 4;
}
@@ -2498,6 +2509,13 @@
}
}
}
+
+ if (flip && ret == 3) {
+ ret = 4;
+ } else if (flip && ret == 4) {
+ ret = 3;
+ }
+
*distsq = dist * dist;
return ret;
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Keep yourself connected to Go Parallel:
DESIGN Expert tips on starting your parallel project right.
http://goparallel.sourceforge.net
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits