00001 #ifndef POINT2_H_IS_INCLUDED
00002 #define POINT2_H_IS_INCLUDED
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <cmath>
00012
00013 #include "mlib/pointlist.H"
00014 #include "std/support.H"
00015 #include "mlib/vec2.H"
00016
00017 namespace mlib {
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 template <class P, class V>
00032 class Point2 {
00033
00034 protected:
00035
00036 double _x, _y;
00037
00038 public:
00039
00040
00041
00042
00043
00044 Point2() : _x(0), _y(0) {}
00045
00046
00047 explicit Point2(double s) : _x(s), _y(s) {}
00048
00049
00050 Point2(double xx, double yy) : _x(xx), _y(yy) {}
00051
00052
00053
00054
00055
00056
00057 typedef double value_type;
00058 static int dim() { return 2; }
00059
00060
00061
00062
00063
00064
00065
00066 const double *data() const { return &_x; }
00067
00068 double operator [](int index) const { return (&_x)[index]; }
00069 double& operator [](int index) { return (&_x)[index]; }
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 P operator +(const P &p) const { return P(_x+p[0],_y+p[1]);}
00080 P operator +(const V &v) const { return P(_x+v[0],_y+v[1]);}
00081 V operator -(const P &p) const { return V(_x-p[0],_y-p[1]);}
00082 P operator -(const V &v) const { return P(_x-v[0],_y-v[1]);}
00083 P operator -() const { return P(-_x, -_y); }
00084
00085 P operator *(double s) const { return P(_x*s, _y*s); }
00086 P operator /(double s) const { return P(_x/s, _y/s); }
00087
00088
00089 P operator *(const P &p) const { return P(_x*p[0],_y*p[1]);}
00090
00091 void operator *=(const P &p) const { _x *= p[0]; _y *= p[1]; }
00092
00093
00094
00095
00096 void operator +=(const P &p) { _x += p[0]; _y += p[1]; }
00097 void operator +=(const V &v) { _x += v[0]; _y += v[1]; }
00098
00099
00100 void operator -=(const P &p) { _x -= p[0]; _y -= p[1]; }
00101 void operator -=(const V &v) { _x -= v[0]; _y -= v[1]; }
00102 void operator *=(double scalar) { _x *= scalar; _y *= scalar; }
00103 void operator /=(double scalar) { _x /= scalar; _y /= scalar; }
00104
00105
00106
00107
00108
00109
00110
00111 bool operator ==(const P &p) const { return _x == p._x && _y == p._y;}
00112
00113 bool operator !=(const P &p) const { return _x != p._x || _y != p._y;}
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 double length () const { return sqrt(_x*_x+_y*_y); }
00124
00125
00126
00127 double length_sqrd () const { return _x*_x+_y*_y; }
00128
00129
00130
00131
00132
00133
00134
00135 double dist_sqrd (const P &p) const { return (_x-p._x) * (_x-p._x) +
00136 (_y-p._y) * (_y-p._y); }
00137
00138 double dist (const P &p) const { return sqrt(dist_sqrd(p)); }
00139
00140
00141
00142
00143
00144
00145
00146 bool is_equal (const P &p, double epsSqrd = epsAbsSqrdMath()) const
00147 { return dist_sqrd(p) <= epsSqrd; }
00148
00149
00150
00151 };
00152
00153 }
00154
00155
00156
00157 namespace mlib {
00158
00159
00160
00161 template <class P, class V>
00162 inline ostream &
00163 operator <<(ostream &os, const Point2<P,V> &p)
00164 {
00165 return os << "< " << p[0] << " " << p[1] << " >";
00166 }
00167
00168
00169
00170
00171 template <class P, class V>
00172 inline double det(const Point2<P,V> &a, const Point2<P,V> &b)
00173 {
00174 return (a[0] * b[1] - a[1] * b[0]);
00175 }
00176
00177 }
00178
00179 namespace mlib {
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 template <class L,class P,class V,class S>
00196 class Point2list : public Pointlist<L,P,V,S> {
00197
00198 public:
00199
00200
00201
00202
00203
00204 Point2list(int m=16) : Pointlist<L,P,V,S>(m) { }
00205
00206
00207 Point2list(const ARRAY<P> &p) : Pointlist<L,P,V,S>(p) { }
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221 double winding_number(const P&) const;
00222
00223
00224
00225
00226
00227
00228
00229
00230 bool intersects_line(const S& line) const;
00231
00232
00233
00234 bool intersects_seg(const S& segment) const;
00235
00236 int contains(const Point2list<L,P,V,S> &list) const;
00237 int contains(const P &p) const;
00238 bool ray_intersect(const P &p,const V &d,P &hit,int loop=0)const;
00239 bool ray_intersect(const P &p,const V &d,L &hit,int loop=0)const;
00240 P ray_intersect(const P &p,const V &d,int k0,int k1) const;
00241
00242
00243
00244
00245
00246
00247
00248
00249 void fix_endpoints (P a, P b);
00250
00251
00252
00253 using Pointlist<L,P,V,S>::num;
00254 using Pointlist<L,P,V,S>::first;
00255 using Pointlist<L,P,V,S>::last;
00256 using Pointlist<L,P,V,S>::pt;
00257 using Pointlist<L,P,V,S>::seg;
00258
00259 };
00260
00261 }
00262
00263 #ifdef JOT_NEEDS_TEMPLATES_IN_H_FILE
00264 #include "point2.C"
00265 #endif
00266 #endif // POINT2_H_IS_INCLUDED
00267
00268