#include #include "Polar.h" template PolarOf::PolarOf() { this->distance = 0.0f; this->angle = AngleOf(); } template PolarOf::PolarOf(float distance, AngleOf angle) { // distance should always be 0 or greater if (distance < 0.0f) { this->distance = -distance; this->angle = AngleOf::Normalize(angle - AngleOf::Degrees(180)); } else { this->distance = distance; if (this->distance == 0.0f) // angle is always 0 if distance is 0 this->angle = AngleOf(); else this->angle = AngleOf::Normalize(angle); } } template PolarOf PolarOf::FromVector2(Vector2 v) { float distance = v.magnitude(); AngleOf angle = AngleOf::Degrees(Vector2::SignedAngle(Vector2::forward, v)); PolarOf p = PolarOf(distance, angle); return p; } template PolarOf PolarOf::FromSpherical(SphericalOf v) { float distance = v.distance * cosf(v.direction.vertical.InDegrees() * Passer::LinearAlgebra::Deg2Rad); AngleOf angle = v.direction.horizontal; PolarOf p = PolarOf(distance, angle); return p; } template const PolarOf PolarOf::zero = PolarOf(0.0f, AngleOf()); template const PolarOf PolarOf::forward = PolarOf(1.0f, AngleOf()); template const PolarOf PolarOf::back = PolarOf(1.0, AngleOf::Degrees(180)); template const PolarOf PolarOf::right = PolarOf(1.0, AngleOf::Degrees(90)); template const PolarOf PolarOf::left = PolarOf(1.0, AngleOf::Degrees(-90)); template bool PolarOf::operator==(const PolarOf& v) const { return (this->distance == v.distance && this->angle.InDegrees() == v.angle.InDegrees()); } template PolarOf PolarOf::Normalize(const PolarOf& v) { PolarOf r = PolarOf(1, v.angle); return r; } template PolarOf PolarOf::normalized() const { PolarOf r = PolarOf(1, this->angle); return r; } template PolarOf PolarOf::operator-() const { PolarOf v = PolarOf(this->distance, this->angle + AngleOf::Degrees(180)); return v; } template PolarOf PolarOf::operator-(const PolarOf& v) const { PolarOf r = -v; return *this + r; } template PolarOf PolarOf::operator-=(const PolarOf& v) { *this = *this - v; return *this; } template PolarOf PolarOf::operator+(const PolarOf& v) const { if (v.distance == 0) return PolarOf(this->distance, this->angle); if (this->distance == 0.0f) return v; float deltaAngle = AngleOf::Normalize(v.angle - this->angle).InDegrees(); float rotation = deltaAngle < 0.0f ? 180.0f + deltaAngle : 180.0f - deltaAngle; if (rotation == 180.0f && v.distance > 0.0f) { // angle is too small, take this angle and add the distances return PolarOf(this->distance + v.distance, this->angle); } float newDistance = AngleOf::CosineRuleSide(v.distance, this->distance, AngleOf::Degrees(rotation)); float angle = Angle::CosineRuleAngle(newDistance, this->distance, v.distance) .InDegrees(); float newAngle = deltaAngle < 0.0f ? this->angle.InDegrees() - angle : this->angle.InDegrees() + angle; AngleOf newAngleA = AngleOf::Normalize(AngleOf::Degrees(newAngle)); PolarOf vector = PolarOf(newDistance, newAngleA); return vector; } template PolarOf PolarOf::operator+=(const PolarOf& v) { *this = *this + v; return *this; } template PolarOf PolarOf::operator*=(float f) { this->distance *= f; return *this; } template PolarOf PolarOf::operator/=(float f) { this->distance /= f; return *this; } template float PolarOf::Distance(const PolarOf& v1, const PolarOf& v2) { float d = AngleOf::CosineRuleSide(v1.distance, v2.distance, v2.angle - v1.angle); return d; } template PolarOf PolarOf::Rotate(const PolarOf& v, AngleOf angle) { AngleOf a = AngleOf::Normalize(v.angle + angle); PolarOf r = PolarOf(v.distance, a); return r; } template class PolarOf; template class PolarOf; //===================================== /* Polar::Polar() { this->distance = 0.0f; this->angle = 0.0f; } Polar::Polar(float distance, Angle angle) { // distance should always be 0 or greater if (distance < 0.0f) { this->distance = -distance; this->angle = Angle::Normalize(angle.ToFloat() - 180.0f); } else { this->distance = distance; if (this->distance == 0.0f) // angle is always 0 if distance is 0 this->angle = 0.0f; else this->angle = Angle::Normalize(angle); } } Polar::Polar(Vector2 v) { this->distance = v.magnitude(); this->angle = Vector2::SignedAngle(Vector2::forward, v); } Polar::Polar(Spherical v) { this->distance = v.distance * cosf(v.verticalAngle.ToFloat() * Passer::LinearAlgebra::Deg2Rad); this->angle = v.horizontalAngle; } const Polar Polar::zero = Polar(0.0f, 0.0f); const Polar Polar::forward = Polar(1.0f, 0.0f); const Polar Polar::back = Polar(1.0, 180.0f); const Polar Polar::right = Polar(1.0, 90.0f); const Polar Polar::left = Polar(1.0, -90.0f); bool Polar::operator==(const Polar& v) const { return (this->distance == v.distance && this->angle.ToFloat() == v.angle.ToFloat()); } Polar Polar::Normalize(const Polar& v) { Polar r = Polar(1, v.angle); return r; } Polar Polar::normalized() const { Polar r = Polar(1, this->angle); return r; } Polar Polar::operator-() const { Polar v = Polar(this->distance, this->angle.ToFloat() + 180.0f); return v; } Polar Polar::operator-(const Polar& v) const { Polar r = -v; return *this + r; } Polar Polar::operator-=(const Polar& v) { *this = *this - v; return *this; } Polar Polar::operator+(const Polar& v) const { if (v.distance == 0) return Polar(this->distance, this->angle); if (this->distance == 0.0f) return v; float deltaAngle = Angle::Normalize(v.angle.ToFloat() - this->angle.ToFloat()).ToFloat(); float rotation = deltaAngle < 0.0f ? 180.0f + deltaAngle : 180.0f - deltaAngle; if (rotation == 180.0f && v.distance > 0.0f) { // angle is too small, take this angle and add the distances return Polar(this->distance + v.distance, this->angle); } float newDistance = Angle::CosineRuleSide(v.distance, this->distance, rotation).ToFloat(); float angle = Angle::CosineRuleAngle(newDistance, this->distance, v.distance).ToFloat(); float newAngle = deltaAngle < 0.0f ? this->angle.ToFloat() - angle : this->angle.ToFloat() + angle; newAngle = Angle::Normalize(newAngle).ToFloat(); Polar vector = Polar(newDistance, newAngle); return vector; } Polar Polar::operator+=(const Polar& v) { *this = *this + v; return *this; } // Polar Passer::LinearAlgebra::operator*(const Polar &v, float f) { // return Polar(v.distance * f, v.angle); // } // Polar Passer::LinearAlgebra::operator*(float f, const Polar &v) { // return Polar(v.distance * f, v.angle); // } Polar Polar::operator*=(float f) { this->distance *= f; return *this; } // Polar Passer::LinearAlgebra::operator/(const Polar& v, float f) { // return Polar(v.distance / f, v.angle); // } // Polar Passer::LinearAlgebra::operator/(float f, const Polar& v) { // return Polar(v.distance / f, v.angle); // } Polar Polar::operator/=(float f) { this->distance /= f; return *this; } float Polar::Distance(const Polar& v1, const Polar& v2) { float d = Angle::CosineRuleSide(v1.distance, v2.distance, v2.angle.ToFloat() - v1.angle.ToFloat()) .ToFloat(); return d; } Polar Polar::Rotate(const Polar& v, Angle angle) { Angle a = Angle::Normalize(v.angle.ToFloat() + angle.ToFloat()); Polar r = Polar(v.distance, a); return r; } */