X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmath%2FSGVec3.hxx;h=64ceac0a88ac141ed6273738c624779745b2573f;hb=7a52c2fa71355631a559d74e0860fa6c5efa424e;hp=f2b7406a647083cdc5d4422d81b08cde6ba51312;hpb=ce54997be569ebcac4222321e7ae3fecccd01324;p=simgear.git diff --git a/simgear/math/SGVec3.hxx b/simgear/math/SGVec3.hxx index f2b7406a..64ceac0a 100644 --- a/simgear/math/SGVec3.hxx +++ b/simgear/math/SGVec3.hxx @@ -53,12 +53,6 @@ public: { data()[0] = d[0]; data()[1] = d[1]; data()[2] = d[2]; } explicit SGVec3(const SGVec2& v2, const T& v3 = 0) { data()[0] = v2[0]; data()[1] = v2[1]; data()[2] = v3; } -#ifndef NO_OPENSCENEGRAPH_INTERFACE - explicit SGVec3(const osg::Vec3f& d) - { data()[0] = d[0]; data()[1] = d[1]; data()[2] = d[2]; } - explicit SGVec3(const osg::Vec3d& d) - { data()[0] = d[0]; data()[1] = d[1]; data()[2] = d[2]; } -#endif /// Access by index, the index is unchecked const T& operator()(unsigned i) const @@ -100,11 +94,6 @@ public: T (&data(void))[3] { return _data; } -#ifndef NO_OPENSCENEGRAPH_INTERFACE - osg::Vec3d osg() const - { return osg::Vec3d(data()[0], data()[1], data()[2]); } -#endif - /// Inplace addition SGVec3& operator+=(const SGVec3& v) { data()[0] += v(0); data()[1] += v(1); data()[2] += v(2); return *this; } @@ -363,12 +352,18 @@ perpendicular(const SGVec3& v) } } -/// The euclidean norm of the vector, that is what most people call length +/// Construct a unit vector in the given direction. +/// or the zero vector if the input vector is zero. template inline SGVec3 normalize(const SGVec3& v) -{ return (1/norm(v))*v; } +{ + T normv = norm(v); + if (normv <= SGLimits::min()) + return SGVec3::zeros(); + return (1/normv)*v; +} /// Return true if exactly the same template @@ -459,6 +454,18 @@ T distSqr(const SGVec3& v1, const SGVec3& v2) { SGVec3 tmp = v1 - v2; return dot(tmp, tmp); } +// calculate the projection of u along the direction of d. +template +inline +SGVec3 +projection(const SGVec3& u, const SGVec3& d) +{ + T denom = dot(d, d); + T ud = dot(u, d); + if (SGLimits::min() < denom) return u; + else return d * (dot(u, d) / denom); +} + #ifndef NDEBUG template inline