#include <algorithm>
#include <cmath>
+#include <limits>
#include <ostream>
#include <SDL.h>
y -= other.y;
return *this;
}
+ Vector<Scalar> &operator *=(Scalar factor) {
+ x *= factor;
+ y *= factor;
+ return *this;
+ }
+ Vector<Scalar> &operator /=(Scalar factor) {
+ x /= factor;
+ y /= factor;
+ return *this;
+ }
SDL_Point ToPoint() const {
SDL_Point p;
}
+template<class Scalar>
+constexpr bool IsZero(Vector<Scalar> v) {
+ return std::abs(v.x) < std::numeric_limits<Scalar>::epsilon()
+ && std::abs(v.y) < std::numeric_limits<Scalar>::epsilon();
+}
+
+
template<class Scalar>
constexpr Scalar Cross2D(Vector<Scalar> lhs, Vector<Scalar> rhs) {
return (lhs.x * rhs.y) - (lhs.y * rhs.x);
constexpr Vector<Scalar> Rotate270(Vector<Scalar> v) {
return Vector<Scalar>(v.y, -v.x);
}
+template<class Scalar, class Float>
+inline Vector<Scalar> Rotate(Vector<Scalar> v, Float by) {
+ Float sine(std::sin(by));
+ Float cosine(std::cos(by));
+ return Vector<Scalar>(v.x * cosine - v.y * sine, v.x * sine + v.y * cosine);
+}
+
+/// reflect v along normalized n
+template<class Scalar>
+inline Vector<Scalar> Reflect(Vector<Scalar> v, Vector<Scalar> n) {
+ const Scalar dd = Scalar(2) * Dot(v, n);
+ return Vector<Scalar>(v.x - (dd * n.x), v.y - (dd * n.y));
+}
template<class Scalar>