00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GEOM_VEC2_H
00020 #define GEOM_VEC2_H
00021
00022 #include <stdexcept>
00023 #include <cassert>
00024 #include <cstddef>
00025 #include <ostream>
00026 #include <vector>
00027 #include <boost/operators.hpp>
00028
00029
00030 #include <ost/config.hh>
00031 #include <ost/geom/module_config.hh>
00032 #include <ost/geom/exc.hh>
00033 namespace geom {
00034
00035
00036 class Vec3;
00037 class Vec4;
00038
00039
00040
00041
00042 class DLLEXPORT Vec2:
00043 private boost::equality_comparable<Vec2>,
00044 private boost::additive<Vec2>,
00045 private boost::additive<Vec2, Real>,
00046 private boost::multiplicative<Vec2, Real>
00047 {
00048 public:
00050 Vec2(): x(0), y(0) { }
00051
00053 Vec2(Real px, Real py): x(px), y(py) { }
00054
00056 Vec2(const Vec2& v): x(v.x), y(v.y) { }
00057
00059 explicit Vec2(const Vec3& v);
00060
00062 explicit Vec2(const Vec4& v);
00063
00065 explicit Vec2(const float v[2]): x(v[0]), y(v[1]) { }
00066
00067
00069 explicit Vec2(const double v[2]): x(v[0]), y(v[1]) { }
00070
00071
00072 Real GetX() const { return x; }
00073 Real GetY() const { return y; }
00074
00075 void SetX(Real d) { x=d; }
00076 void SetY(Real d) { y=d; }
00077
00079 bool operator==(const Vec2& rhs) const
00080 {
00081 return x==rhs.x && y==rhs.y;
00082 }
00083
00085 Real& operator[](std::size_t indx)
00086 {
00087 assert(indx<2);
00088 return (&x)[indx];
00089 }
00090
00092 const Real& operator[](std::size_t indx) const
00093 {
00094 assert(indx<2);
00095 return (&x)[indx];
00096 }
00097
00098 Real& At(size_t indx) {
00099 if (indx>1) {
00100 throw std::out_of_range("index must be smaller than 2");
00101 }
00102 return (&x)[indx];
00103 }
00104
00105 const Real& At(size_t indx) const {
00106 if (indx>1) {
00107 throw std::out_of_range("index must be smaller than 2");
00108 }
00109 return (&x)[indx];
00110 }
00111
00113 Vec2& operator+=(const Vec2& rhs)
00114 {
00115 x+=rhs.x;
00116 y+=rhs.y;
00117 return *this;
00118 }
00119
00120 Vec2& operator+=(Real d)
00121 {
00122 x+=d;
00123 y+=d;
00124 return *this;
00125 }
00126
00128 Vec2& operator-=(const Vec2& rhs)
00129 {
00130 x-=rhs.x;
00131 y-=rhs.y;
00132 return *this;
00133 }
00134
00135 Vec2& operator-=(Real d)
00136 {
00137 x-=d;
00138 y-=d;
00139 return *this;
00140 }
00142 Vec2 operator-() const
00143 {
00144 return Vec2(-x, -y);
00145 }
00146
00148 Vec2& operator*=(Real d)
00149 {
00150 x*=d;
00151 y*=d;
00152 return *this;
00153 }
00154
00156 Vec2& operator/=(Real d)
00157 {
00158 Real one_over_d=Real(1.0)/d;
00159 x*=one_over_d;
00160 y*=one_over_d;
00161 return *this;
00162 }
00163
00164 Real* Data() {return &x;}
00165 const Real* Data() const { return &x; }
00166
00167 Real x;
00168 Real y;
00169 };
00170
00171 inline Vec2 operator/(Real d, const Vec2& v)
00172 {
00173 return Vec2(d/v.x, d/v.y);
00174 }
00175
00176 inline std::ostream& operator<<(std::ostream& os, const Vec2& v)
00177 {
00178 os << "(" << v[0] << "," << v[1] << ")";
00179 return os;
00180 }
00181
00182 }
00183
00184 #include <ost/geom/vec3.hh>
00185 #include <ost/geom/vec4.hh>
00186
00187 namespace geom {
00188
00189 inline Vec2::Vec2(const Vec3& v): x(v.x), y(v.y) { }
00190
00191
00192 inline Vec2::Vec2(const Vec4& v): x(v.x), y(v.y)
00193 {
00194 if (std::fabs(v.w)<1e-10) {
00195 throw DivideByZeroException();
00196 }
00197 x/=v.w;
00198 y/=v.w;
00199 }
00200
00201
00202 typedef std::vector<Vec2> Vec2List;
00203
00204 }
00205
00206 # endif