Home
Blog
Code-Blog
Twitter
Downloads
Links / Books
About
|
Websites |
Immutable math vector classHow many times have you written a vector class? I have many times. However this is the first time I wrote an immutable vector class where all data members are const. #pragma once #include <math.h> #include <iostream> namespace Math { const double M_PI = 3.14159265358979323846; inline double RadToDeg(double rad) { return rad * 180.0 / M_PI; } inline double DegToRad(double deg) { return deg * M_PI / 180.0; } class Vector { public: const double x; const double y; Vector() : x(0), y(0) {} Vector(double i, double j) : x(i), y(j) {} inline bool operator==(const Vector& v2) const { return v2.x == x && v2.y == y; } inline bool operator!=(const Vector& v2) const { return ! operator==(v2); } inline bool IsNull() const { return x == 0 && y == 0; } inline double ScalarProduct(const Vector& v2) const { const Vector v1u(Unit()); const Vector v2u(v2.Unit()); return (v1u.x * v2u.x) + (v1u.y * v2u.y); } inline double Length() const { return sqrt(x * x + y * y); } inline Vector Unit() const { const double r = Length(); if (r == 0) return Vector(); return Vector(x / r, y / r); } inline double ClockwiseAngle(const Vector& v2) const { return -atan2(x * v2.y - y * v2.x, x * v2.x + y * v2.y); } inline Vector ClockwiseRotated90() const { const double cos_a = 0; const double sin_a = 1; return Vector(x * cos_a + y * sin_a, y * cos_a - x * sin_a); } inline Vector ClockwiseRotatedRad(double rad) const { const double cos_a = cos(rad); const double sin_a = sin(rad); return Vector(x * cos_a + y * sin_a, y * cos_a - x * sin_a); } inline bool ArePerpendicular(const Vector& v2) const { return ScalarProduct(v2) == 0.0; } inline Vector Perpendicular()const { return Vector(-y, x); } }; //Vector inline Vector operator * (const Vector& v1, double v) { return Vector(v1.x * v, v1.y * v); } inline Vector operator * (double v, const Vector& v1) { return Vector(v1.x * v, v1.y * v); } inline Vector operator / (const Vector& v1, double v) { return Vector(v1.x / v, v1.y / v); } inline Vector operator + (const Vector& v1, const Vector& v2) { return Vector(v1.x + v2.x, v1.y + v2.y); } inline Vector operator - (const Vector& v1, const Vector& v2) { return Vector(v1.x - v2.x, v1.y - v2.y); } inline Vector operator - (const Vector& v1) { return Vector(-v1.x, -v1.y); } inline Vector MakeVector(double x1, double y1, double x2, double y2) { return Vector(x2 - x1, y2 - y1); } std::ostream& operator << (std::ostream& os, const Vector& v) { os << "(" << v.x << ", " << v.y << ")"; return os; } } // namespace math }}}
|