#ifndef _Point_h #define _Point_h // File: Point.h // // Classes to support 2D and 3D affine space // D. P. Mitchell 95/06/02. // // History: // -@- 08/01/95 (mikemarr) - unified & cleaned up interface // - added Print and Parse // -@- 08/01/95 (mikemarr) - define all inlined functions with macros // -@- 06/21/96 (mikemarr) - added IsCCW // -@- 10/29/97 (mikemarr) - changed data to be floats, not vectors // - removed data accessors & made data public // - changed +=, -= operators to return reference // - removed I/O // - added operator const float * // - changed fuzzy equal to be IsEqual, operator == to be exact // - removed macro junk // -@- 11/04/97 (mikemarr) - added initialization with POINT // -@- 11/10/97 (mikemarr) - added operator *,/,*=,/= #ifndef _VecMath_h #include "VecMath.h" #endif // Class: Point2 // Hungarian: pnt class Point2 { public: Point2() {} Point2(float fX, float fY) : x(fX), y(fY) {} Point2(const Vector2 &v) : x(v.x), y(v.y) {} Point2(const POINT &pt) : x(pt.x + 0.5f), y(pt.y + 0.5f) {} // ALGEBRAIC OPERATORS friend Point2 operator +(const Point2 &p, const Vector2 &v); friend Point2 operator +(const Vector2 &v, const Point2 &p); friend Point2 operator -(const Point2 &p, const Vector2 &v); friend Point2 operator -(const Vector2 &v, const Point2 &p); friend Point2 operator *(const Point2 &p, float a); friend Point2 operator *(float a, const Point2 &p); friend Point2 operator /(const Point2 &p, float a); friend Vector2 operator -(const Point2 &p, const Point2 &q); friend Point2 & operator +=(Point2 &p, const Vector2 &v); friend Point2 & operator -=(Point2 &p, const Vector2 &v); friend Point2 & operator *=(Point2 &p, float a); friend Point2 & operator /=(Point2 &p, float a); friend float operator *(const CoVector2 &cv, const Point2 &p); friend int operator ==(const Point2 &p, const Point2 &q); friend int operator !=(const Point2 &p, const Point2 &q); friend int IsEqual(const Point2 &p, const Point2 &q); friend Point2 Lerp(const Point2 &p, const Point2 &q, float t); friend bool IsCCW(const Point2 &p0, const Point2 &p, const Point2 &q); operator const float *() const { return &x; } float X() const { return x; } float Y() const { return y; } float & X() { return x; } float & Y() { return y; } public: float x, y; }; // Class: Point3 // Hungarian: pnt class Point3 { public: Point3() {} Point3(float fX, float fY, float fZ) : x(fX), y(fY), z(fZ) {} Point3(const Vector3 &v) : x(v.x), y(v.y), z(v.z) {} // ALGEBRAIC OPERATORS friend Point3 operator +(const Point3 &p, const Vector3 &v); friend Point3 operator +(const Vector3 &v, const Point3 &p); friend Point3 operator -(const Point3 &p, const Vector3 &v); friend Point3 operator -(const Vector3 &v, const Point3 &p); friend Vector3 operator -(const Point3 &p, const Point3 &q); friend Point3 operator *(const Point3 &p, float a); friend Point3 operator *(float a, const Point3 &p); friend Point3 operator /(const Point3 &p, float a); friend Point3 & operator +=(Point3 &p, const Vector3 &v); friend Point3 & operator -=(Point3 &p, const Vector3 &v); friend Point3 & operator *=(Point3 &p, float a); friend Point3 & operator /=(Point3 &p, float a); friend float operator *(const CoVector3 &cv, const Point3 &p); friend int operator ==(const Point3 &p, const Point3 &q); friend int operator !=(const Point3 &p, const Point3 &q); friend int IsEqual(const Point3 &p, const Point3 &q); friend Point3 Lerp(const Point3 &p, const Point3 &q, float t); Point2 Project(DWORD iAxis) const; operator const float *() const { return &x; } float X() const { return x; } float Y() const { return y; } float Z() const { return z; } float & X() { return x; } float & Y() { return y; } float & Z() { return z; } public: float x, y, z; }; /////////// // Point2 /////////// inline Point2 operator +(const Point2 &p, const Vector2 &v) { return Point2(p.x + v.x, p.y + v.y); } inline Point2 operator +(const Vector2 &v, const Point2 &p) { return Point2(p.x + v.x, p.y + v.y); } inline Point2 operator -(const Point2 &p, const Vector2 &v) { return Point2(p.x - v.x, p.y - v.y); } inline Point2 operator -(const Vector2 &v, const Point2 &p) { return Point2(p.x - v.x, p.y - v.y); } inline Vector2 operator -(const Point2 &p, const Point2 &q) { return Vector2(p.x - q.x, p.y - q.y); } inline Point2 operator *(float a, const Point2 &p) { return Point2(a*p.x, a*p.y); } inline Point2 operator *(const Point2 &p, float a) { return Point2(a*p.x, a*p.y); } inline Point2 operator /(const Point2 &p, float a) { MMASSERT(a != 0.f); float fTmp = 1.f/a; return Point2(p.x * fTmp, p.y * fTmp); } inline Point2 & operator +=(Point2 &p, const Vector2 &v) { p.x += v.x; p.y += v.y; return p; } inline Point2 & operator -=(Point2 &p, const Vector2 &v) { p.x -= v.x; p.y -= v.y; return p; } inline Point2 & operator *=(Point2 &p, float a) { p.x *= a; p.y *= a; return p; } inline Point2 & operator /=(Point2 &p, float a) { MMASSERT(a != 0.f); float fTmp = 1.f/a; p.x *= fTmp; p.y *= fTmp; return p; } inline int operator ==(const Point2 &p, const Point2 &q) { return ((p.x == q.x) && (p.y == q.y)); } inline int operator !=(const Point2 &p, const Point2 &q) { return ((p.x != q.x) || (p.y != q.y)); } inline int IsEqual(const Point2 &p, const Point2 &q) { return (FloatEquals(p.x, q.x) && FloatEquals(p.y, q.y)); } inline Point2 Lerp(const Point2 &p, const Point2 &q, float t) { return Point2(p.x + (q.x - p.x) * t, p.y + (q.y - p.y) * t); } inline bool IsCCW(const Point2 &p0, const Point2 &p1, const Point2 &p2) { #ifdef MIRRORY return ((p0.y - p1.y) * (p2.x - p1.x) <= (p0.x - p1.x) * (p2.y - p1.y)); #else return ((p0.y - p1.y) * (p2.x - p1.x) >= (p0.x - p1.x) * (p2.y - p1.y)); #endif } inline float operator *(const CoVector2 &cv, const Point2 &p) { return cv.x*p.x + cv.y*p.y; } /////////// // Point3 /////////// inline Point3 operator +(const Point3 &p, const Vector3 &v) { return Point3(p.x + v.x, p.y + v.y, p.z + v.z); } inline Point3 operator +(const Vector3 &v, const Point3 &p) { return Point3(p.x + v.x, p.y + v.y, p.z + v.z); } inline Point3 operator -(const Point3 &p, const Vector3 &v) { return Point3(p.x - v.x, p.y - v.y, p.z - v.z); } inline Point3 operator -(const Vector3 &v, const Point3 &p) { return Point3(p.x - v.x, p.y - v.y, p.z - v.z); } inline Vector3 operator -(const Point3 &p, const Point3 &q) { return Vector3(p.x - q.x, p.y - q.y, p.z - q.z); } inline Point3 operator *(float a, const Point3 &p) { return Point3(a*p.x, a*p.y, a*p.z); } inline Point3 operator *(const Point3 &p, float a) { return Point3(a*p.x, a*p.y, a*p.z); } inline Point3 operator /(const Point3 &p, float a) { MMASSERT(a != 0.f); float fTmp = 1.f/a; return Point3(p.x * fTmp, p.y * fTmp, p.z * fTmp); } inline Point3 & operator +=(Point3 &p, const Vector3 &v) { p.x += v.x; p.y += v.y; p.z += v.z; return p; } inline Point3 & operator -=(Point3 &p, const Vector3 &v) { p.x -= v.x; p.y -= v.y; p.z -= v.z; return p; } inline Point3 & operator *=(Point3 &p, float a) { p.x *= a; p.y *= a; p.z *= a; return p; } inline Point3 & operator /=(Point3 &p, float a) { MMASSERT(a != 0.f); float fTmp = 1.f/a; p.x *= fTmp; p.y *= fTmp; p.z *= fTmp; return p; } inline int operator ==(const Point3 &p, const Point3 &q) { return ((p.x == q.x) && (p.y == q.y) && (p.z == q.z)); } inline int operator !=(const Point3 &p, const Point3 &q) { return ((p.x != q.x) || (p.y != q.y) || (p.z != q.z)); } inline int IsEqual(const Point3 &p, const Point3 &q) { return (FloatEquals(p.x, q.x) && FloatEquals(p.y, q.y) && FloatEquals(p.z, q.z)); } inline Point3 Lerp(const Point3 &p, const Point3 &q, float t) { return Point3(p.x + (q.x - p.x) * t, p.y + (q.y - p.y) * t, p.z + (q.z - p.z) * t); } inline Point2 Point3::Project(DWORD iAxis) const { switch (iAxis) { case 0: return Point2(y, z); case 1: return Point2(x, z); case 2: return Point2(x, y); } return Point2(0.f, 0.f); } inline float operator *(const CoVector3 &cv, const Point3 &p) { return cv.x*p.x + cv.y*p.y + cv.z*p.z; } #endif