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