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