00001
00002
00003
00004
00005
00006
00007
00008 #ifndef SURFACE_TRI_SPLINE_H_
00009 #define SURFACE_TRI_SPLINE_H_
00010
00011 #include <cob_3d_mapping_slam/trispline/trispline.h>
00012 #include <cob_3d_mapping_slam/trispline/topology.h>
00013
00014
00015 namespace Slam_Surface
00016 {
00026 class SurfaceTriSpline : public Surface, public cob_3d_marker::MarkerCreator
00027 {
00028 #if 1
00029 ParametricSurface::Topology top_;
00030 #else
00031 public:
00032 struct TRIANGLE {
00033 size_t i_[3];
00034
00035 Eigen::Vector3f add_cross_;
00036 Eigen::Matrix2f _T_;
00037
00038 Eigen::Vector3f I_[3];
00039 Eigen::Vector3f nI_[3];
00040
00041 Eigen::Vector3f pS_, nS_;
00042 Eigen::Vector3f pb_[3];
00043 Eigen::Matrix2f _Tb_[3];
00044
00045 TRIANGLE(const size_t i1, const size_t i2, const size_t i3) {
00046 i_[0] = i1;
00047 i_[1] = i2;
00048 i_[2] = i3;
00049 }
00050
00051 bool update1(const std::vector<Eigen::Vector3f> &pts, const std::vector<Eigen::Vector3f> &normals, const std::vector<Eigen::Vector2f> &uv_pts,
00052 const Surface *surf=NULL);
00053
00054 bool update2(const std::vector<Eigen::Vector3f> &pts, const std::vector<Eigen::Vector3f> &normals, const std::vector<Eigen::Vector2f> &uv_pts,
00055 const Surface *surf=NULL);
00056
00057 void getWeight(const Eigen::Vector3f &pt, Eigen::Matrix3f &w) const;
00058 void getWeightD1(const Eigen::Vector3f &pt, Eigen::Matrix3f &w) const;
00059 Eigen::Vector3f triNurbsBasis(const Eigen::Vector3f &pt, const Eigen::Vector3f &p1, const Eigen::Vector3f &p2, const Eigen::Vector3f &p3) const;
00060 Eigen::Vector3f project2world(const Eigen::Vector2f &pt, const std::vector<Eigen::Vector3f> &pts, const std::vector<Eigen::Vector2f> &uv_pts) const;
00061 Eigen::Vector3f normalAt(const Eigen::Vector2f &pt, const std::vector<Eigen::Vector3f> &pts, const std::vector<Eigen::Vector2f> &uv_pts) const;
00062 void transform(const Eigen::Matrix3f &rot, const Eigen::Vector3f &tr) {add_cross_=rot*add_cross_;}
00063
00064 bool isIn(const Eigen::Vector2f &pt, const std::vector<Eigen::Vector2f> &uv_pts) const;
00065 };
00066
00067 std::vector<Eigen::Vector3f> pts_, normals_;
00068 std::vector<Eigen::Vector2f> uv_pts_;
00069 std::vector<TRIANGLE> triangles_;
00070
00071 static int getLineID(const size_t i1, const size_t i2) {return (std::min(i1,i2)<<16)|(std::max(i1,i2));}
00072
00073 void addTriangle(const size_t i1, const size_t i2, const size_t i3, const Surface *surf=NULL);
00074 void addPoint(
00075 const Eigen::Vector3f &p1, const Eigen::Vector3f &n1, const Eigen::Vector2f &uv1
00076 );
00077
00078 std::vector<TRIANGLE> &getTriangles() {return triangles_;}
00079 #endif
00080 public:
00081
00082 SurfaceTriSpline(): top_(0.025f) {}
00083
00085 virtual void init(const boost::array<float, 6> ¶ms, const float min_x, const float max_x, const float min_y, const float max_y, const float weight);
00086 virtual void init(const PolynomialSurface *params, const float min_x, const float max_x, const float min_y, const float max_y, const float weight);
00087 virtual void init(const PolynomialSurface *params, const std::vector<Eigen::Vector3f> &pts, const float weight);
00088
00090 virtual int getSurfaceType() const {return 3;}
00091 virtual const char *getName() const {return "Triangular B-Spline";}
00092
00094 virtual Eigen::Vector2f nextPoint(const Eigen::Vector3f &v) const;
00095
00097 virtual Eigen::Vector3f project2world(const Eigen::Vector2f &pt) const ;
00098
00100 virtual Eigen::Vector3f normalAt(const Eigen::Vector2f &v) const ;
00101
00103 virtual float merge(const Surface &o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o);
00104 virtual float _merge(SurfaceNurbs o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o) {ROS_ASSERT(0);return 0;}
00105
00107 virtual void transform(const Eigen::Matrix3f &rot, const Eigen::Vector3f &tr);
00108
00110 virtual bool fitsCurvature(const Surface &o, const float thr) const {ROS_ASSERT(0);return true;}
00111
00113 virtual float area() const {ROS_ASSERT(0);return 1;}
00114
00115 void print() const {top_.print();}
00116
00117 void marker(cob_3d_marker::MarkerContainer &mc) const {
00118 if(mc.get(0))
00119 top_.add( *(cob_3d_marker::MarkerList_Triangles*)mc.get(0).get() );
00120
00121 if(mc.get(2))
00122 top_.add( *(cob_3d_marker::MarkerList_Line*)mc.get(2).get() );
00123 if(mc.get(3))
00124 top_.add( *(cob_3d_marker::MarkerList_Arrow*)mc.get(3).get() );
00125 if(mc.get(4))
00126 top_.add( *(cob_3d_marker::MarkerList_Text*)mc.get(4).get() );
00127 }
00128 };
00129
00130 #include "impl/surface_tri_spline.hpp"
00131 }
00132
00133
00134
00135 #endif