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

📄 construct_storage_site_2.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 2006 Foundation for Research and Technology-Hellas (Greece).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you may redistribute it under// the terms of the Q Public License version 1.0.// See the file LICENSE.QPL 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/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_2/Construct_storage_site_2.h $// $Id: Construct_storage_site_2.h 37157 2007-03-16 10:49:14Z afabri $// //// Author(s)     : Menelaos Karavelas <mkaravel@iacm.forth.gr>#ifndef CGAL_SEGMENT_DELAUNAY_GRAPH_2_CONSTRUCT_STORAGE_SITE_2_H#define CGAL_SEGMENT_DELAUNAY_GRAPH_2_CONSTRUCT_STORAGE_SITE_2_H 1#include <CGAL/Segment_Delaunay_graph_2/basic.h>CGAL_BEGIN_NAMESPACECGAL_SEGMENT_DELAUNAY_GRAPH_2_BEGIN_NAMESPACEtemplate<class STraits>class Construct_storage_site_2{public:  typedef STraits                                    Storage_traits;  typedef typename Storage_traits::Storage_site_2    Storage_site_2;  typedef typename Storage_traits::Point_handle      Point_handle;  typedef typename Storage_traits::Geom_traits       Geom_traits;  typedef Storage_site_2                             result_type;  //  struct Arity {};protected:  typedef typename Geom_traits::Intersections_tag    ITag;  result_type construct(const Point_handle& h1,			const Point_handle& h2,			const Point_handle& h3,			const Point_handle& h4, const Tag_true&) const {    return Storage_site_2::construct_storage_site_2(h1, h2, h3, h4);  }  inline  result_type construct(const Point_handle& h1,			const Point_handle& h2,			const Point_handle& h3,			const Point_handle& h4,			const Point_handle& h5,			const Point_handle& h6, const Tag_true&) const {    return Storage_site_2::construct_storage_site_2(h1, h2, h3, h4, h5, h6);  }  inline  result_type construct(const Point_handle& h1,			const Point_handle& h2,			const Point_handle& h3,			const Point_handle& h4,			bool is_first_exact, const Tag_true&) const {    return Storage_site_2::construct_storage_site_2(h1, h2, h3, h4,						    is_first_exact);  }    result_type construct(const Point_handle&,			const Point_handle&,			const Point_handle&,			const Point_handle&, const Tag_false&) const {    CGAL_assertion( false );    return Storage_site_2();  }  inline  result_type construct(const Point_handle&,			const Point_handle&,			const Point_handle&,			const Point_handle&,			const Point_handle&,			const Point_handle&, const Tag_false&) const {    CGAL_assertion( false );    return Storage_site_2();  }  inline  result_type construct(const Point_handle&,			const Point_handle&,			const Point_handle&,			const Point_handle&,			bool /* is_first_exact */, const Tag_false&) const {    CGAL_assertion( false );    return Storage_site_2();  }public:  inline  result_type operator()(const Point_handle& h) const {    return Storage_site_2::construct_storage_site_2(h);  }  inline  result_type operator()(const Point_handle& h1,			 const Point_handle& h2) const {    return Storage_site_2::construct_storage_site_2(h1, h2);  }  inline  result_type operator()(const Point_handle& h1,			 const Point_handle& h2,			 const Point_handle& h3,			 const Point_handle& h4) const {    return construct(h1, h2, h3, h4, ITag());  }  inline  result_type operator()(const Point_handle& h1,			 const Point_handle& h2,			 const Point_handle& h3,			 const Point_handle& h4,			 const Point_handle& h5,			 const Point_handle& h6) const {    return construct(h1, h2, h3, h4, h5, h6, ITag());  }  inline  result_type operator()(const Point_handle& h1,			 const Point_handle& h2,			 const Point_handle& h3,			 const Point_handle& h4,			 bool is_first_exact) const {    return construct(h1, h2, h3, h4, is_first_exact, ITag());  }  // constructs the point of intersection  inline  result_type operator()(const Storage_site_2& ss0,			 const Storage_site_2& ss1) const {    CGAL_precondition( ss0.is_segment() && ss1.is_segment() );    return Storage_site_2::construct_storage_site_2      ( ss0.source_of_supporting_site(),	ss0.target_of_supporting_site(),	ss1.source_of_supporting_site(),	ss1.target_of_supporting_site() );  }  Storage_site_2  split_on_point_first_subsegment(const Storage_site_2& s,				  const Storage_site_2& p) const  {    // Splits the first storage site which is a segment using the    // second storage site which is an exact point    // Two new storage sites are created, corresponding to the two    // subsegments    CGAL_precondition( s.is_segment() && p.is_point() );    // computing the first sub-segment    if ( s.is_input(0) ) {      if ( p.is_input() ) {	// both segment and point are input	return operator()(s.source_of_supporting_site(), p.point());      } else {	// segment is input but point is intersection of two segments	Storage_site_2 supp0 = s.supporting_site();	Storage_site_2 supp1 = p.supporting_site(0);	typename Geom_traits::Are_parallel_2 are_parallel =	  Geom_traits().are_parallel_2_object();	if ( are_parallel(supp0.site(), supp1.site()) ) {	  supp1 = p.supporting_site(1);	}	return operator()( supp0.source_of_supporting_site(),			   supp0.target_of_supporting_site(),			   supp1.source_of_supporting_site(),			   supp1.target_of_supporting_site(),			   true );      }    } else {      if ( p.is_input() ) {	// point is input but source of segment is not	return operator()( s.source_of_supporting_site(),			   p.point(),			   s.source_of_crossing_site(0),			   s.target_of_crossing_site(0),			   false );      } else {	Storage_site_2 supp0 = s.supporting_site();	Storage_site_2 supp1 = p.supporting_site(0);	typename Geom_traits::Are_parallel_2 are_parallel =	  Geom_traits().are_parallel_2_object();	if ( are_parallel(supp0.site(), supp1.site()) ) {	  supp1 = p.supporting_site(1);	}	return operator()( supp0.source_of_supporting_site(),			   supp0.target_of_supporting_site(),			   s.source_of_crossing_site(0),			   s.target_of_crossing_site(0),			   supp1.source_of_supporting_site(),			   supp1.target_of_supporting_site() );      }    }  }  Storage_site_2  split_on_point_second_subsegment(const Storage_site_2& s,				   const Storage_site_2& p) const  {    CGAL_precondition( s.is_segment() && p.is_point() );    // computing the second sub-segment    if ( s.is_input(1) ) {      if ( p.is_input() ) {	// both segment and point are input	return operator()(p.point(), s.target_of_supporting_site());      } else {	// segment is input but point is intersection of two segments	Storage_site_2 supp0 = s.supporting_site();	Storage_site_2 supp1 = p.supporting_site(0);	typename Geom_traits::Are_parallel_2 are_parallel =	  Geom_traits().are_parallel_2_object();	if ( are_parallel(supp0.site(), supp1.site()) ) {	  supp1 = p.supporting_site(1);	}	return operator()( supp0.source_of_supporting_site(),			   supp0.target_of_supporting_site(),			   supp1.source_of_supporting_site(),			   supp1.target_of_supporting_site(),			   false );      }    } else {      if ( p.is_input() ) {	// point is input but source of segment is not	return operator()( p.point(),			   s.target_of_supporting_site(),			   s.source_of_crossing_site(1),			   s.target_of_crossing_site(1),			   true );      } else {	Storage_site_2 supp0 = s.supporting_site();	Storage_site_2 supp1 = p.supporting_site(0);	typename Geom_traits::Are_parallel_2 are_parallel =	  Geom_traits().are_parallel_2_object();	if ( are_parallel(supp0.site(), supp1.site()) ) {	  supp1 = p.supporting_site(1);	}	return operator()( supp0.source_of_supporting_site(),			   supp0.target_of_supporting_site(),			   supp1.source_of_supporting_site(),			   supp1.target_of_supporting_site(),			   s.source_of_crossing_site(1),			   s.target_of_crossing_site(1) );      }    }  }  Storage_site_2  construct_first_subsegment(const Storage_site_2& ss0,			     const Storage_site_2& ss1,			     const Tag_true&) const  {    if ( ss0.is_input(0) ) {      return Storage_site_2::construct_storage_site_2	( ss0.source_of_supporting_site(),	  ss0.target_of_supporting_site(),	  ss1.source_of_supporting_site(),	  ss1.target_of_supporting_site(), true );    } else {      return Storage_site_2::construct_storage_site_2	( ss0.source_of_supporting_site(),	  ss0.target_of_supporting_site(),	  ss0.source_of_crossing_site(0),	  ss0.target_of_crossing_site(0),	  ss1.source_of_supporting_site(),	  ss1.target_of_supporting_site() );    }  }  Storage_site_2  construct_second_subsegment(const Storage_site_2& ss0,			      const Storage_site_2& ss1,			      const Tag_true&) const  {    if ( ss0.is_input(1) ) {      return Storage_site_2::construct_storage_site_2	( ss0.source_of_supporting_site(),	  ss0.target_of_supporting_site(),	  ss1.source_of_supporting_site(),	  ss1.target_of_supporting_site(), false );    } else {      return Storage_site_2::construct_storage_site_2	( ss0.source_of_supporting_site(),	  ss0.target_of_supporting_site(),	  ss1.source_of_supporting_site(),	  ss1.target_of_supporting_site(),	  ss0.source_of_crossing_site(1),	  ss0.target_of_crossing_site(1) );    }  }  Storage_site_2  construct_first_subsegment(const Storage_site_2&,			     const Storage_site_2&,			     const Tag_false&) const  {    CGAL_assertion( false );    return Storage_site_2();  }  Storage_site_2  construct_second_subsegment(const Storage_site_2&,			      const Storage_site_2&,			      const Tag_false&) const  {    CGAL_assertion( false );    return Storage_site_2();  }  // constructs the subsegment with supporting segment ss0 and  // endpoints the point of intersection of ss1 and ss0; the boolean  // determines if the first or segment subsegment is constructed  inline  result_type operator()(const Storage_site_2& ss0,			 const Storage_site_2& ss1,			 bool first) const {    //    CGAL_precondition( ss0.is_segment() && ss1.is_segment() );    CGAL_precondition( ss0.is_segment() );    if ( ss1.is_point() ) {      if ( first ) {	return split_on_point_first_subsegment(ss0, ss1);      } else {	return split_on_point_second_subsegment(ss0, ss1);      }    }    if ( first ) {      return construct_first_subsegment(ss0, ss1, ITag());    } else {      return construct_second_subsegment(ss0, ss1, ITag());    }  }};//----------------------------------------------------------------------//----------------------------------------------------------------------CGAL_SEGMENT_DELAUNAY_GRAPH_2_END_NAMESPACECGAL_END_NAMESPACE#endif // CGAL_SEGMENT_DELAUNAY_GRAPH_2_CONSTRUCT_STORAGE_SITE_2_H

⌨️ 快捷键说明

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