00001 00006 #include "Vector.h" 00007 00008 #ifndef Point_h 00009 #define Point_h 00010 00011 #include <iosfwd> 00012 00013 class Point { 00014 public: 00015 Point() { 00016 data[0] = data[1] = data[2] = 0.0; 00017 } 00018 00019 Point(double x, double y, double z) { 00020 data[0] = x; data[1] = y; data[2] = z; 00021 } 00022 00023 Point(const Point& copy) { 00024 for(int i=0;i<3;i++) 00025 data[i] = copy.data[i]; 00026 } 00027 explicit Point(const Vector& copy) { 00028 data[0] = copy.x(); data[1] = copy.y(); data[2] = copy.z(); 00029 } 00030 00031 Point& operator=(const Point& copy) { 00032 for(int i=0;i<3;i++) 00033 data[i] = copy.data[i]; 00034 return *this; 00035 } 00036 00037 ~Point() { 00038 } 00039 00040 double x() const { 00041 return data[0]; 00042 } 00043 double y() const { 00044 return data[1]; 00045 } 00046 double z() const { 00047 return data[2]; 00048 } 00049 00050 Vector operator-(const Point& p) const { 00051 return Vector(data[0]-p.data[0], data[1]-p.data[1], data[2]-p.data[2]); 00052 } 00053 Point operator+(const Vector& v) const { 00054 return Point(data[0]+v.x(), data[1]+v.y(), data[2]+v.z()); 00055 } 00056 Point operator-(const Vector& v) const { 00057 return Point(data[0]-v.x(), data[1]-v.y(), data[2]-v.z()); 00058 } 00059 00060 Point& operator+=(const Vector& v) { 00061 data[0]+=v.x(); 00062 data[1]+=v.y(); 00063 data[2]+=v.z(); 00064 return *this; 00065 } 00066 00067 Point& operator-=(const Vector& v) { 00068 data[0]-=v.x(); 00069 data[1]-=v.y(); 00070 data[2]-=v.z(); 00071 return *this; 00072 } 00073 private: 00074 double data[3]; 00075 }; 00076 00077 inline Point operator+(const Vector& v, const Point& p) 00078 { 00079 return Point(v.x() + p.x(), v.y() + p.y(), v.z() + p.z()); 00080 } 00081 00082 inline Point Interpolate(double s2, const Point& p1, const Point& p2) 00083 { 00084 double s1 = 1-s2; 00085 return Point(s1*p1.x() + s2*p2.x(), s1*p1.y() + s2*p2.y(), 00086 s1*p1.z() + s2*p2.z()); 00087 } 00088 00089 inline Point AffineCombination(double s1, const Point& p1, 00090 double s2, const Point& p2) 00091 { 00092 return Point(s1*p1.x() + s2*p2.x(), s1*p1.y() + s2*p2.y(), 00093 s1*p1.z() + s2*p2.z()); 00094 } 00095 00096 inline Point AffineCombination(double s1, const Point& p1, 00097 double s2, const Point& p2, 00098 double s3, const Point& p3) 00099 { 00100 return Point(s1*p1.x() + s2*p2.x() + s3*p3.x(), 00101 s1*p1.y() + s2*p2.y() + s3*p3.y(), 00102 s1*p1.z() + s2*p2.z() + s3*p3.z()); 00103 } 00104 00105 inline double Dot(const Point& v1, const Vector& v2) 00106 { 00107 return v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z(); 00108 } 00109 00110 inline double Dot(const Vector& v1, const Point& v2) 00111 { 00112 return v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z(); 00113 } 00114 00115 inline Point Min(const Point& p1, const Point& p2) 00116 { 00117 return Point(Min(p1.x(), p2.x()), Min(p1.y(), p2.y()), Min(p1.z(), p2.z())); 00118 } 00119 00120 inline Point Max(const Point& p1, const Point& p2) 00121 { 00122 return Point(Max(p1.x(), p2.x()), Max(p1.y(), p2.y()), Max(p1.z(), p2.z())); 00123 } 00124 00125 std::ostream& operator<<(std::ostream&, const Point& v1); 00126 00127 #endif 00128