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

📄 core_polynomial.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// 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/internal/CORE_polynomial.h $// $Id: CORE_polynomial.h 37060 2007-03-13 18:10:39Z reichel $ $Date: 2007-03-13 19:10:39 +0100 (Tue, 13 Mar 2007) $// //// Author(s)     : Daniel Russel <drussel@alumni.princeton.edu>#ifndef CGAL_POLYNOMIAL_POLYNOMIAL_POLYCORE_KERNEL_H#define CGAL_POLYNOMIAL_POLYNOMIAL_POLYCORE_KERNEL_H#include <CGAL/Polynomial/basic.h>#include <CGAL/CORE_Expr.h>#include <CGAL/CORE/poly/Poly.h>#include <CGAL/CORE_BigFloat.h>#include <CGAL/CORE_Expr.h>#include <CGAL/CORE_BigRat.h>CGAL_POLYNOMIAL_BEGIN_INTERNAL_NAMESPACEstruct CORE_polynomial {  typedef CORE::Polynomial<CORE::BigRat> P;  typedef CORE::BigRat NT;  template <class It>  CORE_polynomial(It b, It e): p_(std::vector<NT>(b,e)) {    /*for (int i=0; i<= degree(); ++i){      CGAL_precondition(P::getCoeffi(i).err()==0);      }*/  }  CORE_polynomial(){  }  CORE_polynomial(NT n): p_(0, &n){  }  CORE_polynomial(int d): p_(d){}  CORE_polynomial(const P&p): p_(p){    /*for (int i=0; i<= degree(); ++i){      CGAL_precondition(p_.getCoeffi(i).err()==0);      }*/  }  NT operator[](unsigned int i) const {    return p_.getCoeffi(i);  }  /*NT &operator[](unsigned int i) {    return p_.getCoeffi(i);    }*/  NT operator()(const NT &nt) const {    return p_.eval(nt);  }  bool operator==(const CORE_polynomial&o ) const {    if (p_.getTrueDegree() != o.p_.getTrueDegree()) {      return false;    } else {      for (int i=0; i<= p_.getTrueDegree(); ++i) {	if (operator[](i) != o[i]) return false;      }    }    return true;  }    void contract()  {    p_.contract();  }  bool operator!=(const CORE_polynomial&o ) const {    return !operator==(o);  }  CORE_polynomial operator/(const NT &nt) const {    P ret(p_.getTrueDegree());    for (int i=0; i<= degree(); ++i){      ret.setCoeff(i, operator[](i)/nt);      //CGAL_assertion(rr);    }    return CORE_polynomial(ret);  }  CORE_polynomial operator-() const {    P ret(p_.getTrueDegree());    for (int i=0; i<= degree(); ++i){      ret.setCoeff(i, -operator[](i));      //CGAL_assertion(setr);    }    return CORE_polynomial(ret);  }  CORE_polynomial operator-(const CORE_polynomial &o) const {    CORE_polynomial r(core_polynomial());    r.p_-=o.core_polynomial();    return r;  }  CORE_polynomial operator+(const CORE_polynomial &o) const {    CORE_polynomial r(core_polynomial());    r.p_+=o.core_polynomial();    return r;  }  CORE_polynomial operator*(const CORE_polynomial &o) const {    CORE_polynomial r(core_polynomial());    r.p_*=o.core_polynomial();    return r;  }  CORE::Expr operator()(const CORE::Expr &nt) const {    return p_.eval(nt);  }  int degree() const {    return p_.getTrueDegree();  }  const P &core_polynomial() const {    return p_;  }  //! write it in maple format  template <class C, class T>  void write(std::basic_ostream<C,T> &out) const  {    std::basic_ostringstream<C,T> s;    s.flags(out.flags());    s.imbue(out.getloc());    s.precision(12);    if (degree()<0) {      s << "0";    }    else {      for (int i=0; i<= degree(); ++i) {	if (i==0) {	  if (p_.getCoeffi(i) != 0) s << p_.getCoeffi(i);	}	else {	  if ( p_.getCoeffi(i) != 0 ) {	    if (p_.getCoeffi(i) >0) s << "+";	    s << p_.getCoeffi(i) << "*t";	    if (i != 1) {	      s << "^" << i;	    }	  }	}      }    }    out << s.str();  } //! Read very stylized input  template <class charT, class Traits>  void read(std::basic_istream<charT, Traits> &in) {    std::vector<NT> coefs;    bool pos=(in.peek()!='-');    if (in.peek() == '+' || in.peek() == '-') {      char c;      in >> c;    }    char v='\0';    while (true) {      char vc, t;      NT coef;      // eat      in >> coef;      //coef.makeExact();      if (!in.good()) return;      unsigned int pow;      char p= in.peek();      if (in.peek() =='*') {	in >> t >> vc;	if (t != '*') {	  in.setstate(std::ios_base::failbit);	  return;	  //return in;	}	if ( !(v=='\0' || v== vc)) {	  in.setstate(std::ios_base::failbit);	  return;	  //return in;	}	v=vc;	p=in.peek();	if (in.peek() =='^') {	  char c;	  in  >> c >> pow;	}	else {	  pow=1;	}      }      else {	pow=0;      }      if (coefs.size() <=pow) {	coefs.resize(pow+1);      }      if (!pos) coef=-coef;      coefs[pow]=coef;      char n= in.peek();      if (n=='+' || n=='-') {	pos= (n!='-');	char e;	in >> e;      } else {	/*bool f= in.fail();	  bool g= in.good();	  bool e= in.eof();	  bool b= in.bad();*/	// This is necessary since peek could have failed if we hit the end of the buffer	// it would better to do without peek, but that is too messy	in.clear();	//std::cout << f << g << e << b<<std::endl;	break;      }    }        p_.operator=(P(coefs));  }  bool is_constant() const {    return degree() < 1;  }  typedef const NT* iterator;  iterator begin() const {    return p_.coeff;  }  iterator end() const {    return p_.coeff+p_.degree+1;  }protected:  P p_;};template < class C, class Tr>inline std::ostream &operator<<(std::basic_ostream<C, Tr> &out,				const CORE_polynomial &poly){  poly.write(out);  return out;}template <class C, class Tr>inline std::istream &operator>>(std::basic_istream<C, Tr> &in,				CORE_polynomial &poly){  poly.read(in);  return in;}CORE_polynomial operator*(const CORE_polynomial::NT &a,			  const CORE_polynomial &p){  //CORE_polynomial::NT ac(a);  return CORE_polynomial(CORE_polynomial::P(0, &a)*p.core_polynomial());}CGAL_POLYNOMIAL_END_INTERNAL_NAMESPACE#endif

⌨️ 快捷键说明

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