00001
00008 #ifndef POINT3_H
00009 #define POINT3_H
00010
00011 #include "Vector3.h"
00012
00019 template<class T>
00020 class Point3
00021 {
00022 public:
00023 T x, y, z;
00024
00025 Point3() : x((T)0.0), y((T)0.0), z((T)0.0) {}
00026 Point3(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {}
00027 Point3(const Vector3<T> &v) : x(v.x), y(v.y), z(v.z) {}
00028
00029 void Set(T _x, T _y, T _z) { x = _x; y = _y; z = _z; }
00030
00031 Point3 operator+(const Point3 &p) const
00032 {
00033 return Point3(x + p.x, y + p.y, z + p.z);
00034 }
00035
00036 Point3 operator+(const Vector3<T> &v) const
00037 {
00038 return Point3(x + v.x, y + v.y, z + v.z);
00039 }
00040
00041 Point3 &operator+=(const Point3 &p)
00042 {
00043 x += p.x;
00044 y += p.y;
00045 z += p.z;
00046 return *this;
00047 }
00048
00049 Vector3<T> operator-(const Point3 &p) const
00050 {
00051 return Vector3<T>(x - p.x, y - p.y, z - p.z);
00052 }
00053
00054 Vector3<T> operator-(const Vector3<T> &v) const
00055 {
00056 return Vector3<T>(x - v.x, y - v.y, z - v.z);
00057 }
00058
00059 Point3 operator-() const
00060 {
00061 return Point3(-x, -y, -z);
00062 }
00063
00064 Point3 &operator-=(const Point3 &p)
00065 {
00066 x -= p.x;
00067 y -= p.y;
00068 z -= p.z;
00069 return *this;
00070 }
00071
00072 Point3 operator/(T c) const
00073 {
00074 return Point3(x / c,-y / c, z / c);
00075 }
00076
00077 T& operator[](int i)
00078 {
00079 return ((T*)this)[i];
00080 }
00081
00082 T operator[](int i) const
00083 {
00084 return ((T*)this)[i];
00085 }
00086
00087 Point3 operator*(T c) const
00088 {
00089 return Point3(c*x, c*y, c*z);
00090 }
00091
00092 friend Point3 operator*(float c, const Point3 &p)
00093 {
00094 return Point3(c*p.x, c*p.y, c*p.z);
00095 }
00096 };
00097
00098 typedef Point3<float> Point3f;
00099 typedef Point3<double> Point3d;
00100
00101
00102 template<class T>
00103 T Dot(const Vector3<T> &v, const Point3<T> &p)
00104 {
00105 return v.x*p.x + v.y*p.y + v.z*p.z;
00106 }
00107
00108 template<class T>
00109 T Dot(const Point3<T> &p, const Vector3<T> &v)
00110 {
00111 return v.x*p.x + v.y*p.y + v.z*p.z;
00112 }
00113
00114 template<class T>
00115 T Dot(const Point3<T> &p1, const Point3<T> &p2)
00116 {
00117 return p1.x*p2.x + p1.y*p2.y + p1.z*p2.z;
00118 }
00119
00120 #endif