angleClosestTo method
Find the angle within this range closest to the specified angle.
If strict is true, then only the actual range is used
regardless of whether it falls within the nominal 0-360 degree
range. If strict is false then the closest angle as if the
ranges were projected onto a single circle is returned.
Implementation
Angle angleClosestTo(Angle angle, [bool strict = false]) {
// Contains?
if (!strict && contains360(angle)) {
return angle;
} else if (contains(angle)) {
return angle;
}
// Not contained... return closest endpoint.
if (!strict) {
final angRev0 = angle.angle360;
late Angle closest;
num minDeltaRad = angle360.mks.toDouble();
final ranges = ranges360;
num deltaStartRad;
num deltaStartRadRev;
num deltaEndRad;
num deltaEndRadRev;
for (final range in ranges) {
deltaStartRad = (range.startAngle.mks.toDouble() - angRev0.mks.toDouble()).abs();
deltaStartRadRev = tau + range.startAngle.mks.toDouble() - angRev0.mks.toDouble();
deltaStartRad = min(deltaStartRad, deltaStartRadRev);
deltaEndRad = (range.endAngle.mks.toDouble() - angRev0.mks.toDouble()).abs();
deltaEndRadRev = tau + range.endAngle.mks.toDouble() - angRev0.mks.toDouble();
deltaEndRad = min(deltaEndRad, deltaEndRadRev);
if (deltaStartRad < minDeltaRad) {
closest = range.startAngle;
minDeltaRad = deltaStartRad;
}
if (deltaEndRad < minDeltaRad) {
closest = range.endAngle;
minDeltaRad = deltaEndRad;
}
}
return closest;
} else {
final num deltaStartRad = (startAngle.mks.toDouble() - angle.mks.toDouble()).abs();
final num deltaEndRad = (endAngle.mks.toDouble() - angle.mks.toDouble()).abs();
return (deltaStartRad <= deltaEndRad) ? Angle(rad: deltaStartRad) : Angle(rad: deltaEndRad);
}
}