improved rounding of discrete angles

This commit is contained in:
Pascal Serrarens 2024-12-14 12:40:25 +01:00
parent 536d6cef19
commit 800eb75e28

View File

@ -67,7 +67,7 @@ template <> float AngleOf<float>::InRadians() const {
template <> AngleOf<signed short> AngleOf<signed short>::Degrees(float angle) { template <> AngleOf<signed short> AngleOf<signed short>::Degrees(float angle) {
// map float [-180..180) to integer [-32768..32767] // map float [-180..180) to integer [-32768..32767]
signed short value = (signed short)(angle / 360.0F * 65536.0F); signed short value = (signed short)roundf(angle / 360.0F * 65536.0F);
return AngleOf<signed short>(value); return AngleOf<signed short>(value);
} }
@ -76,7 +76,7 @@ template <> AngleOf<signed short> AngleOf<signed short>::Radians(float angle) {
return AngleOf<signed short>(0); return AngleOf<signed short>(0);
// map float [-PI..PI) to integer [-32768..32767] // map float [-PI..PI) to integer [-32768..32767]
signed short value = (signed short)(angle / pi * 32768.0F); signed short value = (signed short)roundf(angle / pi * 32768.0F);
return AngleOf<signed short>(value); return AngleOf<signed short>(value);
} }
@ -94,7 +94,7 @@ template <> float AngleOf<signed short>::InRadians() const {
template <> AngleOf<signed char> AngleOf<signed char>::Degrees(float angle) { template <> AngleOf<signed char> AngleOf<signed char>::Degrees(float angle) {
// map float [-180..180) to integer [-128..127) // map float [-180..180) to integer [-128..127)
signed char value = (signed char)(angle / 360.0F * 256.0F); signed char value = (signed char)roundf(angle / 360.0F * 256.0F);
return AngleOf<signed char>(value); return AngleOf<signed char>(value);
} }
@ -103,7 +103,7 @@ template <> AngleOf<signed char> AngleOf<signed char>::Radians(float angle) {
return AngleOf<signed char>(0); return AngleOf<signed char>(0);
// map float [-pi..pi) to integer [-128..127) // map float [-pi..pi) to integer [-128..127)
signed char value = (signed char)(angle / pi * 128.0f); signed char value = (signed char)roundf(angle / pi * 128.0f);
return AngleOf<signed char>(value); return AngleOf<signed char>(value);
} }