[brlcad-commits] SF.net SVN: brlcad:[41013] brlcad/trunk/src/libbn/plane.c From: - 2010-10-16 02:49:58 ```Revision: 41013 http://brlcad.svn.sourceforge.net/brlcad/?rev=41013&view=rev Author: r_weiss Date: 2010-10-16 02:49:48 +0000 (Sat, 16 Oct 2010) Log Message: ----------- In function bn_isect_line3_line3, made many changes to tolerances and added checks for zero magnitude vectors. Made a logic change to improve detecting colinear lines. This function needs more work but I believe it is working better. Modified Paths: -------------- brlcad/trunk/src/libbn/plane.c Modified: brlcad/trunk/src/libbn/plane.c =================================================================== --- brlcad/trunk/src/libbn/plane.c 2010-10-15 22:13:52 UTC (rev 41012) +++ brlcad/trunk/src/libbn/plane.c 2010-10-16 02:49:48 UTC (rev 41013) @@ -1222,9 +1222,16 @@ register fastf_t det; register fastf_t det1; register short int q, r, s; + int parallel = 0; + int colinear = 0; + BN_CK_TOL(tol); + if (NEAR_ZERO(MAGSQ(c), VUNITIZE_TOL) || NEAR_ZERO(MAGSQ(d), VUNITIZE_TOL)) { + bu_bomb("bn_isect_line3_line3(): input vector(s) 'c' and/or 'd' is zero magnitude.\n"); + } + /* Any intersection will occur in the plane with surface normal D * cross C, which may not have unit length. The plane containing * the two lines will be a constant distance from a plane with the @@ -1234,26 +1241,33 @@ * no intersection, because P and A must lie on parallel planes * that are different distances from the origin. */ + VCROSS(n, d, c); det = VDOT(n, p) - VDOT(n, a); - if (!NEAR_ZERO(det, tol->dist)) { - return -1; /* No intersection */ + if (!NEAR_ZERO(det, SMALL_FASTF)) { + return -1; /* no intersection, lines not in same plane */ } - if (NEAR_ZERO(MAGSQ(n), SMALL_FASTF)) - { + if (NEAR_ZERO(MAGSQ(n), VUNITIZE_TOL)) { + /* lines are parallel, must find another way to get normal vector */ vect_t a_to_p; - /* lines are parallel, must find another way to get normal - * vector. - */ + parallel = 1; VSUB2(a_to_p, p, a); VCROSS(n, a_to_p, d); - if (NEAR_ZERO(MAGSQ(n), SMALL_FASTF)) + if (NEAR_ZERO(MAGSQ(n), VUNITIZE_TOL)) { + /* lines are parallel and colinear */ + + colinear = 1; bn_vec_ortho(n, d); + } } + if (NEAR_ZERO(MAGSQ(n), VUNITIZE_TOL)) { + bu_bomb("bn_isect_line3_line3(): ortho vector zero magnitude\n"); + } + /* Solve for t and u in the system: * * Px + t * Dx = Ax + u * Cx @@ -1274,9 +1288,19 @@ * than x, y, z. Subscript s is the smallest component, used for * checking later. */ + if (NEAR_ZERO(n[X], SMALL_FASTF)) { + n[X] = 0.0; + } + if (NEAR_ZERO(n[Y], SMALL_FASTF)) { + n[Y] = 0.0; + } + if (NEAR_ZERO(n[Z], SMALL_FASTF)) { + n[Z] = 0.0; + } abs_n[X] = (n[X] >= 0) ? n[X] : (-n[X]); abs_n[Y] = (n[Y] >= 0) ? n[Y] : (-n[Y]); abs_n[Z] = (n[Z] >= 0) ? n[Z] : (-n[Z]); + if (abs_n[X] >= abs_n[Y]) { if (abs_n[X] >= abs_n[Z]) { /* X is largest in magnitude */ @@ -1342,9 +1366,8 @@ */ if (NEAR_ZERO(det, DETERMINANT_TOL)) { /* Lines are parallel */ - if (!NEAR_ZERO(det1, DETERMINANT_TOL)) { - /* Lines are NOT co-linear, just parallel */ - return -2; /* parallel, no intersection */ + if (!colinear || !NEAR_ZERO(det1, DETERMINANT_TOL)) { + return -2; /* parallel, not colinear, no intersection */ } /* Lines are co-linear */ @@ -1392,7 +1415,7 @@ * distance. */ det = *t * d[s] - *u * c[s] - h[s]; - if (!NEAR_ZERO(det, tol->dist)) { + if (!NEAR_ZERO(det, SMALL_FASTF)) { /* XXX This tolerance needs to be much less loose than * SQRT_SMALL_FASTF. What about DETERMINANT_TOL? */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ```