00001
00002 #ifndef vgl_homg_line_3d_2_points_h_
00003 #define vgl_homg_line_3d_2_points_h_
00004 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00005 #pragma interface
00006 #endif
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <vcl_iosfwd.h>
00019 #include <vgl/vgl_homg_point_3d.h>
00020
00021
00022
00023
00024 template <class Type>
00025 class vgl_homg_line_3d_2_points
00026 {
00027
00028
00029
00030 mutable vgl_homg_point_3d<Type> point_finite_;
00031
00032 mutable vgl_homg_point_3d<Type> point_infinite_;
00033
00034 public:
00035
00036
00037
00038
00039
00040 inline vgl_homg_line_3d_2_points(void)
00041 : point_finite_(0,0,0,1), point_infinite_(1,0,0,0) {}
00042
00043
00044 inline vgl_homg_line_3d_2_points(const vgl_homg_line_3d_2_points<Type> &that)
00045 : point_finite_(that.point_finite_), point_infinite_(that.point_infinite_) {}
00046
00047
00048 inline vgl_homg_line_3d_2_points(vgl_homg_point_3d<Type> const& point_1,
00049 vgl_homg_point_3d<Type> const& point_2)
00050 : point_finite_(point_1), point_infinite_(point_2) {force_point2_infinite();}
00051
00052 #if 0
00053
00054 inline ~vgl_homg_line_3d_2_points() {}
00055 #endif
00056
00057
00058 bool operator==(vgl_homg_line_3d_2_points<Type> const& l) const;
00059 inline bool operator!=(vgl_homg_line_3d_2_points<Type> const& l) const{return !operator==(l);}
00060
00061
00062
00063
00064 inline vgl_homg_point_3d<Type> point_finite() const {return point_finite_;}
00065
00066 inline vgl_homg_point_3d<Type> point_infinite()const{return point_infinite_;}
00067
00068
00069 inline void set(vgl_homg_point_3d<Type> const& p1, vgl_homg_point_3d<Type> const& p2)
00070 { point_finite_ = p1; point_infinite_ = p2; force_point2_infinite(); }
00071
00072
00073
00074
00075 inline bool ideal(Type tol = (Type)0) const { return point_finite_.ideal(tol); }
00076
00077 protected:
00078
00079
00080 void force_point2_infinite(void) const;
00081 };
00082
00083 #define l vgl_homg_line_3d_2_points<Type>
00084
00085
00086
00087 template <class Type>
00088 inline bool is_ideal(l const& line, Type tol=(Type)0)
00089 { return line.ideal(tol); }
00090
00091
00092
00093
00094 template <class Type>
00095 inline bool collinear(l const& l1, vgl_homg_point_3d<Type> const& p)
00096 { return collinear(l1.point_finite(),l1.point_infinite(),p); }
00097
00098
00099
00100 template <class Type>
00101 inline bool coplanar(l const& l1, l const& l2)
00102 { return coplanar(l1.point_finite(),l1.point_infinite(),l2.point_finite(),l2.point_infinite()); }
00103
00104
00105
00106 template <class Type>
00107 inline bool concurrent(l const& l1, l const& l2) { return coplanar(l1,l2); }
00108
00109
00110
00111
00112 template <class Type>
00113 inline bool coplanar(l const& l1, vgl_homg_point_3d<Type> const& p1, vgl_homg_point_3d<Type> const& p2)
00114 { return coplanar(l1.point_finite(),l1.point_infinite(),p1,p2); }
00115
00116
00117
00118 template <class Type>
00119 inline bool coplanar(l const& l1, l const& l2, l const& l3)
00120 {
00121 vgl_homg_point_3d<Type> p = l2.point_finite();
00122 if (collinear(l1,p)) p = l2.point_infinite();
00123 return coplanar(l1,l2) && coplanar(l1,l3) &&
00124 coplanar(l1,p,l3.point_finite()) &&
00125 coplanar(l1,p,l3.point_infinite());
00126 }
00127
00128
00129
00130 template <class Type>
00131 vgl_homg_point_3d<Type> intersection(l const& l1, l const& l2);
00132
00133
00134
00135 template <class Type>
00136 inline bool concurrent(l const& l1, l const& l2, l const& l3)
00137 {
00138 if (!concurrent(l1,l2) || !concurrent(l1,l3) || !concurrent(l2,l3)) return false;
00139 return intersection(l1,l2) == intersection(l1,l3);
00140 }
00141
00142
00143
00144
00145
00146
00147
00148 template <class Type>
00149 vcl_ostream &operator<<(vcl_ostream&s, l const& p);
00150
00151
00152
00153 template <class Type>
00154 vcl_istream &operator>>(vcl_istream &is, l &p);
00155
00156 #undef l
00157
00158 #define VGL_HOMG_LINE_3D_2_POINTS_INSTANTIATE(T) extern "please include vgl/vgl_homg_line_3d_2_points.txx first"
00159
00160 #endif // vgl_homg_line_3d_2_points_h_