ApproxCurve.h

00001 //===========================================================================
00002 // GoTools - SINTEF Geometry Tools version 1.1
00003 //
00004 // GoTools module: CORE
00005 //
00006 // Copyright (C) 2000-2007 SINTEF ICT, Applied Mathematics, Norway.
00007 //
00008 // This program is free software; you can redistribute it and/or          
00009 // modify it under the terms of the GNU General Public License            
00010 // as published by the Free Software Foundation version 2 of the License. 
00011 //
00012 // This program is distributed in the hope that it will be useful,        
00013 // but WITHOUT ANY WARRANTY; without even the implied warranty of         
00014 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          
00015 // GNU General Public License for more details.                           
00016 //
00017 // You should have received a copy of the GNU General Public License      
00018 // along with this program; if not, write to the Free Software            
00019 // Foundation, Inc.,                                                      
00020 // 59 Temple Place - Suite 330,                                           
00021 // Boston, MA  02111-1307, USA.                                           
00022 //
00023 // Contact information: E-mail: tor.dokken@sintef.no                      
00024 // SINTEF ICT, Department of Applied Mathematics,                         
00025 // P.O. Box 124 Blindern,                                                 
00026 // 0314 Oslo, Norway.                                                     
00027 //
00028 // Other licenses are also available for this software, notably licenses
00029 // for:
00030 // - Building commercial software.                                        
00031 // - Building software whose source code you wish to keep private.        
00032 //===========================================================================
00033 #ifndef _GOAPPROXCURVE_H_
00034 #define _GOAPPROXCURVE_H_
00035 
00036 //   -----------------------------------------------------------------------
00037 //      Interface file for class ApproxCurve
00038 //   -----------------------------------------------------------------------
00039 //
00040 //       Approximate a set of points by a B-spline curve to
00041 //       satisfy a given accuracy
00042 //
00043 //       Implementation of the member functions are given in the
00044 //       following files:
00045 //
00046 //          1. ApproxCurve.C
00047 //
00048 //   -----------------------------------------------------------------------
00049 //    Written by: Vibeke Skytt                           04-02
00050 //   -----------------------------------------------------------------------
00051 
00052 #include "SplineCurve.h"
00053 #include <vector>
00054 #include "SmoothCurve.h"
00055 
00056 namespace Go
00057 {
00060 
00063 class ApproxCurve
00064 {
00065 public:
00077     ApproxCurve(const std::vector<double>& points, 
00078                   const std::vector<double>& parvals,
00079                   int dim, double aepsge);
00080 
00093     ApproxCurve(const std::vector<double>& points, 
00094                   const std::vector<double>& parvals,
00095                   int dim, double aepsge, int in, int ik);
00096 
00108     ApproxCurve(const std::vector<double>& points, 
00109                   const std::vector<double>& parvals, int dim,
00110                   double aepsge, int in, int ik,
00111                   std::vector<double>& knots);
00112 
00114     ~ApproxCurve();
00115 
00118     void setSmooth(double w);
00119 
00120 
00122     void unsetSmooth();
00123 
00126 
00135     void setEndPoints(const std::vector<Point>& start_point, 
00136                       const std::vector<Point>& end_point);
00137 
00147     boost::shared_ptr<SplineCurve> getApproxCurve(double& maxdist, 
00148                                                   double& avdist,
00149                                                   int max_iter = 5);
00150 protected:
00152     ApproxCurve();
00153 
00154 private:
00155   boost::shared_ptr<SplineCurve> curr_crv_;
00156   double maxdist_;
00157   double avdist_;
00158   double aepsge_;
00159   double smoothweight_;
00160   double smoothfac_;
00161 
00162   int dim_;
00163   std::vector<double> points_;
00164   std::vector<double> parvals_;
00165   std::vector<Point> start_pt_; // Pt, der. May be empty.
00166   std::vector<Point> end_pt_; // Pt, der. May be empty.
00167 
00169   void makeInitCurve();
00170 
00171   void makeInitCurve(int in, int ik, std::vector<double> knots);
00172 
00173   void makeInitCurve(int in, int ik);
00174 
00177   void adjustSmoothWeight();
00178 
00180   void makeSmoothCurve();
00181 
00183   void checkAccuracy(std::vector<double>& newknots, int uniform=1);
00184 
00186   int doApprox(int max_iter);
00187 
00188   void getConstraints(std::vector<sideConstraint>& pt_constraints,
00189                       std::vector<sideConstraint>& tangent_constraints);
00190 
00191 };
00193 }
00194 
00195 #endif
00196 
00197 

Generated on Mon Jun 11 14:48:18 2007 for GoTools Core Library by  doxygen 1.5.1