Vector: IsParallel now works.
There should be a devlog entry shortly describing this, but the code for IsParallel wasn't working on arm64 (Linux or Darwin). Floating point math is weird.
This commit is contained in:
parent
8868fe40a1
commit
7f0a814b3f
|
@ -7,6 +7,9 @@
|
||||||
<option name="FUNCTION_BRACE_PLACEMENT" value="2" />
|
<option name="FUNCTION_BRACE_PLACEMENT" value="2" />
|
||||||
<option name="FUNCTION_TOP_AFTER_RETURN_TYPE_WRAP" value="2" />
|
<option name="FUNCTION_TOP_AFTER_RETURN_TYPE_WRAP" value="2" />
|
||||||
</Objective-C>
|
</Objective-C>
|
||||||
|
<clangFormatSettings>
|
||||||
|
<option name="ENABLED" value="true" />
|
||||||
|
</clangFormatSettings>
|
||||||
<files>
|
<files>
|
||||||
<extensions>
|
<extensions>
|
||||||
<pair source="cc" header="h" fileNamingConvention="PASCAL_CASE" />
|
<pair source="cc" header="h" fileNamingConvention="PASCAL_CASE" />
|
||||||
|
|
|
@ -193,8 +193,8 @@ public:
|
||||||
T
|
T
|
||||||
Angle(const Vector<T, N> &other) const
|
Angle(const Vector<T, N> &other) const
|
||||||
{
|
{
|
||||||
Vector<T, N> unitA = this->UnitVector();
|
auto unitA = this->UnitVector();
|
||||||
Vector<T, N> unitB = other.UnitVector();
|
auto unitB = other.UnitVector();
|
||||||
|
|
||||||
// Can't compute angles with a zero vector.
|
// Can't compute angles with a zero vector.
|
||||||
assert(!this->IsZero());
|
assert(!this->IsZero());
|
||||||
|
@ -214,12 +214,24 @@ public:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
T angle = this->Angle(other);
|
// If the two unit vectors are equal, the two vectors
|
||||||
if (scmp::WithinTolerance(angle, (T) 0.0, this->epsilon)) {
|
// lie on the same path.
|
||||||
return true;
|
//
|
||||||
}
|
// Context: this used to use Vector::Angle to check for
|
||||||
|
// a zero angle between the two. However, the vagaries
|
||||||
|
// of floating point math meant that while this worked
|
||||||
|
// fine on Linux amd64 builds, it failed on Linux arm64
|
||||||
|
// and MacOS builds. Parallel float vectors would have
|
||||||
|
// an angle of ~0.0003 radians, while double vectors
|
||||||
|
// would have an angle of +NaN. I suspect this is due to
|
||||||
|
// tiny variations in floating point math, such that a dot
|
||||||
|
// product of unit vectors would be just a hair over 1,
|
||||||
|
// e.g. 1.000000001 - which would still fall outside the
|
||||||
|
// domain of acos.
|
||||||
|
auto unitA = this->UnitVector();
|
||||||
|
auto unitB = other.UnitVector();
|
||||||
|
|
||||||
return false;
|
return unitA == unitB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue