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

📄 default_instantaneous_kernel.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/Kinetic/Default_instantaneous_kernel.h $// $Id: Default_instantaneous_kernel.h 40020 2007-08-23 17:05:31Z drussel $// //// Author(s)     : Daniel Russel <drussel@alumni.princeton.edu>#ifndef CGAL_CARTESIAN_DEFAULT_INSTANTANEOUS_KERNEL_H#define  CGAL_CARTESIAN_DEFAULT_INSTANTANEOUS_KERNEL_H#include <CGAL/Kinetic/basic.h>#include <CGAL/Kinetic/internal/Instantaneous_adaptor.h>#include <CGAL/Simple_cartesian.h>#include <CGAL/Filtered_kernel.h>#include <map>#include <iostream>#include <CGAL/Kinetic/Ref_counted.h>#include <CGAL/Kinetic/internal/To_static.h>//#include <CGAL/Kinetic/Cartesian_static_converter.h>#define CGAL_MSA(Pred, pred, Arg, d) typedef Instantaneous_adaptor<typename Static_kernel::Pred##_##d, typename Kinetic_kernel::Pred##_##d, Rep, Arg> Pred##_##d; \  Pred##_##d pred##_##d##_object() const				\  {									\    typename Static_kernel::Pred##_##d sp= rep_->static_kernel().pred##_##d##_object();	\    typename Kinetic_kernel::Pred##_##d kp= rep_->kinetic_kernel().pred##_##d##_object();	\    return Pred##_##d(rep_, sp, kp);		\  }#define CGAL_TSO(name) typedef typename Static_kernel::name nameCGAL_KINETIC_BEGIN_NAMESPACEtemplate <class CIK>class Default_instantaneous_kernel_rep: public Ref_counted<Default_instantaneous_kernel_rep<CIK> >{public:  typedef typename CIK::Traits Traits;  typedef typename Traits::Static_kernel Static_kernel;  typedef typename Traits::Kinetic_kernel Kinetic_kernel;  typedef typename Kinetic_kernel::Point_1::template Static_traits<Static_kernel> Static_traits_point_1;  typedef typename Kinetic_kernel::Point_2::template Static_traits<Static_kernel> Static_traits_point_2;  typedef typename Kinetic_kernel::Point_3::template Static_traits<Static_kernel> Static_traits_point_3;  typedef typename Kinetic_kernel::Weighted_point_3::template Static_traits<Static_kernel> Static_traits_weighted_point_3;  typedef typename Static_kernel::FT NT;  typedef typename CIK::Traits::Simulator::Time Time;  Default_instantaneous_kernel_rep(Traits tr): tr_(tr) {    initialized_=false;    time_is_nt_=false;  }    template <class T>  void set_time(const T &t, bool limit) {    if (!initialized_) {      time_is_nt_=false;      time_=t;    } else {      if ((!time_is_nt_ && time_ != t) || time_is_nt_) {        time_is_nt_=false;        time_=t;        cache_1_.clear();        cache_2_.clear();        cache_3_.clear();      }    }    initialized_=true;    after_=limit;  }  void set_time(const NT &t, bool limit)  {         if (initialized_ && ((time_is_nt_ && time_nt_ != t) || !time_is_nt_)) {      cache_1_.clear();      cache_2_.clear();      cache_3_.clear();    }    time_is_nt_=true;    time_nt_=t;    time_= Time(t);    initialized_=true;    after_=limit;  }  bool time_after() const {    return after_;  }  bool initialized() const {    return initialized_;  }  bool time_is_nt() const {    return time_is_nt_;  }  const NT & time_as_nt() const  {    CGAL_precondition(initialized_);    CGAL_precondition(time_is_nt());    return time_nt_;  }    const Time &time() const  {    CGAL_precondition(initialized_);    return time_;  }    void check_static_object() const {#ifndef NDEBUG    if (!initialized_) {      std::cerr << "The InstantaneousKernel (or one of its predicates) was\n";      std::cerr << "used without the time being set. This probably is the sign\n";      std::cerr << "of misusing it--specifically make sure you store a copy\n";      std::cerr << "from the SimulatorTraits and get predicates from it.\n";    }#endif    if (!time_is_nt()) {        std::cerr << "You can only compute static objects when the IK current\n";        std::cerr << "time is an FT, rather than a root.\n";	CGAL_assertion(0);    }  }  typedef typename CIK::Traits::Active_points_1_table::Data::template Static_traits<Static_kernel> Static_traits_1;  const typename Static_traits_1::Static_type&  static_object(typename CIK::Point_1 k) const {    check_static_object();    if (cache_1_.find(k) == cache_1_.end()) {      cache_1_[k]= Static_traits_1::to_static(tr_.active_points_1_table_handle()->at(k), 					      time_nt_, static_kernel());      //std::cout << "Point " << k << " is " << cache_1_[k] << std::endl;    }    return cache_1_[k];  }  typedef typename CIK::Traits::Active_points_2_table::Data::template Static_traits<Static_kernel> Static_traits_2;  const typename Static_traits_2::Static_type&  static_object(typename CIK::Point_2 k) const {    check_static_object();    if (cache_2_.find(k) == cache_2_.end()) {      cache_2_[k]= Static_traits_2::to_static(tr_.active_points_2_table_handle()->at(k), 					      time_nt_, static_kernel());    }    return cache_2_[k];  }  typedef typename CIK::Traits::Active_points_3_table::Data::template Static_traits<Static_kernel> Static_traits_3;  const typename Static_traits_3::Static_type&  static_object(typename CIK::Point_3 k) const {    check_static_object();    if (cache_3_.find(k) == cache_3_.end()) {      cache_3_[k]= Static_traits_3::to_static(tr_.active_points_3_table_handle()->at(k), 					      time_nt_, static_kernel());    }    return cache_3_[k];  }  /*const typename Static_kernel::Weighted_point_3&  static_object(typename CIK::Weighted_point_3 k) const {    check_static_object();    if (cache_w3_.find(k) == cache_w3_.end()) {      const typename Kinetic_kernel::Weighted_point_3 &wp= tr_.active_weighted_points_3_table_handle()->at(k);      cache_w3_[k]= typename Static_kernel::Weighted_point_2(Static_kernel::Point_2(wp.point().x()(time_),										    wp.point().y()(time_),										    wp.point().z()(time_)),							     wp.weight()(time_));    }    return cache_w3_[k];    }*/  const typename CIK::Traits::Active_points_1_table::Data&  kinetic_object(typename CIK::Point_1 k) const {    return tr_.active_points_1_table_handle()->at(k);      }  const typename CIK::Traits::Active_points_2_table::Data&  kinetic_object(typename CIK::Point_2 k) const {    return tr_.active_points_2_table_handle()->at(k);  }  const typename CIK::Traits::Active_points_3_table::Data&  kinetic_object(typename CIK::Point_3 k) const {    return tr_.active_points_3_table_handle()->at(k);  }      const Static_kernel& static_kernel() const  {    return tr_.static_kernel_object();  }    const Kinetic_kernel& kinetic_kernel() const  {    return tr_.kinetic_kernel_object();  }protected:  mutable bool initialized_;  bool time_is_nt_;  typename CIK::Traits tr_;  mutable std::map<typename CIK::Point_1,		   typename Static_traits_1::Static_type> cache_1_;  mutable std::map<typename CIK::Point_2,		   typename Static_traits_2::Static_type> cache_2_;  mutable std::map<typename CIK::Point_3,		   typename Static_traits_3::Static_type> cache_3_;  /*mutable std::map<typename CIK::Weighted_point_3,    typename Static_kernel::Weighted_point_3> cache_w3_;*/  NT time_nt_;  Time time_;  bool after_;};template <class Traitst >class Default_instantaneous_kernel{  typedef Default_instantaneous_kernel<Traitst> This;public:  typedef Traitst Traits;  typedef Default_instantaneous_kernel_rep< This>  Rep;  typedef typename Traits::Static_kernel Static_kernel;  typedef typename Traits::Kinetic_kernel Kinetic_kernel;  typedef typename Static_kernel::FT NT;  typedef typename Traits::Simulator::Time Time;  Default_instantaneous_kernel(const Traits &tr):    rep_(new Rep(tr)) {  }  template <class N>  void set_time(const N &cur_time) const  {    rep_->set_time(cur_time, false);  }  void set_time(const Time &cur_time) const  {    rep_->set_time(cur_time, false);  }  template <class N>  void set_time_to_after(const N &cur_time) const  {    rep_->set_time(cur_time, true);  }  void set_time_to_after(const Time &cur_time) const  {    rep_->set_time(cur_time, true);  }   bool time_is_nt() const {    return rep_->time_is_nt();  }  const NT & time_as_nt() const  {    return rep_->time_as_nt();  }    const Time & time() const  {       return rep_->time();     }  bool has_time() const {    return rep_->initialized();  }  typedef typename Static_kernel::RT RT;  typedef typename Static_kernel::FT FT;  typedef typename Traits::Active_points_1_table::Key Point_1;  typedef typename Traits::Active_points_2_table::Key Point_2;  typedef typename Traits::Active_points_3_table::Key Point_3;  //typedef typename Traits::Active_points_3_table::Key Bare_point;  //typedef typename Traits::Active_weighted_points_3_table::Key Weighted_point_3;  struct Current_coordinates {    Current_coordinates(typename Rep::Handle rep): rep_(rep){}       const FT  & operator()(Point_1 k) const {      return rep_->static_object(k);    }    const typename Static_kernel::Point_2  & operator()(Point_2 k) const {      return rep_->static_object(k);    }    const typename Static_kernel::Point_3  & operator()(Point_3 k) const {      return rep_->static_object(k);    }    /*const typename Static_kernel::Weighted_point_3  & operator()(Weighted_point_3 k) const {      return rep_->static_object(k);      }*/    typename Rep::Handle rep_;  };  Current_coordinates current_coordinates_object() const {    return Current_coordinates(rep_);  }  template <class T>  class Compare_static {  public:    typedef CGAL::Comparison_result result_type;    typedef T first_argument_type;    typedef T second_argument_type;    typedef typename Arity_traits<typename Static_kernel::Compare_x_2>::Arity Arity;    result_type operator()(const T &a, const T&b) const {      return CGAL::compare(a,b);    }  };  typedef Instantaneous_adaptor<Compare_static<RT>, typename Kinetic_kernel::Compare_x_1, Rep, Point_1> Compare_x_1;  Compare_x_1 compare_x_1_object() const  {    Compare_static<NT> sp;    return Compare_x_1(rep_, sp, rep_->kinetic_kernel().compare_x_1_object());  }  CGAL_MSA(Side_of_oriented_circle,side_of_oriented_circle, Point_2, 2);  CGAL_MSA(Orientation,orientation, Point_2, 2);  CGAL_MSA(Compare_x, compare_x, Point_2, 2);  CGAL_MSA(Compare_y,compare_y, Point_2, 2);  /*CGAL_MSA(Compare_x, compare_x, Point_2, 2);    CGAL_MSA(Compare_y, compare_y, Point_2, 2);*/  CGAL_MSA(Compare_distance, compare_distance, Point_2, 2);  CGAL_MSA(Compare_distance, compare_distance, Point_3, 3);  CGAL_TSO(Segment_2);  CGAL_TSO(Triangle_2);  CGAL_MSA(Side_of_oriented_sphere,side_of_oriented_sphere, Point_3, 3);  CGAL_MSA(Orientation,orientation, Point_3, 3);  CGAL_MSA(Compare_x,compare_x, Point_3, 3);  CGAL_MSA(Compare_y,compare_y, Point_3, 3);  CGAL_MSA(Compare_z,compare_z, Point_3, 3);  CGAL_MSA(Compare_xyz,compare_xyz, Point_3, 3);  /*CGAL_MSA(Less_x, less_x, Point_3, 3);  CGAL_MSA(Less_y, less_y, Point_3, 3);  CGAL_MSA(Less_z, less_z, Point_3, 3);*/  CGAL_MSA(Coplanar_orientation, coplanar_orientation, Point_3, 3);  CGAL_MSA(Coplanar_side_of_bounded_circle, coplanar_side_of_bounded_circle, Point_3, 3);  //CGAL_MSA(Power_test,power_test, Weighted_point_3, 3);    CGAL_TSO(Segment_3);  CGAL_TSO(Triangle_3);  CGAL_TSO(Tetrahedron_3);  CGAL_TSO(Line_3);  CGAL_TSO(Ray_3);  CGAL_TSO(Object_3);  CGAL_TSO(Plane_3);protected:  typename Rep::Handle rep_;};#undef CGAL_MSA#undef CGAL_TSOCGAL_KINETIC_END_NAMESPACE#endif

⌨️ 快捷键说明

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