general lerp & vector nlerp
This commit is contained in:
parent
24a6e7478e
commit
28fbcebf98
|
@ -146,6 +146,85 @@ namespace LinearAlgebra
|
|||
targetMem = out * (in.GetAdjoint() /= d);
|
||||
return true;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* Linear Interpolation
|
||||
* @return start * (1-t) + end * t
|
||||
********************************************************************/
|
||||
template<typename PointType, typename ScalarType>
|
||||
inline PointType Lerp( const PointType &start, const PointType &end, const ScalarType &t )
|
||||
{
|
||||
return end * t + start * ( 1 - t );
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* Normalized Linear Interpolation
|
||||
* @return nullvector if impossible to solve.
|
||||
********************************************************************/
|
||||
template<typename ScalarType>
|
||||
inline Vector2<ScalarType> Nlerp( const Vector2<ScalarType> &start, const Vector2<ScalarType> &end, const ScalarType &t )
|
||||
{
|
||||
Vector2<ScalarType> output = Lerp( start, end, t );
|
||||
ScalarType magnitudeSquared = output.Dot( output );
|
||||
if( magnitudeSquared == 0 )
|
||||
{
|
||||
ScalarType half = t * 0.5f;
|
||||
output = Lerp( start, end, half );
|
||||
magnitudeSquared = output.Dot( output );
|
||||
|
||||
if( magnitudeSquared == 0 )
|
||||
return output; // error: returning nullvector
|
||||
|
||||
return Nlerp( output /= magnitudeSquared, end, half / (1.0f - half) );
|
||||
}
|
||||
return output /= magnitudeSquared;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* Normalized Linear Interpolation
|
||||
* @return nullvector if impossible to solve.
|
||||
********************************************************************/
|
||||
template<typename ScalarType>
|
||||
inline Vector3<ScalarType> Nlerp( const Vector3<ScalarType> &start, const Vector3<ScalarType> &end, const ScalarType &t )
|
||||
{
|
||||
Vector3<ScalarType> output = Lerp( start, end, t );
|
||||
ScalarType magnitudeSquared = output.Dot( output );
|
||||
if( magnitudeSquared == 0 )
|
||||
{
|
||||
ScalarType half = t * 0.5f;
|
||||
output = Lerp( start, end, half );
|
||||
magnitudeSquared = output.Dot( output );
|
||||
|
||||
if( magnitudeSquared == 0 )
|
||||
return output; // error: returning nullvector
|
||||
|
||||
return Nlerp( output /= magnitudeSquared, end, half / (1.0f - half) );
|
||||
}
|
||||
return output /= magnitudeSquared;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* Normalized Linear Interpolation
|
||||
* @return nullvector if impossible to solve.
|
||||
********************************************************************/
|
||||
template<typename ScalarType>
|
||||
inline Vector4<ScalarType> Nlerp( const Vector4<ScalarType> &start, const Vector4<ScalarType> &end, const ScalarType &t )
|
||||
{
|
||||
Vector4<ScalarType> output = Lerp( start, end, t );
|
||||
ScalarType magnitudeSquared = output.Dot( output );
|
||||
if( magnitudeSquared == 0 )
|
||||
{
|
||||
ScalarType half = t * 0.5f;
|
||||
output = Lerp( start, end, half );
|
||||
magnitudeSquared = output.Dot( output );
|
||||
|
||||
if( magnitudeSquared == 0 )
|
||||
return output; // error: returning nullvector
|
||||
|
||||
return Nlerp( output /= magnitudeSquared, end, half / (1.0f - half) );
|
||||
}
|
||||
return output /= magnitudeSquared;
|
||||
}
|
||||
}
|
||||
|
||||
namespace LinearAlgebra2D
|
||||
|
|
Loading…
Reference in New Issue