]> git.localhorst.tv Git - gworm.git/blobdiff - src/graphics/Vector.h
some lousy world collision, friction, and drag
[gworm.git] / src / graphics / Vector.h
index d35cf33fcb119be8fb67351c9a3ac6d89951fe80..6565cc116b0f0545cf480a2002b8468a17d77da3 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <algorithm>
 #include <cmath>
+#include <limits>
 #include <ostream>
 #include <SDL.h>
 
@@ -36,6 +37,16 @@ public:
                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;
@@ -142,6 +153,13 @@ constexpr bool operator !=(Vector<Scalar> lhs, Vector<Scalar> rhs) {
 }
 
 
+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);
@@ -171,6 +189,19 @@ template<class Scalar>
 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>