⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 numeric_root_stack.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 2005  Stanford University (USA).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public License as// published by the Free Software Foundation; version 2.1 of the License.// See the file LICENSE.LGPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/Kinetic_data_structures/include/CGAL/Polynomial/Numeric_root_stack.h $// $Id: Numeric_root_stack.h 33689 2006-08-24 15:54:13Z drussel $// //// Author(s)     : Daniel Russel <drussel@alumni.princeton.edu>#ifndef CGAL_POLYNOMIAL_NUMERIC_ROOT_STACK_H#define CGAL_POLYNOMIAL_NUMERIC_ROOT_STACK_H#include <CGAL/Polynomial/basic.h>#include <CGAL/Polynomial/internal/numeric_solvers.h>#include <CGAL/Polynomial/Polynomial.h>#include <CGAL/Polynomial/internal/Double_with_infinity.h>#include <iterator>#ifdef CGAL_USE_GSL#include <CGAL/Polynomial/internal/GSL_numeric_solver.h>#endifCGAL_POLYNOMIAL_BEGIN_INTERNAL_NAMESPACEtemplate <bool HINF=std::numeric_limits<double>::has_infinity>  struct Numeric_pick_root {    typedef double Root;    //typedef internal::Double_with_infinity Root;  };  template <>  struct Numeric_pick_root<false> {    typedef internal::Double_with_infinity Root;  };CGAL_POLYNOMIAL_END_INTERNAL_NAMESPACECGAL_POLYNOMIAL_BEGIN_NAMESPACE#ifdef CGAL_USE_GSL#define CGAL_DEFAULT_NUMERIC_SOLVER CGAL::POLYNOMIAL::internal::GSL_numeric_solver#define CGAL_DEFAULT_CLEANED_NUMERIC_SOLVER CGAL::POLYNOMIAL::internal::GSL_cleaned_numeric_solver#else#define CGAL_DEFAULT_NUMERIC_SOLVER CGAL::POLYNOMIAL::internal::Turkowski_numeric_solver#define CGAL_DEFAULT_CLEANED_NUMERIC_SOLVER CGAL::POLYNOMIAL::internal::Turkowski_cleaned_numeric_solver#endiftemplate <class Solver_traits, class Numeric_solver=CGAL_DEFAULT_NUMERIC_SOLVER >class Numeric_root_stack{public:    typedef internal::Numeric_pick_root<>::Root Root;protected:  /* All this mess is to handle when roots are not doubles and when the coefficients are not doubles   */  template <class Rt>  void initialize_2(const double *b, const double *e, double lb, double ub, std::vector<Rt> &roots) {    std::vector<double> lroots;    ns_(b, e, lb, ub, lroots);    roots.insert(roots.end(), lroots.begin(), lroots.end());  }  void initialize_2(const double *b, const double *e, double lb, double ub, std::vector<double> &roots) {    ns_(b, e, lb, ub, roots);  }  template <class Fn>  void initialize(const Fn &f, Root lb, Root ub) {    std::vector<double> c(f.degree()+1);    for (unsigned int i=0; i<= f.degree(); ++i) {      c[i]= to_double(f[i]);    }    initialize_2(&*c.begin(), &*c.begin()+ f.degree()+1, 		 static_cast<double>(lb), static_cast<double>(ub),		 roots_);    /*if (CLEAN) {      polynomial_compute_cleaned_roots(&*c.begin(), &*c.begin()+ f.degree()+1, lb, ub, roots_);      } else {      polynomial_compute_roots(&*c.begin(), &*c.begin()+ f.degree()+1, lb, ub, roots_);      }*/  }  void initialize(const Polynomial<double> &f, Root lb, Root ub) {    const double *p0= &*f.begin();    initialize_2(p0, p0+ f.degree()+1, static_cast<double>(lb), static_cast<double>(ub), roots_);    /*if (CLEAN) {      polynomial_compute_cleaned_roots(&*f.begin(), &*f.begin()+ f.degree()+1, lb, ub, roots_);      } else {      polynomial_compute_roots(&*f.begin(), &*f.begin()+ f.degree()+1, lb, ub, roots_);      }*/  }public:  typedef typename Solver_traits::Function Function;  typedef Solver_traits Traits;  Numeric_root_stack(const typename Solver_traits::Function &f, Root lb, Root ub, const Solver_traits&) {    //std::cout << "Solving " << f << " from " << lb << " to " << ub;    initialize(f, lb, ub);	     /*if (!roots_.empty()) std::cout << " got " << roots_.back() << std::endl;      else std::cout << std::endl;*/#if 0    for (unsigned int i=1; i < roots_.size();  ++i) {      if (roots_[i]>  roots_[i-1]){	std::cerr << "ERROR: roots out of order ";	std::copy(roots_.begin(), roots_.end(), std::ostream_iterator<double>(std::cerr, " "));	std::cerr << " for " << f << " from " << lb << " to " << ub << std::endl;	roots_.clear();	initialize(f,lb, ub);      }    }#endif    //CGAL_Polynomial_postcondition(roots_[i] <= roots_[i-1]);  }  Numeric_root_stack(){};  void pop() {    CGAL_Polynomial_precondition(!roots_.empty());    roots_.pop_back();  }  const Root& top() const  {    CGAL_Polynomial_precondition(!roots_.empty());    return roots_.back();  }  bool empty() const  {    return roots_.empty();  }protected:  Numeric_solver ns_;  std::vector<Root> roots_;};CGAL_POLYNOMIAL_END_NAMESPACE#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -