surface_tri_spline.h
Go to the documentation of this file.
00001 /*
00002  * surface_tri_spline.h
00003  *
00004  *  Created on: 01.10.2012
00005  *      Author: josh
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_; //temporary control point, calculated from the normals
00036       Eigen::Matrix2f _T_; //temporary inverse matrix for barycentric coordinates
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]; //temporary inverse matrix for barycentric coordinates
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> &params, 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 /* SURFACE_TRI_SPLINE_H_ */


cob_3d_mapping_slam
Author(s): Joshua Hampp
autogenerated on Wed Aug 26 2015 11:04:51