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);
}
}