#ifndef STAR_CIRCLE_HPP #define STAR_CIRCLE_HPP #include "StarVector.hpp" #include "StarLine.hpp" namespace Star { template class Circle { public: typedef Vector Vec2T; typedef Line LineT; Circle(); Circle(Vec2T const& pos, T radius); bool intersects(Vec2T const& point); Vec2T pointAtAngle(T angle); T angleNearestTo(Vec2T const& point); Vec2T pointNearestTo(Vec2T const& point); private: T m_radius; Vec2T m_position; }; template Circle::Circle() : m_radius(0) { } template Circle::Circle(Vec2T const& pos, T radius) : m_radius(radius), m_position(pos) { } template bool Circle::intersects(Vec2T const& point) { T distSqu = (point - m_position).magnitudeSquared(); return distSqu <= m_radius * m_radius; } template auto Circle::pointAtAngle(T angle) -> Vec2T { auto fromCenter = Vec2T::withAngle(angle, m_radius); return fromCenter + m_position; } template auto Circle::angleNearestTo(Vec2T const& point) -> T { return (point - m_position).angle(); } template auto Circle::pointNearestTo(Vec2T const& point) -> Vec2T { T angle = angleNearestTo(point); return pointAtAngle(angle); } typedef Circle CirF; typedef Circle CirD; } #endif