#include #include "Polar.h" #include "Vector2.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::Degrees(float distance, float degrees) { AngleOf angle = AngleOf::Degrees(degrees); PolarOf r = PolarOf(distance, angle); return r; } template PolarOf PolarOf::Radians(float distance, float radians) { return PolarOf(distance, AngleOf::Radians(radians)); } 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; // angle = AngleOf::Normalize(newAngle); // distance = newDistance; } // Polar::Polar(Vector2 v) { // float signY = (v.y >= 0) - (v.y < 0); // angle = atan2(v.y, signY * sqrt(v.y * v.y + v.x * v.x)) * Angle::Rad2Deg; // distance = v.magnitude(); // } // const Polar Polar::zero = Polar(0, 0); // float Polar::Distance(const Polar &v1, const Polar &v2) { // float d = // Angle::CosineRuleSide(v1.distance, v2.distance, v2.angle - v1.angle); // return d; // } 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 = AngleSingle::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 Passer::LinearAlgebra::PolarOf; template class Passer::LinearAlgebra::PolarOf;