implemented CVector2D::NormaliseSafe for SkidMarks

This commit is contained in:
aap 2020-04-17 15:15:42 +02:00
parent fd229ed47e
commit 6ef7924e01
3 changed files with 22 additions and 6 deletions

View File

@ -11,16 +11,18 @@ public:
float Magnitude(void) const { return Sqrt(x*x + y*y); } float Magnitude(void) const { return Sqrt(x*x + y*y); }
float MagnitudeSqr(void) const { return x*x + y*y; } float MagnitudeSqr(void) const { return x*x + y*y; }
void Normalise(void){ void Normalise(void);
void NormaliseSafe(void) {
float sq = MagnitudeSqr(); float sq = MagnitudeSqr();
//if(sq > 0.0f){ if(sq > 0.0f){
float invsqrt = RecipSqrt(sq); float invsqrt = RecipSqrt(sq);
x *= invsqrt; x *= invsqrt;
y *= invsqrt; y *= invsqrt;
//}else }else
// x = 1.0f; y = 1.0f;
} }
const CVector2D &operator+=(CVector2D const &right) { const CVector2D &operator+=(CVector2D const &right) {
x += right.x; x += right.x;
y += right.y; y += right.y;

View File

@ -4,6 +4,19 @@
// TODO: move more stuff into here // TODO: move more stuff into here
void
CVector2D::Normalise(void)
{
float sq = MagnitudeSqr();
assert(sq != 0.0f); // just be safe here
//if(sq > 0.0f){
float invsqrt = RecipSqrt(sq);
x *= invsqrt;
y *= invsqrt;
//}else
// x = 1.0f;
}
void void
CMatrix::SetRotate(float xAngle, float yAngle, float zAngle) CMatrix::SetRotate(float xAngle, float yAngle, float zAngle)
{ {

View File

@ -214,7 +214,8 @@ CSkidmarks::RegisterOne(uintptr id, CVector pos, float fwdX, float fwdY, bool *i
aSkidmarks[i].m_pos[aSkidmarks[i].m_last] = pos; aSkidmarks[i].m_pos[aSkidmarks[i].m_last] = pos;
CVector2D dist = aSkidmarks[i].m_pos[aSkidmarks[i].m_last] - aSkidmarks[i].m_pos[aSkidmarks[i].m_last-1]; CVector2D dist = aSkidmarks[i].m_pos[aSkidmarks[i].m_last] - aSkidmarks[i].m_pos[aSkidmarks[i].m_last-1];
dist.Normalise(); dist.NormaliseSafe();
fwd.NormaliseSafe();
CVector2D right(dist.y, -dist.x); CVector2D right(dist.y, -dist.x);
float turn = DotProduct2D(fwd, right); float turn = DotProduct2D(fwd, right);
turn = Abs(turn) + 1.0f; turn = Abs(turn) + 1.0f;