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