1 // Copyright (c) 2011 Tel-Aviv University (Israel), 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_rat_arc/Rational_function_ordered_pair.h $
7 // $Id: Rational_function_ordered_pair.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot
8 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
9 //
10 // Author(s)     : Oren Salzman <orenzalz@post.tau.ac.il >
11 //                 Michael Hemmer <Michael.Hemmer@sophia.inria.fr>
12 
13 #ifndef CGAL_RATIONAL_FUNCTION_ORDERED_PAIR_H
14 #define CGAL_RATIONAL_FUNCTION_ORDERED_PAIR_H
15 
16 #include <CGAL/license/Arrangement_on_surface_2.h>
17 
18 
19 
20 #include <CGAL/Arr_rat_arc/Base_rational_arc_ds_1.h>
21 #include <CGAL/Arr_rat_arc/Rational_function.h>
22 #include <CGAL/Arr_rat_arc/Rational_function_pair.h>
23 
24 namespace CGAL {
25 namespace Arr_rational_arc
26 {
27 template <typename AlgebraicKernel_d_1>
28 class Rational_function_ordered_pair:
29     public Base_rational_arc_ds_1<AlgebraicKernel_d_1>
30 {
31 public:
32   typedef AlgebraicKernel_d_1                          Algebraic_kernel_d_1;
33   typedef Base_rational_arc_ds_1<Algebraic_kernel_d_1> Base;
34   typedef CGAL::Arr_rational_arc::Rational_function_pair<Algebraic_kernel_d_1>
35                                                        Rational_function_pair;
36   typedef CGAL::Arr_rational_arc::Rational_function<Algebraic_kernel_d_1>
37                                                        Rational_function;
38 
39   typedef typename Base::Polynomial_1                  Polynomial_1;
40   typedef typename Base::Algebraic_real_1              Algebraic_real_1;
41   typedef typename Base::Algebraic_vector              Algebraic_vector;
42   typedef typename Base::Multiplicity                  Multiplicity;
43   typedef typename Base::Multiplicity_vector           Multiplicity_vector;
44   typedef typename Base::Root_multiplicity_vector      Root_multiplicity_vector;
45 
46 public:
47   Rational_function_ordered_pair(const Rational_function_pair& rat_pair,
48                                  bool is_opposite = false) :
_rat_pair(rat_pair)49     _rat_pair(rat_pair), _is_opposite(is_opposite)
50   {}
51 
52   Comparison_result compare_f_g_at(const Algebraic_real_1& x,
53                                    CGAL::Sign epsilon = CGAL::ZERO)
54   {
55     Comparison_result cr =  _rat_pair.compare_f_g_at(x,epsilon);
56     if (_is_opposite == false)
57       return cr;
58     return (cr == CGAL:: LARGER ) ? CGAL:: SMALLER  :
59       (cr == CGAL:: SMALLER ) ? CGAL:: LARGER  :
60       /* (cr == CGAL::EQUAL)*/   CGAL:: EQUAL;
61   }
62 
compare_f_g_at(Arr_parameter_space boundary)63   Comparison_result compare_f_g_at(Arr_parameter_space boundary)
64   {
65     Comparison_result cr =  _rat_pair.compare_f_g_at(boundary);
66     if (_is_opposite == false)
67       return cr;
68     return (cr == CGAL:: LARGER ) ? CGAL:: SMALLER  :
69       (cr == CGAL:: SMALLER ) ? CGAL:: LARGER  :
70       /* (cr == CGAL::EQUAL)*/ CGAL::EQUAL;
71   }
72 
is_intersecting_in_range(const Arr_parameter_space left_parameter_space,const Algebraic_real_1 left,const Arr_parameter_space right_parameter_space,const Algebraic_real_1 right)73   bool is_intersecting_in_range(const Arr_parameter_space left_parameter_space,
74                                 const Algebraic_real_1 left,
75                                 const Arr_parameter_space right_parameter_space,
76                                 const Algebraic_real_1 right)
77   {
78     return _rat_pair.is_intersecting_in_range(left_parameter_space, left,
79                                               right_parameter_space, right);
80   }
81 
roots()82   const Algebraic_vector & roots() const
83   {
84     return _rat_pair.roots();
85   }
86 
multiplicities()87   const Multiplicity_vector & multiplicities() const
88   {
89     return _rat_pair.multiplicities();
90   }
91 
92 private:
93   const Rational_function_pair& _rat_pair;
94   bool       _is_opposite;
95 }; // Rational_function_ordered_pair
96 
97 
98 }   //namespace Arr_rational_arc
99 }   //namespace CGAL {
100 
101 #endif //CGAL_RATIONAL_FUNCTION_ORDERED_PAIR_H
102