00001
00002
00003
00004
00005
00006
00007
00008 #ifndef SURFACE_H_
00009 #define SURFACE_H_
00010
00011 #include "form.h"
00012 #include "polygon_merger.h"
00013 #include <unsupported/Eigen/NonLinearOptimization>
00014
00015 namespace Slam_Surface
00016 {
00017
00018 class Surface
00019 {
00020 public:
00021
00022 struct SWINDOW {
00023 float min_x, max_x, min_y, max_y;
00024 };
00025
00026
00027 virtual ~Surface() {}
00028
00030 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) = 0;
00031
00033 virtual int getSurfaceType() const = 0;
00034 virtual const char *getName() const = 0;
00035
00037 virtual Eigen::Vector2f nextPoint(const Eigen::Vector3f &v) const = 0;
00038
00040 virtual Eigen::Vector3f project2world(const Eigen::Vector2f &pt) const = 0;
00041
00043 virtual Eigen::Vector3f normalAt(const Eigen::Vector2f &v) const = 0;
00044
00046 virtual float merge(const Surface &o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o) = 0;
00047
00049 virtual void transform(const Eigen::Matrix3f &rot, const Eigen::Vector3f &tr) = 0;
00050
00052 virtual bool fitsCurvature(const Surface &o, const float thr) const = 0;
00053
00055 virtual float area() const = 0;
00056 };
00057
00058 class PolynomialSurface : public Surface
00059 {
00060
00061 Eigen::Matrix3f param_;
00062 Eigen::Matrix<float,3,2> proj2plane_;
00063
00064
00065 struct MyFunctor
00066 {
00067 const float a,b,c, d,e;
00068 const float x0,y0,z0;
00069
00070 int operator()(const Eigen::VectorXf &x, Eigen::VectorXf &fvec) const
00071 {
00072
00073 fvec(0) = std::pow((-z0+b*x(1)*x(1)+c*x(0)*x(1)+a*x(0)*x(0)+d*x(0)+e*x(1)),2)+std::pow(x(1)-y0,2)+std::pow(x(0)-x0,2);
00074 fvec(1) = 0;
00075
00076
00077
00078
00079 return 0;
00080 }
00081
00082 int df(const Eigen::VectorXf &x, Eigen::MatrixXf &fjac) const
00083 {
00084
00085
00086 fjac(0,0) = 2*(c*x(1)+2*a*x(0)+d)*(-z0+b*x(1)*x(1)+c*x(0)*x(1)+a*x(0)*x(0)+d*x(0)+e*x(1))+2*(x(0)-x0);
00087 fjac(0,1) = 2*(2*b*x(1)+c*x(0)+e)*(-z0+b*x(1)*x(1)+c*x(0)*x(1)+a*x(0)*x(0)+d*x(0)+e*x(1))+2*(x(1)-y0);
00088 fjac(1,0) = fjac(1,1) = 0;
00089
00090
00091
00092
00093 return 0;
00094 }
00095
00096 int inputs() const { return 2; }
00097 int values() const { return 2; }
00098 };
00099
00100 Eigen::Vector2f _nextPoint(const Eigen::Vector3f &v, Eigen::Vector3f p, const int depth=0) const;
00101
00102 public:
00103
00105 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);
00106
00108 virtual int getSurfaceType() const {return 1;}
00109 virtual const char *getName() const {return "polynomial surface";}
00110
00112 virtual Eigen::Vector2f nextPoint(const Eigen::Vector3f &v) const ;
00113
00115 virtual Eigen::Vector3f project2world(const Eigen::Vector2f &pt) const ;
00116
00118 virtual Eigen::Vector3f normalAt(const Eigen::Vector2f &v) const ;
00119
00121 virtual Eigen::Vector3f normalAt2(const Eigen::Vector2f &v) const ;
00122
00124 virtual float merge(const Surface &o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o) {return 0.f;}
00125
00127 virtual void transform(const Eigen::Matrix3f &rot, const Eigen::Vector3f &tr);
00128
00130 virtual bool fitsCurvature(const Surface &o, const float thr) const;
00131
00133 virtual float area() const {return 1.f;}
00134 };
00135
00136 #include "impl/surface.hpp"
00137
00138 }
00139
00140 #include "surface_nurbs.h"
00141 #include "surface_tri_spline.h"
00142
00143
00144 #endif