00001
00002
00003
00004
00005
00006
00007
00008 #ifndef SURFACE_NURBS_H_
00009 #define SURFACE_NURBS_H_
00010
00011 #include <nurbsS_sp.h>
00012 #include <pcl/common/pca.h>
00013
00014 namespace Slam_Surface
00015 {
00016 class SurfaceNurbs : public Surface
00017 {
00018 typedef PlNurbsSurfaceSPf SURFACE;
00019 SURFACE nurbs_;
00020 MatrixRTf weights_;
00021
00022
00023 float c_x_m_, c_x_o_, c_y_m_, c_y_o_;
00024
00025 virtual Eigen::Vector2f correct(const Eigen::Vector2f &v) const ;
00026 virtual Eigen::Vector3f _normalAt(const Eigen::Vector2f &v) const ;
00027
00028
00029
00030 struct Functor {
00031 PLib::Point3Df _pt_;
00032 const SURFACE &nurbs_;
00033
00034 Functor(const SURFACE &nurbs):nurbs_(nurbs)
00035 {}
00036
00037 int operator()(const Eigen::VectorXf &x, Eigen::VectorXf &fvec) const
00038 {
00039
00040 fvec(0) = norm2(_pt_ - nurbs_.pointAt(x(0),x(1)));
00041 fvec(1) = 0;
00042
00043 std::cout<<"x\n"<<x<<"\n";
00044 std::cout<<"dist "<<fvec(0)<<"\n";
00045
00046
00047 return 0;
00048 }
00049
00050 int df(const Eigen::VectorXf &x, Eigen::MatrixXf &fjac) const
00051 {
00052
00053 Matrix_Point3Df ders;
00054 nurbs_.deriveAt(x(0),x(1), 1, ders);
00055 PLib::Point3Df p = nurbs_.pointAt(x(0),x(1));
00056 fjac(0,0) = dot(ders(1,0),(_pt_-p));
00057 fjac(0,1) = dot(ders(0,1),(_pt_-p));
00058 fjac(1,0) = fjac(1,1) = 0;
00059
00060 std::cout<<"ders\n"<<ders<<"\n";
00061 std::cout<<"fjac\n"<<fjac<<"\n";
00062 return 0;
00063 }
00064
00065 int inputs() const { return 2; }
00066 int values() const { return 2; }
00067 };
00068
00069 int myprojectOn(const SURFACE &s, const Eigen::Vector3f &p, float &u, float &v, const int maxIt) const;
00070
00072 Eigen::Vector2f _nextPoint(const Eigen::Vector3f &v) const ;
00073
00074
00075 struct PT_GRID {
00076 int w,h;
00077 std::vector<Eigen::Vector3f> grid;
00078
00079 PT_GRID(const SURFACE &s, const int sampling) {
00080 w = s.ctrlPnts().rows()*sampling;
00081 h = s.ctrlPnts().cols()*sampling;
00082 grid.resize(w*h);
00083 }
00084
00085 Eigen::Vector3f &operator()(int i, int j) {return grid[i*h+j];}
00086 };
00087 virtual float _merge2(SurfaceNurbs o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o);
00088
00089 public:
00090
00092 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);
00093
00095 virtual int getSurfaceType() const {return 2;}
00096 virtual const char *getName() const {return "NURBS";}
00097
00099 virtual Eigen::Vector2f nextPoint(const Eigen::Vector3f &v) const ;
00100
00102 virtual Eigen::Vector3f project2world(const Eigen::Vector2f &pt) const ;
00103 virtual Eigen::Vector3f _project2world(const Eigen::Vector2f &pt) const ;
00104
00106 virtual Eigen::Vector3f normalAt(const Eigen::Vector2f &v) const ;
00107
00109 virtual float merge(const Surface &o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o);
00110 virtual float _merge(SurfaceNurbs o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o);
00111
00113 virtual void transform(const Eigen::Matrix3f &rot, const Eigen::Vector3f &tr);
00114
00116 virtual bool fitsCurvature(const Surface &o, const float thr) const;
00117
00118 const SURFACE &getNurbs() const {return nurbs_;}
00119
00121 virtual float area() const {return nurbs_.area(0.0001f,20);}
00122 };
00123
00124 #include "impl/surface_nurbs.hpp"
00125 }
00126
00127 #endif