#ifndef __RECTANGLE3_H #define __RECTANGLE3_H #include using namespace std; #include "Vector3.h" namespace GtpVisibilityPreprocessor { /// rectangle vertices // 3 2 // 0 1 class Rectangle3 { public: Vector3 mVertices[4]; inline Vector3 GetVertex(const int i) const { return mVertices[i]; } Rectangle3() {} Rectangle3(const Vector3 &v0, const Vector3 &v1, const Vector3 &v2, const Vector3 &v3) { mVertices[0] = v0; mVertices[1] = v1; mVertices[2] = v2; mVertices[3] = v3; } Vector3 GetNormal() const { return Normalize(CrossProd(mVertices[0]-mVertices[1], mVertices[2]-mVertices[1] )); } Vector3 GetCenter() const { return (mVertices[0] + mVertices[1] + mVertices[2] + mVertices[3])/4.0f; } int DominantAxis() const { if (SqrMagnitude(mVertices[0] - mVertices[1]) > SqrMagnitude(mVertices[0] - mVertices[3])) return 0; else return 1; } float GetArea() const { Vector3 v = CrossProd(mVertices[3], mVertices[0]); for (int i=0; i < 3; i++) v += CrossProd(mVertices[i], mVertices[i+1]); return 0.5f*abs(DotProd(GetNormal(), v)); } void Split(const int axis, Rectangle3 &r1, Rectangle3 &r2 ) const; friend ostream& operator<< (ostream &s, const Rectangle3 &r) { return s<<"Rectangle3:"<