[Plib-cvs] plib/src/sg sg.cxx,1.43,1.44 sgd.cxx,1.14,1.15
Brought to you by:
sjbaker
From: James J. <pu...@us...> - 2004-08-05 01:07:35
|
Update of /cvsroot/plib/plib/src/sg In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19375 Modified Files: sg.cxx sgd.cxx Log Message: SG efficiency: "sg[d]DistSquaredToLineSegmentVec3" with fewer square root invocations (John Fay) Index: sg.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/sg/sg.cxx,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- sg.cxx 9 Apr 2004 01:41:11 -0000 1.43 +++ sg.cxx 5 Aug 2004 01:07:09 -0000 1.44 @@ -860,16 +860,14 @@ SGfloat sgDistSquaredToLineSegmentVec3 ( const sgLineSegment3 line, const sgVec3 pnt ) { - sgLine3 l ; sgLineSegment3ToLine3 ( & l, line ) ; - - sgVec3 v ; sgSubVec3 ( v , line.b, line.a ) ; sgNormalizeVec3 ( v ) ; - sgVec3 r1 ; sgSubVec3 ( r1, pnt , line.a ) ; - + sgVec3 v ; sgSubVec3 ( v, line.b, line.a ) ; + sgVec3 r1 ; sgSubVec3 ( r1, pnt, line.a ) ; + SGfloat r1_dot_v = sgScalarProductVec3 ( r1, v ) ; - + if ( r1_dot_v <= 0 ) /* Off the "A" end */ return sgScalarProductVec3 ( r1, r1 ) ; - + sgVec3 r2 ; sgSubVec3 ( r2, pnt, line.b ) ; SGfloat r2_dot_v = sgScalarProductVec3 ( r2, v ) ; @@ -879,7 +877,7 @@ /* Closest point on line is on the line segment */ - return sgScalarProductVec3 ( r1, r1 ) - r1_dot_v * r1_dot_v ; + return sgScalarProductVec3 ( r1, r1 ) - r1_dot_v * r1_dot_v / sgScalarProductVec3 ( v, v ) ; } Index: sgd.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/sg/sgd.cxx,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- sgd.cxx 9 Apr 2004 01:41:11 -0000 1.14 +++ sgd.cxx 5 Aug 2004 01:07:09 -0000 1.15 @@ -859,26 +859,24 @@ SGDfloat sgdDistSquaredToLineSegmentVec3 ( const sgdLineSegment3 line, const sgdVec3 pnt ) { - sgdLine3 l ; sgdLineSegment3ToLine3 ( & l, line ) ; - - sgdVec3 v ; sgdSubVec3 ( v, line.b, line.a ) ; sgdNormalizeVec3 ( v ) ; + sgdVec3 v ; sgdSubVec3 ( v, line.b, line.a ) ; sgdVec3 r1 ; sgdSubVec3 ( r1, pnt, line.a ) ; - - SGDfloat r1_dot_v = sgdScalarProductVec3 ( r1, v /*l.direction_vector*/ ) ; - + + SGDfloat r1_dot_v = sgdScalarProductVec3 ( r1, v ) ; + if ( r1_dot_v <= 0 ) /* Off the "A" end */ return sgdScalarProductVec3 ( r1, r1 ) ; - + sgdVec3 r2 ; sgdSubVec3 ( r2, pnt, line.b ) ; - SGDfloat r2_dot_v = sgdScalarProductVec3 ( r2, v /*l.direction_vector*/ ) ; - + SGDfloat r2_dot_v = sgdScalarProductVec3 ( r2, v ) ; + if ( r2_dot_v >= 0 ) /* Off the "B" end */ return sgdScalarProductVec3 ( r2, r2 ) ; /* Closest point on line is on the line segment */ - return sgdScalarProductVec3 ( r1, r1 ) - r1_dot_v * r1_dot_v ; + return sgdScalarProductVec3 ( r1, r1 ) - r1_dot_v * r1_dot_v / sgdScalarProductVec3 ( v, v ) ; } |