X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmath%2Fvector.cxx;h=a5d3ee0a6c2337efb583c2a53b5f6ac4a649d94e;hb=f19e83dcf10d5fced3d799c884a4654d7ada6548;hp=7c6f2c3cb46296eca6978968682cee5d4ea666ed;hpb=2ed07850c616705695f2add269d187f981f8d09d;p=simgear.git diff --git a/simgear/math/vector.cxx b/simgear/math/vector.cxx index 7c6f2c3c..a5d3ee0a 100644 --- a/simgear/math/vector.cxx +++ b/simgear/math/vector.cxx @@ -2,21 +2,21 @@ // // 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 program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. // -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. +// Library General Public License for more details. // // 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., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -29,10 +29,62 @@ #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, + const sgVec3 d ) { + + sgVec3 u, u1; + + // u = p - p0 + sgSubVec3(u, p, p0); + + // calculate the projection, u1, of u along d. + sgProjection(u1, u, d); + + // calculate the point p1 along the line that is closest to p + // p0 = p1 + u1 + sgAddVec3(p1, p0, u1); +} + + +// Given a point p, and a line through p0 with direction vector d, +// find the closest point (p1) on the line +void sgdClosestPointToLine( sgdVec3 p1, const sgdVec3 p, const sgdVec3 p0, + const sgdVec3 d ) { + + sgdVec3 u, u1; + + // u = p - p0 + sgdSubVec3(u, p, p0); + + // calculate the projection, u1, of u along d. + sgProjection(u1, u, d); + + // calculate the point p1 along the line that is closest to p + // p0 = p1 + u1 + sgdAddVec3(p1, p0, u1); +} + + // Given a point p, and a line through p0 with direction vector d, // find the shortest distance (squared) from the point to the line -double sgPointLineDistSquared( const sgVec3 p, const sgVec3 p0, - const sgVec3 d ) { +double sgClosestPointToLineDistSquared( const sgVec3 p, const sgVec3 p0, + const sgVec3 d ) { sgVec3 u, u1, v; @@ -40,8 +92,7 @@ double sgPointLineDistSquared( 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. @@ -53,22 +104,16 @@ double sgPointLineDistSquared( const sgVec3 p, const sgVec3 p0, // Given a point p, and a line through p0 with direction vector d, // find the shortest distance (squared) from the point to the line -double sgdPointLineDistSquared( const sgdVec3 p, const sgdVec3 p0, - const sgdVec3 d ) { +double sgdClosestPointToLineDistSquared( const sgdVec3 p, const sgdVec3 p0, + const sgdVec3 d ) { sgdVec3 u, u1, v; - double ud, dd, tmp; // u = p - p0 sgdSubVec3(u, p, p0); // calculate the projection, u1, of u along d. - // u1 = ( dot_prod(u, d) / dot_prod(d, d) ) * d; - ud = sgdScalarProductVec3(u, d); - dd = sgdScalarProductVec3(d, d); - 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.