X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmath%2Fvector.cxx;h=a5d3ee0a6c2337efb583c2a53b5f6ac4a649d94e;hb=f19e83dcf10d5fced3d799c884a4654d7ada6548;hp=c67ff8ff13ab4d454d89abb4f9a80ff283629401;hpb=c39e08cb2a8d5666f9d54af7d243fa525214d24e;p=simgear.git diff --git a/simgear/math/vector.cxx b/simgear/math/vector.cxx index c67ff8ff..a5d3ee0a 100644 --- a/simgear/math/vector.cxx +++ b/simgear/math/vector.cxx @@ -2,7 +2,7 @@ // // Written by Curtis Olson, started December 1997. // -// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com +// Copyright (C) 1997 Curtis L. Olson - http://www.flightgear.org/~curt // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public @@ -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.