point_3dh.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #ifndef LASS_GUARDIAN_OF_INCLUSION_PRIM_POINT_3DH_H
00054 #define LASS_GUARDIAN_OF_INCLUSION_PRIM_POINT_3DH_H
00055
00056
00057
00058
00059 #include "prim_common.h"
00060 #include "point_3d.h"
00061 #include "vector_4d.h"
00062
00063
00064 namespace lass
00065 {
00066
00067 namespace prim
00068 {
00069
00070 template<typename T>
00071 struct Point3DH
00072 {
00073 public:
00074
00075 typedef Point3DH<T> TSelf;
00076
00077 typedef Point3D<T> TPoint;
00078 typedef Vector4D<T> TVector;
00079
00080 typedef typename TVector::TValue TValue;
00081 typedef typename TVector::TParam TParam;
00082 typedef typename TVector::TReference TReference;
00083 typedef typename TVector::TConstReference TConstReference;
00084 typedef typename TVector::TNumTraits TNumTraits;
00085
00086 enum { dimension = TPoint::dimension };
00087
00088 template <typename U> struct Rebind
00089 {
00090 typedef Point3DH<U> Type;
00091 };
00092
00093 TValue x;
00094 TValue y;
00095 TValue z;
00096 TValue w;
00097
00098 Point3DH();
00099 Point3DH(TParam iX, TParam iY, TParam iZ, TParam iW = TNumTraits::one);
00100 Point3DH(const TPoint& iAffinePoint);
00101 explicit Point3DH(const TVector& iPositionVector);
00102
00103 const TVector position() const;
00104 TConstReference operator[](size_t iIndex) const;
00105 TReference operator[](size_t iIndex);
00106 TConstReference at(signed iIndex) const;
00107 TReference at(signed iIndex);
00108
00109 const Point3DH<T>& operator+() const;
00110 const Point3DH<T> operator-() const;
00111
00112 Point3DH<T>& operator+=(const Point3DH<T>& iB);
00113 Point3DH<T>& operator-=(const Point3DH<T>& iB);
00114 Point3DH<T>& operator*=(TParam iB);
00115 Point3DH<T>& operator/=(TParam iB);
00116
00117 const bool isZero() const;
00118 const bool isNaN() const;
00119 const bool isInfinite() const;
00120 const bool isValid() const;
00121 const TParam weight() const;
00122 const TPoint affine() const;
00123
00124 void homogenize();
00125 };
00126
00127 template<typename T> bool operator==(const Point3DH<T>& iA, const Point3DH<T>& iB);
00128 template<typename T> bool operator!=(const Point3DH<T>& iA, const Point3DH<T>& iB);
00129
00130 template<typename T> Point3DH<T> operator+(const Point3DH<T>& iA, const Point3DH<T>& iB);
00131 template<typename T> Point3DH<T> operator-(const Point3DH<T>& iA, Point3DH<T>& iB);
00132
00133 template<typename T> Point3DH<T> operator*(const Point3DH<T>& iA, typename Point3DH<T>::TParam iB);
00134 template<typename T> Point3DH<T> operator/(const Point3DH<T>& iA, typename Point3DH<T>::TParam iB);
00135 template<typename T> Point3DH<T> operator*(typename Point3DH<T>::TParam iA, const Point3DH<T>& iB);
00136
00137 template<typename T> std::ostream& operator<<(std::ostream& oOStream, const Point3DH<T>& iB);
00138 template<typename T> io::XmlOStream& operator<<(io::XmlOStream& oOStream, const Point3DH<T>& iB);
00139 template<typename T> std::istream& operator>>(std::istream& ioIStream, Point3DH<T>& oB);
00140
00141
00142
00143
00144 template<typename T> inline Point3DH<T> operator+(const Point3D<T>& iA, const Point3D<T>& iB)
00145 {
00146 return Point3DH<T>(iA) + Point3DH<T>(iB);
00147 }
00148 template<typename T> inline Point3DH<T> operator*(typename Point3D<T>::TParam iA, const Point3D<T>& iB)
00149 {
00150 return iA * Point3DH<T>(iB);
00151 }
00152 template<typename T> inline Point3DH<T> operator*(const Point3D<T>& iA, typename Point3D<T>::TParam iB)
00153 {
00154 return Point3DH<T>(iA) * iB;
00155 }
00156
00157
00158
00159 }
00160
00161 }
00162
00163 #include "point_3dh.inl"
00164
00165 #endif
00166
00167