X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmath%2Fvector.cxx;h=a5d3ee0a6c2337efb583c2a53b5f6ac4a649d94e;hb=f19e83dcf10d5fced3d799c884a4654d7ada6548;hp=d5674c1737434d6168feab01e9e61b784262c21f;hpb=f30c4720ae6de72a9b6eab219ebde0b07a517ede;p=simgear.git diff --git a/simgear/math/vector.cxx b/simgear/math/vector.cxx index d5674c17..a5d3ee0a 100644 --- a/simgear/math/vector.cxx +++ b/simgear/math/vector.cxx @@ -14,10 +14,9 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // -// You should have received a copy of the GNU Library General Public -// License along with this library; if not, write to the -// Free Software Foundation, Inc., 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -30,6 +29,20 @@ #include "vector.hxx" +// calculate the projection, p, of u along the direction of d. +void sgProjection(sgVec3 p, const sgVec3 u, const sgVec3 d){ + double denom = sgScalarProductVec3(d,d); + if (denom == 0.) sgCopyVec3(p, u); + else sgScaleVec3(p, d, sgScalarProductVec3(u,d) / denom); +} + +// Same thing, except using double precision +void sgProjection(sgdVec3 p, const sgdVec3 u, const sgdVec3 d){ + double denom = sgdScalarProductVec3(d,d); + if (denom == 0.) sgdCopyVec3(p, u); + else sgdScaleVec3(p, d, sgdScalarProductVec3(u,d) / denom); +} + // Given a point p, and a line through p0 with direction vector d, // find the closest point (p1) on the line void sgClosestPointToLine( sgVec3 p1, const sgVec3 p, const sgVec3 p0, @@ -41,8 +54,7 @@ void sgClosestPointToLine( sgVec3 p1, const sgVec3 p, const sgVec3 p0, sgSubVec3(u, p, p0); // calculate the projection, u1, of u along d. - // u1 = ( dot_prod(u, d) / dot_prod(d, d) ) * d; - sgScaleVec3( u1, d, sgScalarProductVec3(u,d) / sgScalarProductVec3(d,d) ); + sgProjection(u1, u, d); // calculate the point p1 along the line that is closest to p // p0 = p1 + u1 @@ -61,12 +73,7 @@ void sgdClosestPointToLine( sgdVec3 p1, const sgdVec3 p, const sgdVec3 p0, sgdSubVec3(u, p, p0); // calculate the projection, u1, of u along d. - // u1 = ( dot_prod(u, d) / dot_prod(d, d) ) * d; - double ud = sgdScalarProductVec3(u, d); - double dd = sgdScalarProductVec3(d, d); - double tmp = ud / dd; - - sgdScaleVec3(u1, d, tmp);; + sgProjection(u1, u, d); // calculate the point p1 along the line that is closest to p // p0 = p1 + u1 @@ -85,8 +92,7 @@ double sgClosestPointToLineDistSquared( const sgVec3 p, const sgVec3 p0, sgSubVec3(u, p, p0); // calculate the projection, u1, of u along d. - // u1 = ( dot_prod(u, d) / dot_prod(d, d) ) * d; - sgScaleVec3( u1, d, sgScalarProductVec3(u,d) / sgScalarProductVec3(d,d) ); + sgProjection(u1, u, d); // v = u - u1 = vector from closest point on line, p1, to the // original point, p. @@ -107,12 +113,7 @@ double sgdClosestPointToLineDistSquared( const sgdVec3 p, const sgdVec3 p0, sgdSubVec3(u, p, p0); // calculate the projection, u1, of u along d. - // u1 = ( dot_prod(u, d) / dot_prod(d, d) ) * d; - double ud = sgdScalarProductVec3(u, d); - double dd = sgdScalarProductVec3(d, d); - double tmp = ud / dd; - - sgdScaleVec3(u1, d, tmp);; + sgProjection(u1, u, d); // v = u - u1 = vector from closest point on line, p1, to the // original point, p.