00001
00002 #ifndef vgl_point_3d_h
00003 #define vgl_point_3d_h
00004 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00005 #pragma interface
00006 #endif
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <vcl_iosfwd.h>
00020 #include <vgl/vgl_fwd.h>
00021 #include <vgl/vgl_vector_3d.h>
00022 #include <vcl_cassert.h>
00023 #include <vcl_vector.h>
00024
00025
00026 template <class Type>
00027 class vgl_point_3d
00028 {
00029
00030 Type x_;
00031 Type y_;
00032 Type z_;
00033
00034 public:
00035
00036
00037
00038
00039 inline vgl_point_3d () {}
00040
00041
00042 inline vgl_point_3d(Type px, Type py, Type pz) : x_(px), y_(py), z_(pz) {}
00043
00044
00045 inline vgl_point_3d (const Type v[3]) : x_(v[0]), y_(v[1]), z_(v[2]) {}
00046
00047
00048 vgl_point_3d (vgl_homg_point_3d<Type> const& p);
00049
00050
00051 vgl_point_3d (vgl_plane_3d<Type> const& pl1,
00052 vgl_plane_3d<Type> const& pl2,
00053 vgl_plane_3d<Type> const& pl3);
00054
00055 #if 0 // The compiler defaults for these are doing what they should do:
00056
00057 inline vgl_point_3d(vgl_point_3d<Type> const& p) : x_(p.x()), y_(p.y()), z_(p.z()) {}
00058
00059 inline ~vgl_point_3d () {}
00060
00061 inline vgl_point_3d<Type>& operator=(vgl_point_3d<Type>const& p)
00062 { set(p.x(),p.y(),p.z()); return *this; }
00063 #endif
00064
00065
00066 bool operator==(const vgl_point_3d<Type> &p) const;
00067 inline bool operator!=(vgl_point_3d<Type>const& p) const { return !operator==(p); }
00068
00069
00070
00071 inline Type &x() {return x_;}
00072 inline Type &y() {return y_;}
00073 inline Type &z() {return z_;}
00074
00075 inline Type x() const {return x_;}
00076 inline Type y() const {return y_;}
00077 inline Type z() const {return z_;}
00078
00079
00080
00081 inline void set(Type px, Type py, Type pz) { x_ = px; y_ = py; z_ = pz; }
00082
00083
00084
00085 inline void set(Type const p[3]) { x_ = p[0]; y_ = p[1]; z_ = p[2]; }
00086
00087
00088
00089 inline bool ideal(Type = (Type)0) const { return false; }
00090
00091
00092
00093
00094
00095
00096 vcl_istream& read(vcl_istream& is);
00097 };
00098
00099
00100
00101
00102
00103 template <class Type>
00104 vcl_ostream& operator<<(vcl_ostream& s, vgl_point_3d<Type> const& p);
00105
00106
00107
00108
00109
00110
00111 template <class Type>
00112 vcl_istream& operator>>(vcl_istream& s, vgl_point_3d<Type>& p);
00113
00114
00115
00116
00117
00118 template <class Type> inline
00119 bool is_ideal(vgl_point_3d<Type> const&, Type = 0) { return false; }
00120
00121
00122
00123 template <class Type> inline
00124 vgl_vector_3d<Type> operator-(vgl_point_3d<Type> const& p1,
00125 vgl_point_3d<Type> const& p2)
00126 { return vgl_vector_3d<Type>(p1.x()-p2.x(), p1.y()-p2.y(), p1.z()-p2.z()); }
00127
00128
00129
00130
00131 template <class Type> inline
00132 vgl_point_3d<Type> operator+(vgl_point_3d<Type> const& p,
00133 vgl_vector_3d<Type> const& v)
00134 { return vgl_point_3d<Type>(p.x()+v.x(), p.y()+v.y(), p.z()+v.z()); }
00135
00136
00137
00138 template <class Type> inline
00139 vgl_point_3d<Type>& operator+=(vgl_point_3d<Type>& p,
00140 vgl_vector_3d<Type> const& v)
00141 { p.set(p.x()+v.x(), p.y()+v.y(), p.z()+v.z()); return p; }
00142
00143
00144
00145 template <class Type> inline
00146 vgl_point_3d<Type> operator-(vgl_point_3d<Type> const& p,
00147 vgl_vector_3d<Type> const& v)
00148 { return p + (-v); }
00149
00150
00151
00152 template <class Type> inline
00153 vgl_point_3d<Type>& operator-=(vgl_point_3d<Type>& p,
00154 vgl_vector_3d<Type> const& v)
00155 { return p += (-v); }
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 template <class T>
00178 double cross_ratio(vgl_point_3d<T>const& p1, vgl_point_3d<T>const& p2,
00179 vgl_point_3d<T>const& p3, vgl_point_3d<T>const& p4);
00180
00181
00182
00183 template <class Type> inline
00184 bool collinear(vgl_point_3d<Type> const& p1,
00185 vgl_point_3d<Type> const& p2,
00186 vgl_point_3d<Type> const& p3)
00187 { return parallel(p1-p2, p1-p3); }
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 template <class Type> inline
00198 double ratio(vgl_point_3d<Type> const& p1,
00199 vgl_point_3d<Type> const& p2,
00200 vgl_point_3d<Type> const& p3)
00201 { return (p3-p1)/(p2-p1); }
00202
00203
00204
00205
00206
00207
00208
00209 template <class Type> inline
00210 vgl_point_3d<Type> midpoint(vgl_point_3d<Type> const& p1,
00211 vgl_point_3d<Type> const& p2,
00212 Type f = (Type)0.5)
00213 {
00214 return vgl_point_3d<Type>((Type)((1-f)*p1.x() + f*p2.x()),
00215 (Type)((1-f)*p1.y() + f*p2.y()),
00216 (Type)((1-f)*p1.z() + f*p2.z()));
00217 }
00218
00219
00220
00221
00222
00223 template <class Type> inline
00224 vgl_point_3d<Type> centre(vgl_point_3d<Type> const& p1,
00225 vgl_point_3d<Type> const& p2)
00226 {
00227 return vgl_point_3d<Type>((p1.x() + p2.x())/2 ,
00228 (p1.y() + p2.y())/2 ,
00229 (p1.z() + p2.z())/2 );
00230 }
00231
00232
00233
00234 template <class Type> inline
00235 vgl_point_3d<Type> centre(vgl_point_3d<Type> const& p1,
00236 vgl_point_3d<Type> const& p2,
00237 vgl_point_3d<Type> const& p3)
00238 {
00239 return vgl_point_3d<Type>((p1.x() + p2.x() + p3.x())/3 ,
00240 (p1.y() + p2.y() + p3.y())/3 ,
00241 (p1.z() + p2.z() + p3.z())/3 );
00242 }
00243
00244
00245
00246 template <class Type> inline
00247 vgl_point_3d<Type> centre(vgl_point_3d<Type> const& p1,
00248 vgl_point_3d<Type> const& p2,
00249 vgl_point_3d<Type> const& p3,
00250 vgl_point_3d<Type> const& p4)
00251 {
00252 return vgl_point_3d<Type>((p1.x() + p2.x() + p3.x() + p4.x())/4 ,
00253 (p1.y() + p2.y() + p3.y() + p4.y())/4 ,
00254 (p1.z() + p2.z() + p3.z() + p4.z())/4 );
00255 }
00256
00257
00258
00259
00260 template <class Type> inline
00261 vgl_point_3d<Type> centre(vcl_vector<vgl_point_3d<Type> > const& v)
00262 {
00263 int n = (int)(v.size());
00264 assert(n>0);
00265 Type x = 0, y = 0, z = 0;
00266 for (int i=0; i<n; ++i) x+=v[i].x(), y+=v[i].y(), z+=v[i].z();
00267 return vgl_point_3d<Type>(x/n,y/n,z/n);
00268 }
00269
00270
00271
00272
00273
00274 template <class Type>
00275 double stddev(vcl_vector<vgl_point_3d<Type> > const& v);
00276
00277
00278
00279 template <class Type>
00280 bool coplanar(vgl_point_3d<Type> const& p1,
00281 vgl_point_3d<Type> const& p2,
00282 vgl_point_3d<Type> const& p3,
00283 vgl_point_3d<Type> const& p4);
00284
00285 #define VGL_POINT_3D_INSTANTIATE(T) extern "please include vgl/vgl_point_3d.txx first"
00286
00287 #endif // vgl_point_3d_h