// Copyright (c) 2003,2004 INRIA Sophia-Antipolis (France). // 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$ // $Id$ // // // Author(s) : Menelaos Karavelas #ifndef CGAL_APOLLONIUS_GRAPH_TRAITS_2_H #define CGAL_APOLLONIUS_GRAPH_TRAITS_2_H #ifndef CGAL_REP_CLASS_DEFINED #error no representation class defined #endif // CGAL_REP_CLASS_DEFINED #if defined CGAL_CARTESIAN_H || defined CGAL_SIMPLE_CARTESIAN_H #include #endif #include #include CGAL_BEGIN_NAMESPACE //*********************************************************************** //*********************************************************************** // PREDICATES //*********************************************************************** //*********************************************************************** //----------------------------------------------------------------------- // Orientation //----------------------------------------------------------------------- template< class K, class Method_tag > class AG2_Orientation_test_2 { public: typedef typename K::Site_2 Site_2; typedef Orientation result_type; typedef Arity_tag<3> Arity; private: inline Orientation vv_orientation(const Site_2& s1, const Site_2& s2, const Site_2& s3, const Site_2& p1, const Site_2& p2, const Ring_tag&) const { return ag2_orientation_test_ring_C2(s1.x(), s1.y(), s1.weight(), s2.x(), s2.y(), s2.weight(), s3.x(), s3.y(), s3.weight(), p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight()); } inline Orientation vv_orientation(const Site_2& s1, const Site_2& s2, const Site_2& s3, const Site_2& p1, const Site_2& p2, const Sqrt_field_tag&) const { return ag2_orientation_test_sqrtf_C2(s1.x(), s1.y(), s1.weight(), s2.x(), s2.y(), s2.weight(), s3.x(), s3.y(), s3.weight(), p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight()); } public: inline Orientation operator()(const Site_2 &p, const Site_2 &q, const Site_2 &r) const { return ag2_orientation_test_C2(p.x(), p.y(), p.weight(), q.x(), q.y(), q.weight(), r.x(), r.y(), r.weight()); } inline Orientation operator()(const Site_2& s1, const Site_2& s2, const Site_2& s3, const Site_2& p1, const Site_2& p2) const { return vv_orientation(s1, s2, s3, p1, p2, Method_tag()); } }; //----------------------------------------------------------------------- // Is hidden //----------------------------------------------------------------------- template< class K, class Method_tag > class Is_hidden_2 { public: typedef typename K::Site_2 Site_2; typedef bool result_type; typedef Arity_tag<2> Arity; private: bool is_hidden(const Site_2 &p, const Site_2 &q, Ring_tag) const { return ag_is_hidden_test_ring_C2(p.x(), p.y(), p.weight(), q.x(), q.y(), q.weight()); } bool is_hidden(const Site_2 &p, const Site_2 &q, Sqrt_field_tag) const { return ag_is_hidden_test_sqrtf_C2(p.x(), p.y(), p.weight(), q.x(), q.y(), q.weight()); } public: inline bool operator()(const Site_2 &p, const Site_2 &q) const { return is_hidden(p, q, Method_tag()); } }; //----------------------------------------------------------------------- // Oriented side of bisector //----------------------------------------------------------------------- template< class K, class Method_tag > class Oriented_side_of_bisector_2 { public: typedef typename K::Point_2 Point_2; typedef typename K::Site_2 Site_2; typedef Oriented_side result_type; typedef Arity_tag<3> Arity; private: Comparison_result compare_distances(const Site_2& p1, const Site_2& p2, const Point_2 &p, Ring_tag) const { return compare_ag_distances_test_ring_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), p.x(), p.y()); } Comparison_result compare_distances(const Site_2& p1, const Site_2& p2, const Point_2 &p, Sqrt_field_tag) const { return compare_ag_distances_test_sqrtf_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), p.x(), p.y()); } public: inline Oriented_side operator()(const Site_2& p1, const Site_2& p2, const Point_2 &p) const { Comparison_result r = compare_distances(p1, p2, p, Method_tag()); if ( r == EQUAL ) { return ON_ORIENTED_BOUNDARY; } return ( r == LARGER ) ? ON_NEGATIVE_SIDE : ON_POSITIVE_SIDE; } }; //----------------------------------------------------------------------- // Vertex conflict //----------------------------------------------------------------------- template < class K, class Method_tag > class Vertex_conflict_2 { public: typedef typename K::Site_2 Site_2; typedef Sign result_type; struct Arity {}; private: Sign incircle(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& q, Sqrt_field_tag) const { return ag_incircle_test_sqrtf_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), p3.x(), p3.y(), p3.weight(), q.x(), q.y(), q.weight()); } Sign incircle(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& q, Ring_tag) const { return ag_incircle_test_ring_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), p3.x(), p3.y(), p3.weight(), q.x(), q.y(), q.weight()); } Sign incircle(const Site_2& p1, const Site_2& p2, const Site_2& q, Sqrt_field_tag) const { return ag_incircle_test_sqrtf_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), q.x(), q.y(), q.weight()); } Sign incircle(const Site_2& p1, const Site_2& p2, const Site_2& q, Ring_tag) const { return ag_incircle_test_ring_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), q.x(), q.y(), q.weight()); } public: inline Sign operator()(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& q) const { typedef typename K::Rep_tag Tag; return incircle(p1, p2, p3, q, Method_tag()); } inline Sign operator()(const Site_2& p1, const Site_2& p2, const Site_2& q) const { typedef typename K::Rep_tag Tag; return incircle(p1, p2, q, Method_tag()); } }; //----------------------------------------------------------------------- // Finite edge interior conflict //----------------------------------------------------------------------- template < class K, class Method_tag > class Finite_edge_interior_conflict_2 { public: typedef typename K::Site_2 Site_2; typedef bool result_type; struct Arity {}; private: bool finite_edge_test(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& p4, const Site_2& q, bool b, Sqrt_field_tag) const { return ag_finite_edge_test_sqrtf_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), p3.x(), p3.y(), p3.weight(), p4.x(), p4.y(), p4.weight(), q.x(), q.y(), q.weight(), b); } bool finite_edge_test(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& p4, const Site_2& q, bool b, Ring_tag) const { return ag_finite_edge_test_ring_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), p3.x(), p3.y(), p3.weight(), p4.x(), p4.y(), p4.weight(), q.x(), q.y(), q.weight(), b); } bool finite_edge_test(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& q, bool b, Sqrt_field_tag) const { return ag_finite_edge_test_degenerated_sqrtf_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), p3.x(), p3.y(), p3.weight(), q.x(), q.y(), q.weight(), b); } bool finite_edge_test(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& q, bool b, Ring_tag) const { return ag_finite_edge_test_degenerated_ring_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), p3.x(), p3.y(), p3.weight(), q.x(), q.y(), q.weight(), b); } bool finite_edge_test(const Site_2& p1, const Site_2& p2, const Site_2& q, bool b, Sqrt_field_tag) const { return ag_finite_edge_test_degenerated_sqrtf_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), q.x(), q.y(), q.weight(), b); } bool finite_edge_test(const Site_2& p1, const Site_2& p2, const Site_2& q, bool b, Ring_tag) const { return ag_finite_edge_test_degenerated_ring_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), q.x(), q.y(), q.weight(), b); } public: inline bool operator()(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& q, bool b) const { return finite_edge_test(p1, p2, p3, q, b, Method_tag()); } bool operator()(const Site_2& p1, const Site_2& p2, const Site_2& q, bool b) const { return finite_edge_test(p1, p2, q, b, Method_tag()); } inline bool operator()(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& p4, const Site_2& q, bool b) const { return finite_edge_test(p1, p2, p3, p4, q, b, Method_tag()); } }; //----------------------------------------------------------------------- // Infinite edge interior conflict //----------------------------------------------------------------------- template < class K, class Method_tag > class Infinite_edge_interior_conflict_2 { public: typedef typename K::Site_2 Site_2; typedef bool result_type; typedef Arity_tag<5> Arity; private: bool infinite_edge_test(const Site_2& p2, const Site_2& p3, const Site_2& p4, const Site_2& q, bool b, Sqrt_field_tag) const { return ag_infinite_edge_test_sqrtf_C2(p2.x(), p2.y(), p2.weight(), p3.x(), p3.y(), p3.weight(), p4.x(), p4.y(), p4.weight(), q.x(), q.y(), q.weight(), b); } bool infinite_edge_test(const Site_2& p2, const Site_2& p3, const Site_2& p4, const Site_2& q, bool b, Ring_tag) const { return ag_infinite_edge_test_ring_C2(p2.x(), p2.y(), p2.weight(), p3.x(), p3.y(), p3.weight(), p4.x(), p4.y(), p4.weight(), q.x(), q.y(), q.weight(), b); } public: bool operator()(const Site_2& p2, const Site_2& p3, const Site_2& p4, const Site_2& q, bool b) const { return infinite_edge_test(p2, p3, p4, q, b, Method_tag()); } }; //----------------------------------------------------------------------- // Is degenerate //----------------------------------------------------------------------- template < class K, class Method_tag > class Is_degenerate_edge_2 { public: typedef typename K::Site_2 Site_2; typedef bool result_type; typedef Arity_tag<4> Arity; private: bool is_degenerate_edge(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& p4, Sqrt_field_tag) const { return ag_is_degenerate_edge_test_sqrtf_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), p3.x(), p3.y(), p3.weight(), p4.x(), p4.y(), p4.weight()); } bool is_degenerate_edge(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& p4, Ring_tag) const { return ag_is_degenerate_edge_test_ring_C2(p1.x(), p1.y(), p1.weight(), p2.x(), p2.y(), p2.weight(), p3.x(), p3.y(), p3.weight(), p4.x(), p4.y(), p4.weight()); } public: inline bool operator()(const Site_2& p1, const Site_2& p2, const Site_2& p3, const Site_2& p4) const { return is_degenerate_edge(p1, p2, p3, p4, Method_tag()); } }; //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- // the Traits class //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- template < class Rep, class MTag = Ring_tag > class Apollonius_graph_traits_2 { public: //----------------------------------------------------------------------- // TYPE DEFINITIONS //----------------------------------------------------------------------- // BASIC TYPES //------------ private: typedef Apollonius_graph_traits_2 Self; typedef Apollonius_graph_kernel_wrapper_2 Kernel; public: typedef Rep R; typedef MTag Method_tag; typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Site_2 Site_2; typedef typename Kernel::Line_2 Line_2; typedef typename Kernel::Ray_2 Ray_2; typedef typename Rep::Segment_2 Segment_2; typedef typename Kernel::Object_2 Object_2; typedef typename Kernel::FT FT; typedef typename Kernel::RT RT; public: // OBJECT CONSTRUCTION & ASSIGNMENT //--------------------------------- typedef typename Kernel::Construct_object_2 Construct_object_2; typedef typename Kernel::Assign_2 Assign_2; // CONSTRUCTIONS //-------------- // vertex and dual site typedef CGAL::Construct_Apollonius_vertex_2 /* */ Construct_Apollonius_vertex_2; typedef CGAL::Construct_Apollonius_site_2 /* */ Construct_Apollonius_site_2; // PREDICATES //----------- typedef CGAL::Ag2_compare_x_2 Compare_x_2; typedef CGAL::Ag2_compare_y_2 Compare_y_2; typedef CGAL::Ag2_compare_weight_2 Compare_weight_2; typedef CGAL::AG2_Orientation_test_2 Orientation_2; typedef CGAL::Is_hidden_2 Is_hidden_2; typedef CGAL::Oriented_side_of_bisector_2 /* */ Oriented_side_of_bisector_2; typedef CGAL::Vertex_conflict_2 Vertex_conflict_2; typedef CGAL::Finite_edge_interior_conflict_2 /* */ Finite_edge_interior_conflict_2; typedef CGAL::Infinite_edge_interior_conflict_2 /* */ Infinite_edge_interior_conflict_2; typedef CGAL::Is_degenerate_edge_2 Is_degenerate_edge_2; public: //----------------------------------------------------------------------- // ACCESS TO OBJECTS //----------------------------------------------------------------------- // OBJECT CONSTRUCTION & ASSIGNMENT Assign_2 assign_2_object() const { return Assign_2(); } Construct_object_2 construct_object_2_object() const { return Construct_object_2(); } // CONSTRUCTIONS //-------------- Construct_Apollonius_vertex_2 construct_Apollonius_vertex_2_object() const { return Construct_Apollonius_vertex_2(); } Construct_Apollonius_site_2 construct_Apollonius_site_2_object() const { return Construct_Apollonius_site_2(); } // PREDICATES //----------- Compare_x_2 compare_x_2_object() const { return Compare_x_2(); } Compare_y_2 compare_y_2_object() const { return Compare_y_2(); } Compare_weight_2 compare_weight_2_object() const { return Compare_weight_2(); } Orientation_2 orientation_2_object() const { return Orientation_2(); } Is_hidden_2 is_hidden_2_object() const { return Is_hidden_2(); } Oriented_side_of_bisector_2 oriented_side_of_bisector_2_object() const { return Oriented_side_of_bisector_2(); } Vertex_conflict_2 vertex_conflict_2_object() const { return Vertex_conflict_2(); } Finite_edge_interior_conflict_2 finite_edge_interior_conflict_2_object() const { return Finite_edge_interior_conflict_2(); } Infinite_edge_interior_conflict_2 infinite_edge_interior_conflict_2_object() const { return Infinite_edge_interior_conflict_2(); } Is_degenerate_edge_2 is_degenerate_edge_2_object() const { return Is_degenerate_edge_2(); } }; CGAL_END_NAMESPACE #endif // CGAL_APOLLONIUS_GRAPH_TRAITS_2_H