diff --git a/DiscreteAngle.cpp b/DiscreteAngle.cpp index 9544da1..2ce3a55 100644 --- a/DiscreteAngle.cpp +++ b/DiscreteAngle.cpp @@ -6,9 +6,9 @@ #include -DiscreteAngle16::DiscreteAngle16(float angle) : Range16() { +template <> AngleUsing::AngleUsing(unsigned char angle) { if (!isfinite(angle)) { - range = 0; + value = 0; return; } @@ -18,9 +18,34 @@ DiscreteAngle16::DiscreteAngle16(float angle) : Range16() { while (angle > 180.0F) angle -= 360.0F; - // map (-180..180] to 1..65535 + // map (-180..180] to 1..256 // This means that range value 0 is not used - this->range = (unsigned short)((angle + 180.0F) * 65535.0F); + this->value = (unsigned char)((angle + 180.0F) * 255.0F); } -DiscreteAngle16 &DiscreteAngle16::operator-() { -this->range; } \ No newline at end of file +template <> float AngleUsing::ToFloat() { + float f = ((float)this->value / 255.0F) - 180.0F; + return f; +} + +template <> AngleUsing::AngleUsing(unsigned short angle) { + if (!isfinite(angle)) { + value = 0; + return; + } + + // clamp the float range to -1..1 + while (angle <= -180.0F) + angle += 360.0F; + while (angle > 180.0F) + angle -= 360.0F; + + // map (-180..180] to 1..256 + // This means that range value 0 is not used + this->value = (unsigned short)((angle + 180.0F) * 65535.0F); +} + +template <> float AngleUsing::ToFloat() { + float f = ((float)this->value / 65535.0F) - 180.0F; + return f; +} \ No newline at end of file diff --git a/DiscreteAngle.h b/DiscreteAngle.h index 5a2171b..f056e7d 100644 --- a/DiscreteAngle.h +++ b/DiscreteAngle.h @@ -4,11 +4,20 @@ #include "Range.h" // A fixed point 16-bit signed angle between (-180..180] -class DiscreteAngle16 : public Range16 { -public: - DiscreteAngle16(float angle); +// class DiscreteAngle16 : public Range16 { +// public: +// DiscreteAngle16(float angle); - inline DiscreteAngle16 &operator-() override; +// inline DiscreteAngle16 &operator-() override; +// }; + +template class AngleUsing : RangeUsing { +public: + AngleUsing(T sourceValue); + float ToFloat(); + inline T GetValue() { return this->value; } }; -#endif \ No newline at end of file +#endif + +template inline float AngleUsing::ToFloat() { return 0.0f; } diff --git a/Range.cpp b/Range.cpp index af23906..15bb7ca 100644 --- a/Range.cpp +++ b/Range.cpp @@ -1,5 +1,6 @@ #include "Range.h" +/* Range16::Range16() { this->range = 0; } Range16::Range16(float f) { @@ -36,4 +37,5 @@ bool Range16::operator!=(Range16 a) { return (this->range != a.range); } bool Range16::operator<(Range16 a) { return (this->range < a.range); } bool Range16::operator>(Range16 a) { return (this->range > a.range); } bool Range16::operator<=(Range16 a) { return (this->range <= a.range); } -bool Range16::operator>=(Range16 a) { return (this->range >= a.range); } \ No newline at end of file +bool Range16::operator>=(Range16 a) { return (this->range >= a.range); } +*/ \ No newline at end of file diff --git a/Range.h b/Range.h index e73cde7..e521c71 100644 --- a/Range.h +++ b/Range.h @@ -1,6 +1,7 @@ #ifndef RANGE_H #define RANGE_H +/* /// @brief Signed range. May be renamed to SignedRange later class Range16 { public: @@ -25,5 +26,16 @@ protected: // uint16_t range; // 16-bit range unsigned short range; // 16-bit range }; +*/ + +template class RangeUsing { +public: + inline RangeUsing operator-(RangeUsing a) { this->value - a.value; } + inline RangeUsing operator+(RangeUsing a) { this->value + a.value; } + inline RangeUsing operator-() { this->value = -this.value; } + inline T GetValue() { return value; } + + T value; +}; #endif \ No newline at end of file