Chris@16: /* Chris@16: Copyright 2008 Intel Corporation Chris@16: Chris@16: Use, modification and distribution are subject to the Boost Software License, Chris@16: Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: http://www.boost.org/LICENSE_1_0.txt). Chris@16: */ Chris@16: #ifndef BOOST_POLYGON_POLYGON_90_SET_CONCEPT_HPP Chris@16: #define BOOST_POLYGON_POLYGON_90_SET_CONCEPT_HPP Chris@16: #include "polygon_90_set_data.hpp" Chris@16: #include "polygon_90_set_traits.hpp" Chris@16: namespace boost { namespace polygon{ Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_polygon_90_set_type::type, Chris@16: typename polygon_90_set_traits::iterator_type>::type Chris@16: begin_90_set_data(const polygon_set_type& polygon_set) { Chris@16: return polygon_90_set_traits::begin(polygon_set); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_polygon_90_set_type::type, Chris@16: typename polygon_90_set_traits::iterator_type>::type Chris@16: end_90_set_data(const polygon_set_type& polygon_set) { Chris@16: return polygon_90_set_traits::end(polygon_set); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_polygon_90_set_type::type, Chris@16: orientation_2d>::type Chris@16: scanline_orientation(const polygon_set_type& polygon_set) { Chris@16: return polygon_90_set_traits::orient(polygon_set); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_polygon_90_set_type::type, Chris@16: bool>::type Chris@16: clean(const polygon_set_type& polygon_set) { Chris@16: return polygon_90_set_traits::clean(polygon_set); Chris@16: } Chris@16: Chris@16: //assign Chris@16: template Chris@16: typename enable_if < Chris@16: typename gtl_and< Chris@16: typename is_mutable_polygon_90_set_type::type, Chris@16: typename is_polygon_90_set_type::type>::type, Chris@16: polygon_set_type_1>::type & Chris@16: assign(polygon_set_type_1& lvalue, const polygon_set_type_2& rvalue) { Chris@16: polygon_90_set_mutable_traits::set(lvalue, begin_90_set_data(rvalue), end_90_set_data(rvalue), Chris@16: scanline_orientation(rvalue)); Chris@16: return lvalue; Chris@16: } Chris@16: Chris@16: template Chris@16: struct are_not_both_rectangle_concept { typedef gtl_yes type; }; Chris@16: template <> Chris@16: struct are_not_both_rectangle_concept { typedef gtl_no type; }; Chris@16: Chris@16: //equivalence Chris@16: template Chris@16: typename enable_if< typename gtl_and_3< Chris@16: typename is_polygon_90_set_type::type, Chris@16: typename is_polygon_90_set_type::type, Chris@16: typename are_not_both_rectangle_concept::type, Chris@16: typename geometry_concept::type>::type>::type, Chris@16: bool>::type Chris@16: equivalence(const polygon_set_type_1& lvalue, Chris@16: const polygon_set_type_2& rvalue) { Chris@16: polygon_90_set_data::coordinate_type> ps1; Chris@16: assign(ps1, lvalue); Chris@16: polygon_90_set_data::coordinate_type> ps2; Chris@16: assign(ps2, rvalue); Chris@16: return ps1 == ps2; Chris@16: } Chris@16: Chris@16: Chris@16: //get rectangle tiles (slicing orientation is vertical) Chris@16: template Chris@16: typename enable_if< typename gtl_if::type>::type, Chris@16: void>::type Chris@16: get_rectangles(output_container_type& output, const polygon_set_type& polygon_set) { Chris@16: clean(polygon_set); Chris@16: polygon_90_set_data::coordinate_type> ps(VERTICAL); Chris@16: assign(ps, polygon_set); Chris@16: ps.get_rectangles(output); Chris@16: } Chris@16: Chris@16: //get rectangle tiles Chris@16: template Chris@16: typename enable_if< typename gtl_if::type>::type, Chris@16: void>::type Chris@16: get_rectangles(output_container_type& output, const polygon_set_type& polygon_set, orientation_2d slicing_orientation) { Chris@16: clean(polygon_set); Chris@16: polygon_90_set_data::coordinate_type> ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.get_rectangles(output, slicing_orientation); Chris@16: } Chris@16: Chris@16: //get: min_rectangles max_rectangles Chris@16: template Chris@16: typename enable_if ::type, Chris@16: typename gtl_same_type::value_type>::type>::type>::type, Chris@16: void>::type Chris@16: get_max_rectangles(output_container_type& output, const polygon_set_type& polygon_set) { Chris@16: std::vector::coordinate_type> > rects; Chris@16: assign(rects, polygon_set); Chris@16: MaxCover::coordinate_type>::getMaxCover(output, rects, scanline_orientation(polygon_set)); Chris@16: } Chris@16: Chris@16: //clear Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: void>::type Chris@16: clear(polygon_set_type& polygon_set) { Chris@16: polygon_90_set_data::coordinate_type> ps(scanline_orientation(polygon_set)); Chris@16: assign(polygon_set, ps); Chris@16: } Chris@16: Chris@16: //empty Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: bool>::type Chris@16: empty(const polygon_set_type& polygon_set) { Chris@16: if(clean(polygon_set)) return begin_90_set_data(polygon_set) == end_90_set_data(polygon_set); Chris@16: polygon_90_set_data::coordinate_type> ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.clean(); Chris@16: return ps.empty(); Chris@16: } Chris@16: Chris@16: //extents Chris@16: template Chris@16: typename enable_if ::type, Chris@16: typename is_mutable_rectangle_concept::type>::type>::type, Chris@16: bool>::type Chris@16: extents(rectangle_type& extents_rectangle, Chris@16: const polygon_set_type& polygon_set) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps; Chris@16: assign(ps, polygon_set); Chris@16: return ps.extents(extents_rectangle); Chris@16: } Chris@16: Chris@16: //area Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: typename coordinate_traits::coordinate_type>::manhattan_area_type>::type Chris@16: area(const polygon_set_type& polygon_set) { Chris@16: typedef rectangle_data::coordinate_type> rectangle_type; Chris@16: typedef typename coordinate_traits::coordinate_type>::manhattan_area_type area_type; Chris@16: std::vector rects; Chris@16: assign(rects, polygon_set); Chris@16: area_type retval = (area_type)0; Chris@16: for(std::size_t i = 0; i < rects.size(); ++i) { Chris@16: retval += (area_type)area(rects[i]); Chris@16: } Chris@16: return retval; Chris@16: } Chris@16: Chris@16: //interact Chris@16: template Chris@16: typename enable_if ::type, Chris@16: typename is_mutable_polygon_90_set_type::type>::type, Chris@16: polygon_set_type_1>::type& Chris@16: interact(polygon_set_type_1& polygon_set_1, const polygon_set_type_2& polygon_set_2) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps(scanline_orientation(polygon_set_2)); Chris@16: polygon_90_set_data ps2(ps); Chris@16: ps.insert(polygon_set_1); Chris@16: ps2.insert(polygon_set_2); Chris@16: ps.interact(ps2); Chris@16: assign(polygon_set_1, ps); Chris@16: return polygon_set_1; Chris@16: } Chris@16: Chris@16: //self_intersect Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: self_intersect(polygon_set_type& polygon_set) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.self_intersect(); Chris@16: assign(polygon_set, ps); Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: //self_xor Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: self_xor(polygon_set_type& polygon_set) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.self_xor(); Chris@16: assign(polygon_set, ps); Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: bloat(polygon_set_type& polygon_set, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type bloating) { Chris@16: return bloat(polygon_set, bloating, bloating, bloating, bloating); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: bloat(polygon_set_type& polygon_set, orientation_2d orient, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type bloating) { Chris@16: if(orient == orientation_2d(HORIZONTAL)) Chris@16: return bloat(polygon_set, bloating, bloating, 0, 0); Chris@16: return bloat(polygon_set, 0, 0, bloating, bloating); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: bloat(polygon_set_type& polygon_set, orientation_2d orient, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type low_bloating, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type high_bloating) { Chris@16: if(orient == orientation_2d(HORIZONTAL)) Chris@16: return bloat(polygon_set, low_bloating, high_bloating, 0, 0); Chris@16: return bloat(polygon_set, 0, 0, low_bloating, high_bloating); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: bloat(polygon_set_type& polygon_set, direction_2d dir, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type bloating) { Chris@16: if(dir == direction_2d(EAST)) Chris@16: return bloat(polygon_set, 0, bloating, 0, 0); Chris@16: if(dir == direction_2d(WEST)) Chris@16: return bloat(polygon_set, bloating, 0, 0, 0); Chris@16: if(dir == direction_2d(SOUTH)) Chris@16: return bloat(polygon_set, 0, 0, bloating, 0); Chris@16: return bloat(polygon_set, 0, 0, 0, bloating); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: bloat(polygon_set_type& polygon_set, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type west_bloating, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type east_bloating, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type south_bloating, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type north_bloating) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.bloat(west_bloating, east_bloating, south_bloating, north_bloating); Chris@16: ps.clean(); Chris@16: assign(polygon_set, ps); Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: shrink(polygon_set_type& polygon_set, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type shrinking) { Chris@16: return shrink(polygon_set, shrinking, shrinking, shrinking, shrinking); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: shrink(polygon_set_type& polygon_set, orientation_2d orient, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type shrinking) { Chris@16: if(orient == orientation_2d(HORIZONTAL)) Chris@16: return shrink(polygon_set, shrinking, shrinking, 0, 0); Chris@16: return shrink(polygon_set, 0, 0, shrinking, shrinking); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: shrink(polygon_set_type& polygon_set, orientation_2d orient, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type low_shrinking, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type high_shrinking) { Chris@16: if(orient == orientation_2d(HORIZONTAL)) Chris@16: return shrink(polygon_set, low_shrinking, high_shrinking, 0, 0); Chris@16: return shrink(polygon_set, 0, 0, low_shrinking, high_shrinking); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: shrink(polygon_set_type& polygon_set, direction_2d dir, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type shrinking) { Chris@16: if(dir == direction_2d(EAST)) Chris@16: return shrink(polygon_set, 0, shrinking, 0, 0); Chris@16: if(dir == direction_2d(WEST)) Chris@16: return shrink(polygon_set, shrinking, 0, 0, 0); Chris@16: if(dir == direction_2d(SOUTH)) Chris@16: return shrink(polygon_set, 0, 0, shrinking, 0); Chris@16: return shrink(polygon_set, 0, 0, 0, shrinking); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: shrink(polygon_set_type& polygon_set, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type west_shrinking, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type east_shrinking, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type south_shrinking, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type north_shrinking) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.shrink(west_shrinking, east_shrinking, south_shrinking, north_shrinking); Chris@16: ps.clean(); Chris@16: assign(polygon_set, ps); Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: resize(polygon_set_type& polygon_set, coord_type resizing) { Chris@16: if(resizing > 0) { Chris@16: return bloat(polygon_set, resizing); Chris@16: } Chris@16: if(resizing < 0) { Chris@16: return shrink(polygon_set, -resizing); Chris@16: } Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: //positive or negative values allow for any and all directions of sizing Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: resize(polygon_set_type& polygon_set, coord_type west, coord_type east, coord_type south, coord_type north) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.resize(west, east, south, north); Chris@16: assign(polygon_set, ps); Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: grow_and(polygon_set_type& polygon_set, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type bloating) { Chris@16: return grow_and(polygon_set, bloating, bloating, bloating, bloating); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: grow_and(polygon_set_type& polygon_set, orientation_2d orient, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type bloating) { Chris@16: if(orient == orientation_2d(HORIZONTAL)) Chris@16: return grow_and(polygon_set, bloating, bloating, 0, 0); Chris@16: return grow_and(polygon_set, 0, 0, bloating, bloating); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: grow_and(polygon_set_type& polygon_set, orientation_2d orient, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type low_bloating, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type high_bloating) { Chris@16: if(orient == orientation_2d(HORIZONTAL)) Chris@16: return grow_and(polygon_set, low_bloating, high_bloating, 0, 0); Chris@16: return grow_and(polygon_set, 0, 0, low_bloating, high_bloating); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: grow_and(polygon_set_type& polygon_set, direction_2d dir, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type bloating) { Chris@16: if(dir == direction_2d(EAST)) Chris@16: return grow_and(polygon_set, 0, bloating, 0, 0); Chris@16: if(dir == direction_2d(WEST)) Chris@16: return grow_and(polygon_set, bloating, 0, 0, 0); Chris@16: if(dir == direction_2d(SOUTH)) Chris@16: return grow_and(polygon_set, 0, 0, bloating, 0); Chris@16: return grow_and(polygon_set, 0, 0, 0, bloating); Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename gtl_if::type>::type, Chris@16: polygon_set_type>::type & Chris@16: grow_and(polygon_set_type& polygon_set, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type west_bloating, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type east_bloating, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type south_bloating, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type north_bloating) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: std::vector > polys; Chris@16: assign(polys, polygon_set); Chris@16: clear(polygon_set); Chris@16: polygon_90_set_data ps(scanline_orientation(polygon_set)); Chris@16: for(std::size_t i = 0; i < polys.size(); ++i) { Chris@16: polygon_90_set_data tmpPs(scanline_orientation(polygon_set)); Chris@16: tmpPs.insert(polys[i]); Chris@16: bloat(tmpPs, west_bloating, east_bloating, south_bloating, north_bloating); Chris@16: tmpPs.clean(); //apply implicit OR on tmp polygon set Chris@16: ps.insert(tmpPs); Chris@16: } Chris@16: self_intersect(ps); Chris@16: assign(polygon_set, ps); Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: scale_up(polygon_set_type& polygon_set, Chris@16: typename coordinate_traits::coordinate_type> Chris@16: ::unsigned_area_type factor) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.scale_up(factor); Chris@16: assign(polygon_set, ps); Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: scale_down(polygon_set_type& polygon_set, Chris@16: typename coordinate_traits::coordinate_type> Chris@16: ::unsigned_area_type factor) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.scale_down(factor); Chris@16: assign(polygon_set, ps); Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: scale(polygon_set_type& polygon_set, Chris@16: const scaling_type& scaling) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.scale(scaling); Chris@16: assign(polygon_set, ps); Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: struct y_p_s_move : gtl_yes {}; Chris@16: Chris@16: //move Chris@16: template Chris@16: typename enable_if< typename gtl_and::type>::type>::type, Chris@16: polygon_set_type>::type & Chris@16: move(polygon_set_type& polygon_set, Chris@16: orientation_2d orient, typename polygon_90_set_traits::coordinate_type displacement) { Chris@16: if(orient == HORIZONTAL) Chris@16: return move(polygon_set, displacement, 0); Chris@16: else Chris@16: return move(polygon_set, 0, displacement); Chris@16: } Chris@16: Chris@16: struct y_p_s_move2 : gtl_yes {}; Chris@16: Chris@16: template Chris@16: typename enable_if< typename gtl_and::type>::type>::type, Chris@16: polygon_set_type>::type & Chris@16: move(polygon_set_type& polygon_set, typename polygon_90_set_traits::coordinate_type x_displacement, Chris@16: typename polygon_90_set_traits::coordinate_type y_displacement) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.move(x_displacement, y_displacement); Chris@16: ps.clean(); Chris@16: assign(polygon_set, ps); Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: //transform Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: transform(polygon_set_type& polygon_set, Chris@16: const transformation_type& transformation) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: polygon_90_set_data ps; Chris@16: assign(ps, polygon_set); Chris@16: ps.transform(transformation); Chris@16: ps.clean(); Chris@16: assign(polygon_set, ps); Chris@16: return polygon_set; Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: } Chris@16: Chris@16: //keep Chris@16: template Chris@16: typename enable_if< typename is_mutable_polygon_90_set_type::type, Chris@16: polygon_set_type>::type & Chris@16: keep(polygon_set_type& polygon_set, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type min_area, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type max_area, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type min_width, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type max_width, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type min_height, Chris@16: typename coordinate_traits::coordinate_type>::unsigned_area_type max_height) { Chris@16: typedef typename polygon_90_set_traits::coordinate_type Unit; Chris@16: typedef typename coordinate_traits::unsigned_area_type uat; Chris@16: std::list > polys; Chris@16: assign(polys, polygon_set); Chris@16: clear(polygon_set); Chris@16: typename std::list >::iterator itr_nxt; Chris@16: for(typename std::list >::iterator itr = polys.begin(); itr != polys.end(); itr = itr_nxt){ Chris@16: itr_nxt = itr; Chris@16: ++itr_nxt; Chris@16: rectangle_data bbox; Chris@16: extents(bbox, *itr); Chris@16: uat pwidth = delta(bbox, HORIZONTAL); Chris@16: if(pwidth > min_width && pwidth <= max_width){ Chris@16: uat pheight = delta(bbox, VERTICAL); Chris@16: if(pheight > min_height && pheight <= max_height){ Chris@16: uat parea = area(*itr); Chris@16: if(parea <= max_area && parea >= min_area) { Chris@16: continue; Chris@16: } Chris@16: } Chris@16: } Chris@16: polys.erase(itr); Chris@16: } Chris@16: assign(polygon_set, polys); Chris@16: return polygon_set; Chris@16: } Chris@16: Chris@16: Chris@16: } Chris@16: } Chris@16: #include "detail/polygon_90_set_view.hpp" Chris@16: #endif