X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmath%2FSGVec3.hxx;h=4ec4145a399f005a05ab88d85d1271f2cb919488;hb=006f90997a8eef6704de2511e38fcc786672308d;hp=3d375c0b72595b712ef818758b0d7e2fe1a49e63;hpb=f7c6a5bfa2140c1d5ef54f3212067cd286e525f1;p=simgear.git diff --git a/simgear/math/SGVec3.hxx b/simgear/math/SGVec3.hxx index 3d375c0b..4ec4145a 100644 --- a/simgear/math/SGVec3.hxx +++ b/simgear/math/SGVec3.hxx @@ -92,6 +92,9 @@ public: /// make sure it has at least 3 elements explicit SGVec3(const T* d) { data()[0] = d[0]; data()[1] = d[1]; data()[2] = d[2]; } + template + explicit SGVec3(const SGVec3& d) + { data()[0] = d[0]; data()[1] = d[1]; data()[2] = d[2]; } explicit SGVec3(const osg::Vec3f& d) { data()[0] = d[0]; data()[1] = d[1]; data()[2] = d[2]; } explicit SGVec3(const osg::Vec3d& d) @@ -261,6 +264,15 @@ SGVec3 operator*(const SGVec3& v, S s) { return SGVec3(s*v(0), s*v(1), s*v(2)); } +/// multiplication as a multiplicator, that is assume that the first vector +/// represents a 3x3 diagonal matrix with the diagonal elements in the vector. +/// Then the result is the product of that matrix times the second vector. +template +inline +SGVec3 +mult(const SGVec3& v1, const SGVec3& v2) +{ return SGVec3(v1(0)*v2(0), v1(1)*v2(1), v1(2)*v2(2)); } + /// component wise min template inline @@ -379,10 +391,10 @@ perpendicular(const SGVec3& v) if (absv2 < absv1 && absv3 < absv1) { T quot = v(1)/v(0); return (1/sqrt(1+quot*quot))*SGVec3(quot, -1, 0); - } else if (absv1 < absv2 && absv3 < absv2) { + } else if (absv3 < absv2) { T quot = v(2)/v(1); return (1/sqrt(1+quot*quot))*SGVec3(0, quot, -1); - } else if (absv1 < absv3 && absv2 < absv3) { + } else if (SGLimits::min() < absv3) { T quot = v(0)/v(2); return (1/sqrt(1+quot*quot))*SGVec3(-1, 0, quot); } else {