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 vgl_vector_3d<Type> direction() const{
00070 vgl_vector_3d<Type> dir(point_infinite_.x(), point_infinite_.y(),
00071 point_infinite_.z());
00072 return dir/static_cast<Type>(dir.length());}
00073
00074 inline void set(vgl_homg_point_3d<Type> const& p1, vgl_homg_point_3d<Type> const& p2)
00075 { point_finite_ = p1; point_infinite_ = p2; force_point2_infinite(); }
00076
00077
00078
00079
00080 inline bool ideal(Type tol = (Type)0) const { return point_finite_.ideal(tol); }
00081
00082 protected:
00083
00084
00085 void force_point2_infinite(void) const;
00086 };
00087
00088 #define l vgl_homg_line_3d_2_points<Type>
00089
00090
00091
00092 template <class Type>
00093 inline bool is_ideal(l const& line, Type tol=(Type)0)
00094 { return line.ideal(tol); }
00095
00096
00097
00098
00099 template <class Type>
00100 inline bool collinear(l const& l1, vgl_homg_point_3d<Type> const& p)
00101 { return collinear(l1.point_finite(),l1.point_infinite(),p); }
00102
00103
00104
00105 template <class Type>
00106 inline bool coplanar(l const& l1, l const& l2)
00107 { return coplanar(l1.point_finite(),l1.point_infinite(),l2.point_finite(),l2.point_infinite()); }
00108
00109
00110
00111 template <class Type>
00112 inline bool concurrent(l const& l1, l const& l2) { return coplanar(l1,l2); }
00113
00114
00115
00116
00117 template <class Type>
00118 inline bool coplanar(l const& l1, vgl_homg_point_3d<Type> const& p1, vgl_homg_point_3d<Type> const& p2)
00119 { return coplanar(l1.point_finite(),l1.point_infinite(),p1,p2); }
00120
00121
00122
00123 template <class Type>
00124 inline bool coplanar(l const& l1, l const& l2, l const& l3)
00125 {
00126 vgl_homg_point_3d<Type> p = l2.point_finite();
00127 if (collinear(l1,p)) p = l2.point_infinite();
00128 return coplanar(l1,l2) && coplanar(l1,l3) &&
00129 coplanar(l1,p,l3.point_finite()) &&
00130 coplanar(l1,p,l3.point_infinite());
00131 }
00132
00133
00134
00135 template <class Type>
00136 vgl_homg_point_3d<Type> intersection(l const& l1, l const& l2);
00137
00138
00139
00140 template <class Type>
00141 inline bool concurrent(l const& l1, l const& l2, l const& l3)
00142 {
00143 if (!concurrent(l1,l2) || !concurrent(l1,l3) || !concurrent(l2,l3)) return false;
00144 return intersection(l1,l2) == intersection(l1,l3);
00145 }
00146
00147
00148
00149
00150
00151
00152
00153 template <class Type>
00154 vcl_ostream &operator<<(vcl_ostream&s, l const& p);
00155
00156
00157
00158 template <class Type>
00159 vcl_istream &operator>>(vcl_istream &is, l &p);
00160
00161 #undef l
00162
00163 #define VGL_HOMG_LINE_3D_2_POINTS_INSTANTIATE(T) extern "please include vgl/vgl_homg_line_3d_2_points.txx first"
00164
00165 #endif // vgl_homg_line_3d_2_points_h_