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 #ifndef IMG_POINT_H
00028 #define IMG_POINT_H
00029
00030 #include <vector>
00031 #include <iosfwd>
00032 #include <boost/operators.hpp>
00033
00034 #include <ost/img/module_config.hh>
00035 #include "vecmat.hh"
00036
00037 namespace ost { namespace img {
00038
00039
00040 class Size;
00041
00043 class DLLEXPORT_OST_IMG_BASE Point: boost::additive<Point,
00044 boost::additive2<Point, Size,
00045 boost::multipliable2<Point,int,
00046 boost::less_than_comparable<Point,
00047 boost::equality_comparable<Point> > > > >{
00048 public:
00049 Point():
00050 x(),
00051 y(),
00052 z()
00053 {
00054 }
00055
00056 Point(const Point &p):
00057 x(p.x),
00058 y(p.y),
00059 z(p.z)
00060 {
00061 }
00062
00063
00065 Point(int a):
00066 x(a),
00067 y(),
00068 z()
00069 {
00070 }
00071
00073 Point(int a, int b):
00074 x(a),
00075 y(b),
00076 z()
00077 {
00078 }
00079
00081 Point(int a, int b, int c):
00082 x(a),
00083 y(b),
00084 z(c)
00085 {
00086 }
00087
00089 explicit Point(const Vec2& v):
00090 x(static_cast<int>(round(v[0]))),
00091 y(static_cast<int>(round(v[1]))),
00092 z()
00093 {
00094 }
00095
00096
00098 explicit Point(const Vec3& v):
00099 x(static_cast<int>(round(v[0]))),
00100 y(static_cast<int>(round(v[1]))),
00101 z(static_cast<int>(round(v[2])))
00102 {
00103 }
00104
00105
00107 explicit Point(const Vec4& v):
00108 x(static_cast<int>(round(v[0]))),
00109 y(static_cast<int>(round(v[1]))),
00110 z(static_cast<int>(round(v[2])))
00111 {
00112 if(std::abs(v[3])<1e-100) {
00113 throw geom::OutOfRangeException("4th element of Vec4 is too close to zero for normalization");
00114 } else {
00115 Real sf = 1.0/v[3];
00116 x = static_cast<int>(x*sf);
00117 y = static_cast<int>(y*sf);
00118 z = static_cast<int>(z*sf);
00119 }
00120 }
00121
00123 Point(const Size& size);
00124
00126 Point Mirror(int planes);
00127
00128
00129 int& operator[](unsigned int index)
00130 {
00131 assert(index<=2);
00132 return (&x)[index];
00133 }
00134
00135 int operator[](unsigned int index) const
00136 {
00137 assert(index<=2);
00138 return (&x)[index];
00139 }
00140
00141
00142 int& At(unsigned int index)
00143 {
00144 if(index>2) throw std::range_error("Point index out of range");
00145 return (&x)[index];
00146 }
00147
00148 int At(unsigned int index) const
00149 {
00150 if(index>2) throw geom::OutOfRangeException("Point index out of range");
00151 return (&x)[index];
00152 }
00153
00154
00155 Point& operator=(const Point& p);
00156
00157 Point& operator+=(const Point& p);
00158
00159 Point& operator-=(const Point& p);
00160
00161 Point operator-() const;
00162
00163 Point& operator+=(const Size& p);
00164
00165 Point& operator-=(const Size& p);
00166
00167 bool operator==(const Point &p) const;
00168
00169 bool operator<(const Point &p) const;
00170
00171 Point& operator*=(int s) {x*=s;y*=s;z*=s;return *this;}
00172
00173
00174 Vec2 ToVec2() const;
00175 Vec3 ToVec3() const;
00176 Vec4 ToVec4() const;
00177
00178 int x;
00179 int y;
00180 int z;
00181 };
00182
00183
00184 DLLEXPORT_OST_IMG_BASE std::ostream& operator<<(std::ostream& os, const Point &p);
00185
00186
00187 }}
00188
00189
00190 #endif
00191
00192
00193