diff options
author | Anas Nashif <anas.nashif@intel.com> | 2012-10-30 12:57:26 -0700 |
---|---|---|
committer | Anas Nashif <anas.nashif@intel.com> | 2012-10-30 12:57:26 -0700 |
commit | 1a78a62555be32868418fe52f8e330c9d0f95d5a (patch) | |
tree | d3765a80e7d3b9640ec2e930743630cd6b9fce2b /boost/polygon/polygon_90_set_concept.hpp | |
download | boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.gz boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.bz2 boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.zip |
Imported Upstream version 1.49.0upstream/1.49.0
Diffstat (limited to 'boost/polygon/polygon_90_set_concept.hpp')
-rw-r--r-- | boost/polygon/polygon_90_set_concept.hpp | 548 |
1 files changed, 548 insertions, 0 deletions
diff --git a/boost/polygon/polygon_90_set_concept.hpp b/boost/polygon/polygon_90_set_concept.hpp new file mode 100644 index 0000000000..09d5eee80d --- /dev/null +++ b/boost/polygon/polygon_90_set_concept.hpp @@ -0,0 +1,548 @@ +/* + Copyright 2008 Intel Corporation + + Use, modification and distribution are subject to the Boost Software License, + Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at + http://www.boost.org/LICENSE_1_0.txt). +*/ +#ifndef BOOST_POLYGON_POLYGON_90_SET_CONCEPT_HPP +#define BOOST_POLYGON_POLYGON_90_SET_CONCEPT_HPP +#include "polygon_90_set_data.hpp" +#include "polygon_90_set_traits.hpp" +namespace boost { namespace polygon{ + + template <typename polygon_set_type> + typename enable_if< typename is_polygon_90_set_type<polygon_set_type>::type, + typename polygon_90_set_traits<polygon_set_type>::iterator_type>::type + begin_90_set_data(const polygon_set_type& polygon_set) { + return polygon_90_set_traits<polygon_set_type>::begin(polygon_set); + } + + template <typename polygon_set_type> + typename enable_if< typename is_polygon_90_set_type<polygon_set_type>::type, + typename polygon_90_set_traits<polygon_set_type>::iterator_type>::type + end_90_set_data(const polygon_set_type& polygon_set) { + return polygon_90_set_traits<polygon_set_type>::end(polygon_set); + } + + template <typename polygon_set_type> + typename enable_if< typename is_polygon_90_set_type<polygon_set_type>::type, + orientation_2d>::type + scanline_orientation(const polygon_set_type& polygon_set) { + return polygon_90_set_traits<polygon_set_type>::orient(polygon_set); + } + + template <typename polygon_set_type> + typename enable_if< typename is_polygon_90_set_type<polygon_set_type>::type, + bool>::type + clean(const polygon_set_type& polygon_set) { + return polygon_90_set_traits<polygon_set_type>::clean(polygon_set); + } + + //assign + template <typename polygon_set_type_1, typename polygon_set_type_2> + typename enable_if < + typename gtl_and< + typename is_mutable_polygon_90_set_type<polygon_set_type_1>::type, + typename is_polygon_90_set_type<polygon_set_type_2>::type>::type, + polygon_set_type_1>::type & + assign(polygon_set_type_1& lvalue, const polygon_set_type_2& rvalue) { + polygon_90_set_mutable_traits<polygon_set_type_1>::set(lvalue, begin_90_set_data(rvalue), end_90_set_data(rvalue), + scanline_orientation(rvalue)); + return lvalue; + } + + template <typename T1, typename T2> + struct are_not_both_rectangle_concept { typedef gtl_yes type; }; + template <> + struct are_not_both_rectangle_concept<rectangle_concept, rectangle_concept> { typedef gtl_no type; }; + + //equivalence + template <typename polygon_set_type_1, typename polygon_set_type_2> + typename enable_if< typename gtl_and_3< + typename is_polygon_90_set_type<polygon_set_type_1>::type, + typename is_polygon_90_set_type<polygon_set_type_2>::type, + typename are_not_both_rectangle_concept<typename geometry_concept<polygon_set_type_1>::type, + typename geometry_concept<polygon_set_type_2>::type>::type>::type, + bool>::type + equivalence(const polygon_set_type_1& lvalue, + const polygon_set_type_2& rvalue) { + polygon_90_set_data<typename polygon_90_set_traits<polygon_set_type_1>::coordinate_type> ps1; + assign(ps1, lvalue); + polygon_90_set_data<typename polygon_90_set_traits<polygon_set_type_2>::coordinate_type> ps2; + assign(ps2, rvalue); + return ps1 == ps2; + } + + + //get rectangle tiles (slicing orientation is vertical) + template <typename output_container_type, typename polygon_set_type> + typename enable_if< typename gtl_if<typename is_polygon_90_set_type<polygon_set_type>::type>::type, + void>::type + get_rectangles(output_container_type& output, const polygon_set_type& polygon_set) { + clean(polygon_set); + polygon_90_set_data<typename polygon_90_set_traits<polygon_set_type>::coordinate_type> ps(VERTICAL); + assign(ps, polygon_set); + ps.get_rectangles(output); + } + + //get rectangle tiles + template <typename output_container_type, typename polygon_set_type> + typename enable_if< typename gtl_if<typename is_polygon_90_set_type<polygon_set_type>::type>::type, + void>::type + get_rectangles(output_container_type& output, const polygon_set_type& polygon_set, orientation_2d slicing_orientation) { + clean(polygon_set); + polygon_90_set_data<typename polygon_90_set_traits<polygon_set_type>::coordinate_type> ps; + assign(ps, polygon_set); + ps.get_rectangles(output, slicing_orientation); + } + + //get: min_rectangles max_rectangles + template <typename output_container_type, typename polygon_set_type> + typename enable_if <typename gtl_and< + typename is_polygon_90_set_type<polygon_set_type>::type, + typename gtl_same_type<rectangle_concept, + typename geometry_concept + <typename std::iterator_traits + <typename output_container_type::iterator>::value_type>::type>::type>::type, + void>::type + get_max_rectangles(output_container_type& output, const polygon_set_type& polygon_set) { + std::vector<rectangle_data<typename polygon_90_set_traits<polygon_set_type>::coordinate_type> > rects; + assign(rects, polygon_set); + MaxCover<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::getMaxCover(output, rects, scanline_orientation(polygon_set)); + } + + //clear + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + void>::type + clear(polygon_set_type& polygon_set) { + polygon_90_set_data<typename polygon_90_set_traits<polygon_set_type>::coordinate_type> ps(scanline_orientation(polygon_set)); + assign(polygon_set, ps); + } + + //empty + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + bool>::type + empty(const polygon_set_type& polygon_set) { + if(clean(polygon_set)) return begin_90_set_data(polygon_set) == end_90_set_data(polygon_set); + polygon_90_set_data<typename polygon_90_set_traits<polygon_set_type>::coordinate_type> ps; + assign(ps, polygon_set); + ps.clean(); + return ps.empty(); + } + + //extents + template <typename polygon_set_type, typename rectangle_type> + typename enable_if <typename gtl_and< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + typename is_mutable_rectangle_concept<typename geometry_concept<rectangle_type>::type>::type>::type, + bool>::type + extents(rectangle_type& extents_rectangle, + const polygon_set_type& polygon_set) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + polygon_90_set_data<Unit> ps; + assign(ps, polygon_set); + return ps.extents(extents_rectangle); + } + + //area + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::manhattan_area_type>::type + area(const polygon_set_type& polygon_set) { + typedef rectangle_data<typename polygon_90_set_traits<polygon_set_type>::coordinate_type> rectangle_type; + typedef typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::manhattan_area_type area_type; + std::vector<rectangle_type> rects; + assign(rects, polygon_set); + area_type retval = (area_type)0; + for(std::size_t i = 0; i < rects.size(); ++i) { + retval += (area_type)area(rects[i]); + } + return retval; + } + + //interact + template <typename polygon_set_type_1, typename polygon_set_type_2> + typename enable_if <typename gtl_and< typename is_mutable_polygon_90_set_type<polygon_set_type_1>::type, + typename is_mutable_polygon_90_set_type<polygon_set_type_2>::type>::type, + polygon_set_type_1>::type& + interact(polygon_set_type_1& polygon_set_1, const polygon_set_type_2& polygon_set_2) { + typedef typename polygon_90_set_traits<polygon_set_type_1>::coordinate_type Unit; + polygon_90_set_data<Unit> ps(scanline_orientation(polygon_set_2)); + polygon_90_set_data<Unit> ps2(ps); + ps.insert(polygon_set_1); + ps2.insert(polygon_set_2); + ps.interact(ps2); + assign(polygon_set_1, ps); + return polygon_set_1; + } + + //self_intersect + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + self_intersect(polygon_set_type& polygon_set) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + polygon_90_set_data<Unit> ps; + assign(ps, polygon_set); + ps.self_intersect(); + assign(polygon_set, ps); + return polygon_set; + } + + //self_xor + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + self_xor(polygon_set_type& polygon_set) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + polygon_90_set_data<Unit> ps; + assign(ps, polygon_set); + ps.self_xor(); + assign(polygon_set, ps); + return polygon_set; + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + bloat(polygon_set_type& polygon_set, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type bloating) { + return bloat(polygon_set, bloating, bloating, bloating, bloating); + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + bloat(polygon_set_type& polygon_set, orientation_2d orient, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type bloating) { + if(orient == orientation_2d(HORIZONTAL)) + return bloat(polygon_set, bloating, bloating, 0, 0); + return bloat(polygon_set, 0, 0, bloating, bloating); + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + bloat(polygon_set_type& polygon_set, orientation_2d orient, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type low_bloating, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type high_bloating) { + if(orient == orientation_2d(HORIZONTAL)) + return bloat(polygon_set, low_bloating, high_bloating, 0, 0); + return bloat(polygon_set, 0, 0, low_bloating, high_bloating); + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + bloat(polygon_set_type& polygon_set, direction_2d dir, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type bloating) { + if(dir == direction_2d(EAST)) + return bloat(polygon_set, 0, bloating, 0, 0); + if(dir == direction_2d(WEST)) + return bloat(polygon_set, bloating, 0, 0, 0); + if(dir == direction_2d(SOUTH)) + return bloat(polygon_set, 0, 0, bloating, 0); + return bloat(polygon_set, 0, 0, 0, bloating); + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + bloat(polygon_set_type& polygon_set, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type west_bloating, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type east_bloating, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type south_bloating, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type north_bloating) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + polygon_90_set_data<Unit> ps; + assign(ps, polygon_set); + ps.bloat(west_bloating, east_bloating, south_bloating, north_bloating); + ps.clean(); + assign(polygon_set, ps); + return polygon_set; + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + shrink(polygon_set_type& polygon_set, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type shrinking) { + return shrink(polygon_set, shrinking, shrinking, shrinking, shrinking); + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + shrink(polygon_set_type& polygon_set, orientation_2d orient, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type shrinking) { + if(orient == orientation_2d(HORIZONTAL)) + return shrink(polygon_set, shrinking, shrinking, 0, 0); + return shrink(polygon_set, 0, 0, shrinking, shrinking); + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + shrink(polygon_set_type& polygon_set, orientation_2d orient, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type low_shrinking, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type high_shrinking) { + if(orient == orientation_2d(HORIZONTAL)) + return shrink(polygon_set, low_shrinking, high_shrinking, 0, 0); + return shrink(polygon_set, 0, 0, low_shrinking, high_shrinking); + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + shrink(polygon_set_type& polygon_set, direction_2d dir, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type shrinking) { + if(dir == direction_2d(EAST)) + return shrink(polygon_set, 0, shrinking, 0, 0); + if(dir == direction_2d(WEST)) + return shrink(polygon_set, shrinking, 0, 0, 0); + if(dir == direction_2d(SOUTH)) + return shrink(polygon_set, 0, 0, shrinking, 0); + return shrink(polygon_set, 0, 0, 0, shrinking); + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + shrink(polygon_set_type& polygon_set, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type west_shrinking, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type east_shrinking, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type south_shrinking, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type north_shrinking) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + polygon_90_set_data<Unit> ps; + assign(ps, polygon_set); + ps.shrink(west_shrinking, east_shrinking, south_shrinking, north_shrinking); + ps.clean(); + assign(polygon_set, ps); + return polygon_set; + } + + template <typename polygon_set_type, typename coord_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + resize(polygon_set_type& polygon_set, coord_type resizing) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + if(resizing > 0) { + return bloat(polygon_set, resizing); + } + if(resizing < 0) { + return shrink(polygon_set, -resizing); + } + return polygon_set; + } + + //positive or negative values allow for any and all directions of sizing + template <typename polygon_set_type, typename coord_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + resize(polygon_set_type& polygon_set, coord_type west, coord_type east, coord_type south, coord_type north) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + polygon_90_set_data<Unit> ps; + assign(ps, polygon_set); + ps.resize(west, east, south, north); + assign(polygon_set, ps); + return polygon_set; + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + grow_and(polygon_set_type& polygon_set, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type bloating) { + return grow_and(polygon_set, bloating, bloating, bloating, bloating); + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + grow_and(polygon_set_type& polygon_set, orientation_2d orient, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type bloating) { + if(orient == orientation_2d(HORIZONTAL)) + return grow_and(polygon_set, bloating, bloating, 0, 0); + return grow_and(polygon_set, 0, 0, bloating, bloating); + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + grow_and(polygon_set_type& polygon_set, orientation_2d orient, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type low_bloating, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type high_bloating) { + if(orient == orientation_2d(HORIZONTAL)) + return grow_and(polygon_set, low_bloating, high_bloating, 0, 0); + return grow_and(polygon_set, 0, 0, low_bloating, high_bloating); + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + grow_and(polygon_set_type& polygon_set, direction_2d dir, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type bloating) { + if(dir == direction_2d(EAST)) + return grow_and(polygon_set, 0, bloating, 0, 0); + if(dir == direction_2d(WEST)) + return grow_and(polygon_set, bloating, 0, 0, 0); + if(dir == direction_2d(SOUTH)) + return grow_and(polygon_set, 0, 0, bloating, 0); + return grow_and(polygon_set, 0, 0, 0, bloating); + } + + template <typename polygon_set_type> + typename enable_if< typename gtl_if<typename is_mutable_polygon_90_set_type<polygon_set_type>::type>::type, + polygon_set_type>::type & + grow_and(polygon_set_type& polygon_set, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type west_bloating, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type east_bloating, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type south_bloating, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type north_bloating) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + std::vector<polygon_90_data<Unit> > polys; + assign(polys, polygon_set); + clear(polygon_set); + polygon_90_set_data<Unit> ps(scanline_orientation(polygon_set)); + for(std::size_t i = 0; i < polys.size(); ++i) { + polygon_90_set_data<Unit> tmpPs(scanline_orientation(polygon_set)); + tmpPs.insert(polys[i]); + bloat(tmpPs, west_bloating, east_bloating, south_bloating, north_bloating); + tmpPs.clean(); //apply implicit OR on tmp polygon set + ps.insert(tmpPs); + } + self_intersect(ps); + assign(polygon_set, ps); + return polygon_set; + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + scale_up(polygon_set_type& polygon_set, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type> + ::unsigned_area_type factor) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + polygon_90_set_data<Unit> ps; + assign(ps, polygon_set); + ps.scale_up(factor); + assign(polygon_set, ps); + return polygon_set; + } + + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + scale_down(polygon_set_type& polygon_set, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type> + ::unsigned_area_type factor) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + polygon_90_set_data<Unit> ps; + assign(ps, polygon_set); + ps.scale_down(factor); + assign(polygon_set, ps); + return polygon_set; + } + + template <typename polygon_set_type, typename scaling_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + scale(polygon_set_type& polygon_set, + const scaling_type& scaling) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + polygon_90_set_data<Unit> ps; + assign(ps, polygon_set); + ps.scale(scaling); + assign(polygon_set, ps); + return polygon_set; + } + + //move + template <typename polygon_set_type> + polygon_set_type& + move(polygon_set_type& polygon_set, + orientation_2d orient, typename polygon_90_set_traits<polygon_set_type>::coordinate_type displacement, + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type>::type * = 0) { + if(orient == HORIZONTAL) + return move(polygon_set, displacement, 0); + else + return move(polygon_set, 0, displacement); + } + + template <typename polygon_set_type> + polygon_set_type& + move(polygon_set_type& polygon_set, typename polygon_90_set_traits<polygon_set_type>::coordinate_type x_displacement, + typename polygon_90_set_traits<polygon_set_type>::coordinate_type y_displacement, + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type>::type * = 0 + ) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + polygon_90_set_data<Unit> ps; + assign(ps, polygon_set); + ps.move(x_displacement, y_displacement); + ps.clean(); + assign(polygon_set, ps); + return polygon_set; + } + + //transform + template <typename polygon_set_type, typename transformation_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + transform(polygon_set_type& polygon_set, + const transformation_type& transformation) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + polygon_90_set_data<Unit> ps; + assign(ps, polygon_set); + ps.transform(transformation); + ps.clean(); + assign(polygon_set, ps); + return polygon_set; + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + } + + //keep + template <typename polygon_set_type> + typename enable_if< typename is_mutable_polygon_90_set_type<polygon_set_type>::type, + polygon_set_type>::type & + keep(polygon_set_type& polygon_set, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type min_area, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type max_area, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type min_width, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type max_width, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type min_height, + typename coordinate_traits<typename polygon_90_set_traits<polygon_set_type>::coordinate_type>::unsigned_area_type max_height) { + typedef typename polygon_90_set_traits<polygon_set_type>::coordinate_type Unit; + typedef typename coordinate_traits<Unit>::unsigned_area_type uat; + std::list<polygon_90_data<Unit> > polys; + assign(polys, polygon_set); + clear(polygon_set); + typename std::list<polygon_90_data<Unit> >::iterator itr_nxt; + for(typename std::list<polygon_90_data<Unit> >::iterator itr = polys.begin(); itr != polys.end(); itr = itr_nxt){ + itr_nxt = itr; + ++itr_nxt; + rectangle_data<Unit> bbox; + extents(bbox, *itr); + uat pwidth = delta(bbox, HORIZONTAL); + if(pwidth > min_width && pwidth <= max_width){ + uat pheight = delta(bbox, VERTICAL); + if(pheight > min_height && pheight <= max_height){ + uat parea = area(*itr); + if(parea <= max_area && parea >= min_area) { + continue; + } + } + } + polys.erase(itr); + } + assign(polygon_set, polys); + return polygon_set; + } + + +} +} +#include "detail/polygon_90_set_view.hpp" +#endif |