// ====================================================================== // // Copyright (c) 1997 The CGAL Consortium // // This software and related documentation is part of an INTERNAL release // of the Computational Geometry Algorithms Library (CGAL). It is not // intended for general use. // // ---------------------------------------------------------------------- // // release : // release_date : 1999, October 01 // // file : include/CGAL/bops_traits_2.h // package : bops (2.2) // source : include/CGAL/bops_traits_2.h // revision : $Revision$ // revision_date : $Date$ // author(s) : Wolfgang Freiseisen // // coordinator : RISC Linz // (Wolfgang Freiseisen ) // // // ====================================================================== #ifndef BOPS_TRAITS_2_H #define BOPS_TRAITS_2_H #include #include #include #include #include #include #include #include #include #include #include #include CGAL_BEGIN_NAMESPACE /* P_Rep should be a representation class (e.g. something like Cartesian ) */ template struct Bops_default_I : public min_sqr_distance_traits { Bops_default_I() {} /* representation class */ //typedef P_Rep R; typedef CGAL::Object Object; /*------ constant sized objects ------*/ typedef CGAL::Bbox_2 Bbox; /* required operations: bool operator==(Bbox, Bbox); */ bool do_overlap( const Bbox& a, const Bbox& b) const { return do_overlap(a,b); } bool box_is_contained_in_box( const Bbox& a, const Bbox& b) const { return xmin(b) <= xmin(a) && xmax(b) >= xmax(a) && ymin(b) <= ymin(a) && ymax(b) >= ymax(a) ? true : false; } typedef CGAL::Point_2 Point; /* required operations: P_Rep::NT Point::x() const P_Rep::NT Point::y() const */ bool is_equal(const Point& p1, const Point& p2) const { return p1 == p2; } bool less_x(const Point& p1, const Point& p2) const { return p1.x() < p2.x(); } typedef CGAL::Segment_2 Segment; /* required operations: Segment(Point,Point); */ typedef CGAL::Triangle_2 Triangle; /* required operations: constructor with three points of type Point. */ typedef CGAL::Iso_rectangle_2 Iso_rectangle; /* required operations: constructor with three points of type Point. */ /*------ non-constant sized objects ------*/ typedef std::list Output_object_container; /* required operations: void Output_object_container::push_back(Object); */ typedef std::list Container; typedef Container Input_polygon_container; typedef std::list Output_polygon_container; typedef Polygon_2,Container> Polygon; typedef Polygon Input_polygon; typedef typename Polygon::Vertex_const_iterator Polygon_vertex_const_iterator; /* required operations: Polygon_vertex_const_iterator Polygon::vertices_begin(); Polygon_vertex_const_iterator Polygon::vertices_end(); */ typedef Polygon_2,Output_polygon_container> Output_polygon; bool is_leftturn(const Point& p0, const Point& p1, const Point& p2) const { /* p0 ... origin */ /* return direction_of(p0,p1) < direction_of(p0,p2);*/ return leftturn(p0, p1, p2); } Object Make_object(const Point& p) const { return make_object(p); } Object Make_object(const Segment& seg) const { return make_object(seg); } Object Make_object(const Output_polygon& pgon) const { return make_object(pgon); } Object Make_object(const Iso_rectangle& irect) const { return make_object(irect); } Object Make_object(const Triangle& triangle) const { return make_object(triangle); } Bbox get_Bbox(const Polygon& pgon) const { return pgon.bbox(); } bool has_on_bounded_side(const Polygon& pgon, const Point& pt) const { /* will be used if there is a better intersection algorithm implemented */ //return pgon.has_on_bounded_side(pt); //return pgon.has_on_bounded_side(pt) || pgon.has_on_boundary(pt); return pgon.bounded_side(pt)==ON_UNBOUNDED_SIDE ? false : true; } void reverse_orientation(Polygon& pgon) const { pgon.reverse_orientation(); } Polygon_vertex_const_iterator most_left_vertex(const Polygon& pgon) const { return pgon.left_vertex(); } /* for intersection plug-in: ------------------------- typedef Intersect_Polygons intersection_result; intersection_result Intersection(const Input_polygon& polygon_A, const Input_polygon& polygon_B) { return intersection_result(polygon_A, polygon_B); } int get_result( const intersection_result& result, std::list& point_list, std::list >& edge_list ) { result.get_graph_information(point_list, edge_list); } int get_result_on_A( const intersection_result& result, std::list& point_list) { point_list= result.get_color_informationA(); } int get_result_on_B( const intersection_result& result, std::list& point_list) { point_list= result.get_color_informationB(); } */ /* for nsquare-intersection algorithm: assign collinear_are_ordered_along_line compare_lexicographically_xy make_object do_intersect(Segment, Segment) intersection(Segment, Segment) */ protected: typedef CGAL::Direction_2 Direction; /* required operations: bool operator<(Direction, Direction); */ Direction direction_of(const Point& from, const Point& to) const { return (to-from).direction(); } double xmin(const Bbox& bbox) const { return bbox.xmin(); } double xmax(const Bbox& bbox) const { return bbox.xmax(); } double ymin(const Bbox& bbox) const { return bbox.ymin(); } double ymax(const Bbox& bbox) const { return bbox.ymax(); } }; CGAL_END_NAMESPACE #endif /* BOPS_TRAITS_2_H */