Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef NURBS_FITTING_CURVE_2D_H
00039 #define NURBS_FITTING_CURVE_2D_H
00040
00041 #include <pcl/pcl_exports.h>
00042 #include <pcl/surface/on_nurbs/nurbs_tools.h>
00043 #include <pcl/surface/on_nurbs/nurbs_data.h>
00044 #include <pcl/surface/on_nurbs/nurbs_solve.h>
00045
00046 namespace pcl
00047 {
00048 namespace on_nurbs
00049 {
00050
00056 class PCL_EXPORTS FittingCurve2d
00057 {
00058 public:
00060 struct Parameter
00061 {
00062 double smoothness;
00063 double rScale;
00064 Parameter () :
00065 smoothness (0.1), rScale (1.0)
00066 {
00067 }
00068 };
00069
00070 struct FitParameter
00071 {
00072 pcl::on_nurbs::FittingCurve2d::Parameter param;
00073 unsigned refinement;
00074 double addCPsAccuracy;
00075 unsigned addCPsIteration;
00076 unsigned maxCPs;
00077
00078 double meanDeltaCPS;
00079 };
00080
00081 ON_TextLog m_out;
00082 ON_NurbsCurve m_nurbs;
00083 NurbsDataCurve2d *m_data;
00084
00089 FittingCurve2d (int order, NurbsDataCurve2d *data);
00090
00095 FittingCurve2d (NurbsDataCurve2d *data, const ON_NurbsCurve &nc);
00096
00102 static int
00103 findElement (double xi, const std::vector<double> &elements);
00104
00106 void
00107 refine ();
00108
00112 void
00113 refine (double xi);
00114
00119 virtual void
00120 assemble (const Parameter ¶meter);
00121
00122 virtual void
00123 addControlPointConstraint (int i, const Eigen::Vector2d &f, double weight);
00124
00128 virtual double
00129 solve (double damp = 1.0);
00130
00134 virtual double
00135 updateCurve (double damp);
00136
00142 static ON_NurbsCurve
00143 initNurbsCPS (int order, const vector_vec2d &cps);
00144
00151 static ON_NurbsCurve
00152 initNurbsPCA (int order, NurbsDataCurve2d *data, int ncps=0);
00153
00157 static void
00158 reverse(ON_NurbsCurve &curve);
00159
00161 static std::vector<double>
00162 getElementVector (const ON_NurbsCurve &nurbs);
00163
00176 static double
00177 inverseMapping (const ON_NurbsCurve &nurbs, const Eigen::Vector2d &pt, const double &hint, double &error,
00178 Eigen::Vector2d &p, Eigen::Vector2d &t, double rScale, int maxSteps = 100,
00179 double accuracy = 1e-6, bool quiet = true);
00180
00181 static double
00182 inverseMappingO2 (const ON_NurbsCurve &nurbs, const Eigen::Vector2d &pt, double &error, Eigen::Vector2d &p,
00183 Eigen::Vector2d &t);
00184
00190 static double
00191 findClosestElementMidPoint (const ON_NurbsCurve &nurbs, const Eigen::Vector2d &pt);
00192 static double
00193 findClosestElementMidPoint (const ON_NurbsCurve &nurbs, const Eigen::Vector2d &pt, double hint);
00194
00196 inline void
00197 setQuiet (bool val)
00198 {
00199 m_quiet = val;
00200 m_solver.setQuiet (val);
00201 }
00202
00204 inline void
00205 setInverseParams (int max_steps = 200, double accuracy = 1e-6)
00206 {
00207 in_max_steps = max_steps;
00208 in_accuracy = accuracy;
00209 }
00210
00211 protected:
00213 virtual void
00214 addPointConstraint (const double ¶m, const Eigen::Vector2d &point, double weight, unsigned &row);
00215
00217 virtual void
00218 addCageRegularisation (double weight, unsigned &row);
00219
00221 virtual void
00222 assembleInterior (double wInt, double rScale, unsigned &row);
00223
00224 NurbsSolve m_solver;
00225 bool m_quiet;
00226 int in_max_steps;
00227 double in_accuracy;
00228
00229 };
00230 }
00231 }
00232
00233 #endif