1 // Copyright (c) 2003,2004,2005,2006,2007,2008,2009,2010,2011 INRIA Sophia-Antipolis (France). 2 // All rights reserved. 3 // 4 // This file is part of CGAL (www.cgal.org). 5 // 6 // $URL: https://github.com/CGAL/cgal/blob/v5.3/Arrangement_on_surface_2/include/CGAL/Arr_circular_arc_traits_2.h $ 7 // $Id: Arr_circular_arc_traits_2.h 1b23ac2 2020-07-02T19:10:00+03:00 Efi Fogel 8 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial 9 // 10 // Author(s) : Monique Teillaud, Sylvain Pion 11 12 // Partially supported by the IST Programme of the EU as a Shared-cost 13 // RTD (FET Open) Project under Contract No IST-2000-26473 14 // (ECG - Effective Computational Geometry for Curves and Surfaces) 15 // and a STREP (FET Open) Project under Contract No IST-006413 16 // (ACS -- Algorithms for Complex Shapes) 17 18 #ifndef CGAL_CIRCULAR_KERNEL_CIRCULAR_ARC_TRAITS_2_H 19 #define CGAL_CIRCULAR_KERNEL_CIRCULAR_ARC_TRAITS_2_H 20 21 #include <CGAL/license/Arrangement_on_surface_2.h> 22 23 #include <CGAL/disable_warnings.h> 24 25 /*! \file 26 * This file was developed at Inria, France, and copied over to the 27 * Arrangement_2 package, which it is now part of. It contains a traits 28 * class for the arrangement package that handles circular curves. 29 * It is based on the circular kernel. 30 * 31 * \todo Fix the circular-kernel make-x-monotone functor to use modern variant 32 * instead of the legacy CGAL::Object. Then, eliminate the special 33 * implementation here and directly use the kernel functor instead. 34 */ 35 36 #include <CGAL/basic.h> 37 #include <CGAL/global_functions_circular_kernel_2.h> 38 #include <CGAL/Arr_tags.h> 39 40 namespace CGAL { 41 42 namespace internal{ 43 template <class CircularKernel> 44 class Non_x_monotonic_Circular_arc_2 45 : public CircularKernel::Circular_arc_2 46 { 47 typedef typename CircularKernel::FT FT; 48 typedef typename CircularKernel::Point_2 Point_2; 49 typedef typename CircularKernel::Line_2 Line_2; 50 typedef typename CircularKernel::Circle_2 Circle_2; 51 typedef typename CircularKernel::Circular_arc_point_2 52 Circular_arc_point_2; 53 54 typedef typename CircularKernel::Circular_arc_2 Base; 55 56 public: Non_x_monotonic_Circular_arc_2()57 Non_x_monotonic_Circular_arc_2(): Base(){} 58 Non_x_monotonic_Circular_arc_2(const Circle_2 & c)59 Non_x_monotonic_Circular_arc_2(const Circle_2 &c): Base(c){} 60 // Not Documented Non_x_monotonic_Circular_arc_2(const Circle_2 & support,const Line_2 & l1,const bool b_l1,const Line_2 & l2,const bool b_l2)61 Non_x_monotonic_Circular_arc_2(const Circle_2 &support, 62 const Line_2 &l1, const bool b_l1, 63 const Line_2 &l2, const bool b_l2) 64 : Base(support,l1,b_l1,l2,b_l2){} 65 66 // Not Documented Non_x_monotonic_Circular_arc_2(const Circle_2 & c,const Circle_2 & c1,const bool b_1,const Circle_2 & c2,const bool b_2)67 Non_x_monotonic_Circular_arc_2(const Circle_2 &c, 68 const Circle_2 &c1, const bool b_1, 69 const Circle_2 &c2, const bool b_2) 70 : Base(c,c1,b_1,c2,b_2) 71 {} 72 Non_x_monotonic_Circular_arc_2(const Point_2 & start,const Point_2 & middle,const Point_2 & end)73 Non_x_monotonic_Circular_arc_2(const Point_2 &start, 74 const Point_2 &middle, 75 const Point_2 &end) 76 : Base(start,middle,end) 77 {} 78 Non_x_monotonic_Circular_arc_2(const Circle_2 & support,const Circular_arc_point_2 & begin,const Circular_arc_point_2 & end)79 Non_x_monotonic_Circular_arc_2(const Circle_2 &support, 80 const Circular_arc_point_2 &begin, 81 const Circular_arc_point_2 &end) 82 : Base(support,begin,end) 83 {} 84 Non_x_monotonic_Circular_arc_2(const Point_2 & start,const Point_2 & end,const FT & bulge)85 Non_x_monotonic_Circular_arc_2(const Point_2 &start, 86 const Point_2 &end, 87 const FT &bulge) 88 : Base(start,end,bulge) 89 {} 90 Non_x_monotonic_Circular_arc_2(const Base & a)91 Non_x_monotonic_Circular_arc_2(const Base& a) : Base(a) {} 92 }; 93 94 } //namespace internal 95 96 // Traits class for CGAL::Arrangement_2 (and similar) based on a 97 // CircularKernel. 98 99 template < typename CircularKernel > 100 class Arr_circular_arc_traits_2 { 101 102 CircularKernel ck; 103 104 public: 105 106 typedef CircularKernel Kernel; 107 typedef internal::Non_x_monotonic_Circular_arc_2<CircularKernel> Curve_2; 108 typedef typename CircularKernel::Circular_arc_2 X_monotone_curve_2; 109 110 typedef typename CircularKernel::Circular_arc_point_2 Point; 111 typedef typename CircularKernel::Circular_arc_point_2 Point_2; 112 113 typedef unsigned int Multiplicity; 114 115 typedef CGAL::Tag_false Has_left_category; 116 typedef CGAL::Tag_false Has_merge_category; 117 typedef CGAL::Tag_false Has_do_intersect_category; 118 119 typedef Arr_oblivious_side_tag Left_side_category; 120 typedef Arr_oblivious_side_tag Bottom_side_category; 121 typedef Arr_oblivious_side_tag Top_side_category; 122 typedef Arr_oblivious_side_tag Right_side_category; 123 124 Arr_circular_arc_traits_2(const CircularKernel &k = CircularKernel()) ck(k)125 : ck(k) {} 126 127 typedef typename CircularKernel::Compare_x_2 Compare_x_2; 128 typedef typename CircularKernel::Compare_xy_2 Compare_xy_2; 129 typedef typename CircularKernel::Compare_y_at_x_2 Compare_y_at_x_2; 130 typedef typename CircularKernel::Compare_y_to_right_2 Compare_y_at_x_right_2; 131 typedef typename CircularKernel::Construct_circular_max_vertex_2 132 Construct_max_vertex_2; 133 typedef typename CircularKernel::Construct_circular_min_vertex_2 134 Construct_min_vertex_2; 135 typedef typename CircularKernel::Equal_2 Equal_2; 136 // typedef typename CircularKernel::Make_x_monotone_2 Make_x_monotone_2; 137 typedef typename CircularKernel::Split_2 Split_2; 138 typedef typename CircularKernel::Intersect_2 Intersect_2; 139 typedef typename CircularKernel::Is_vertical_2 Is_vertical_2; 140 compare_x_2_object()141 Compare_x_2 compare_x_2_object() const 142 { return ck.compare_x_2_object(); } 143 compare_xy_2_object()144 Compare_xy_2 compare_xy_2_object() const 145 { return ck.compare_xy_2_object(); } 146 compare_y_at_x_2_object()147 Compare_y_at_x_2 compare_y_at_x_2_object() const 148 { return ck.compare_y_at_x_2_object(); } 149 compare_y_at_x_right_2_object()150 Compare_y_at_x_right_2 compare_y_at_x_right_2_object() const 151 { return ck.compare_y_to_right_2_object(); } 152 equal_2_object()153 Equal_2 equal_2_object() const 154 { return ck.equal_2_object(); } 155 156 // Make_x_monotone_2 make_x_monotone_2_object() const 157 // { return ck.make_x_monotone_2_object(); } 158 split_2_object()159 Split_2 split_2_object() const 160 { return ck.split_2_object(); } 161 intersect_2_object()162 Intersect_2 intersect_2_object() const 163 { return ck.intersect_2_object(); } 164 construct_max_vertex_2_object()165 Construct_max_vertex_2 construct_max_vertex_2_object() const 166 { return ck.construct_circular_max_vertex_2_object(); } 167 construct_min_vertex_2_object()168 Construct_min_vertex_2 construct_min_vertex_2_object() const 169 { return ck.construct_circular_min_vertex_2_object(); } 170 is_vertical_2_object()171 Is_vertical_2 is_vertical_2_object() const 172 { return ck.is_vertical_2_object(); } 173 174 175 //! A functor for subdividing curves into x-monotone curves. 176 class Make_x_monotone_2 { 177 public: 178 template <typename OutputIterator> operator()179 OutputIterator operator()(const Curve_2& arc, OutputIterator oi) const 180 { 181 typedef boost::variant<Point_2, X_monotone_curve_2> 182 Make_x_monotone_result; 183 184 std::vector<CGAL::Object> objs; 185 CircularKernel().make_x_monotone_2_object()(arc, std::back_inserter(objs)); 186 for (const auto& obj : objs) { 187 if (const auto* p = CGAL::object_cast<Point_2>(&obj)) { 188 *oi++ = Make_x_monotone_result(*p); 189 continue; 190 } 191 if (const auto* xcv = CGAL::object_cast<X_monotone_curve_2>(&obj)) { 192 *oi++ = Make_x_monotone_result(*xcv); 193 continue; 194 } 195 CGAL_error(); 196 } 197 return oi; 198 } 199 }; 200 make_x_monotone_2_object()201 Make_x_monotone_2 make_x_monotone_2_object() const 202 { return Make_x_monotone_2(); } 203 }; 204 205 } // namespace CGAL 206 207 #include <CGAL/enable_warnings.h> 208 209 #endif // CGAL_CIRCULAR_KERNEL_CIRCULAR_ARC_TRAITS_H 210