Correct finite precision issues.

Use consistent function names.
Implement changes consistently over the different vector sizes.

Modified Files:
	SGVec2.hxx SGVec3.hxx SGVec4.hxx
This commit is contained in:
frohlich
2009-09-16 05:06:56 +00:00
committed by Tim Moore
parent ccf0ba50c4
commit 4f802689f2
3 changed files with 53 additions and 14 deletions

View File

@@ -244,7 +244,12 @@ template<typename T>
inline
SGVec2<T>
normalize(const SGVec2<T>& v)
{ return (1/norm(v))*v; }
{
T normv = norm(v);
if (normv <= SGLimits<T>::min())
return SGVec2<T>::zeros();
return (1/normv)*v;
}
/// Return true if exactly the same
template<typename T>
@@ -331,6 +336,18 @@ T
distSqr(const SGVec2<T>& v1, const SGVec2<T>& v2)
{ SGVec2<T> tmp = v1 - v2; return dot(tmp, tmp); }
// calculate the projection of u along the direction of d.
template<typename T>
inline
SGVec2<T>
projection(const SGVec2<T>& u, const SGVec2<T>& d)
{
T denom = dot(d, d);
T ud = dot(u, d);
if (SGLimits<T>::min() < denom) return u;
else return d * (dot(u, d) / denom);
}
#ifndef NDEBUG
template<typename T>
inline

View File

@@ -358,9 +358,11 @@ template<typename T>
inline
SGVec3<T>
normalize(const SGVec3<T>& v)
{ T normv = norm(v);
if (normv > 0.0) return (1/norm(v))*v;
else return v;
{
T normv = norm(v);
if (normv <= SGLimits<T>::min())
return SGVec3<T>::zeros();
return (1/normv)*v;
}
/// Return true if exactly the same
@@ -452,6 +454,18 @@ T
distSqr(const SGVec3<T>& v1, const SGVec3<T>& v2)
{ SGVec3<T> tmp = v1 - v2; return dot(tmp, tmp); }
// calculate the projection of u along the direction of d.
template<typename T>
inline
SGVec3<T>
projection(const SGVec3<T>& u, const SGVec3<T>& d)
{
T denom = dot(d, d);
T ud = dot(u, d);
if (SGLimits<T>::min() < denom) return u;
else return d * (dot(u, d) / denom);
}
#ifndef NDEBUG
template<typename T>
inline
@@ -480,15 +494,6 @@ SGVec3d
toVec3d(const SGVec3f& v)
{ return SGVec3d(v(0), v(1), v(2)); }
// calculate the projection of u along the direction of d.
template<typename T>
inline SGVec3<T> SGProjection(const SGVec3<T>& u, const SGVec3<T>& d)
{
T denom = dot(d, d);
if (denom == 0.) return u;
else return d * (dot(u,d) / denom);
}
#ifndef NO_OPENSCENEGRAPH_INTERFACE
inline
SGVec3d

View File

@@ -288,7 +288,12 @@ template<typename T>
inline
SGVec4<T>
normalize(const SGVec4<T>& v)
{ return (1/norm(v))*v; }
{
T normv = norm(v);
if (normv <= SGLimits<T>::min())
return SGVec4<T>::zeros();
return (1/normv)*v;
}
/// Return true if exactly the same
template<typename T>
@@ -383,6 +388,18 @@ T
distSqr(const SGVec4<T>& v1, const SGVec4<T>& v2)
{ SGVec4<T> tmp = v1 - v2; return dot(tmp, tmp); }
// calculate the projection of u along the direction of d.
template<typename T>
inline
SGVec4<T>
projection(const SGVec4<T>& u, const SGVec4<T>& d)
{
T denom = dot(d, d);
T ud = dot(u, d);
if (SGLimits<T>::min() < denom) return u;
else return d * (dot(u, d) / denom);
}
#ifndef NDEBUG
template<typename T>
inline