Opened 9 years ago
Closed 3 years ago
#9768 closed Bugs (duplicate)
difference of multi-polygon and box returns multi-polygon with redundant points
Reported by: | Owned by: | Barend Gehrels | |
---|---|---|---|
Milestone: | To Be Determined | Component: | geometry |
Version: | Boost 1.56.0 | Severity: | Problem |
Keywords: | difference, multi-polygon, polygon, box, unique | Cc: |
Description
boost::geometry::difference should not add redundant points to a polygon. In the following example I subtract an empty box from a polygon, and the result ends up representing the empty box even though obviously it should not. My polygon type is oriented counter-clockwise and not closed, my point type is based on int.
This is the data used as input to difference:
_TPolygon<int> const polygon = _TPolygon<int>( "MULTIPOLYGON(((249 509,5103 509,5103 3566,249 3566)))" ) - _TRect<int>( "POLYGON((1220 1019,1220 1019,1220 1019,1220 1019,1220 1019))" );
This is the resulting multi-polygon, with the additional/redundant empty box:
MULTIPOLYGON(((249 509,5103 509,5103 3566,249 3566),(1220 1019,1220 1019,1220 1019)))
This is my code that wraps boost::geometry to implement the operator used above:
template<typename T> template<typename Geometry> _TPolygon< T > _TPolygon< T >::operator-(Geometry geometry) const { _TPolygon< T > polygonOut; boost::geometry::difference(*this, geometry, polygonOut); // the following line fixes the problem but should not be necessary //boost::geometry::unique( polygonOut ); return polygonOut; }
These are the traits as defined to use _TRect<...> as a boost::geometry box:
namespace boost { namespace geometry { namespace traits { template<typename T> struct tag< _TRect<T> > { typedef box_tag type; }; template<typename T> struct point_type< _TRect<T> > { typedef _TPoint<T> type; }; template<typename T, std::size_t Dimension> struct indexed_access< _TRect<T>, min_corner, Dimension > { typedef typename geometry::coordinate_type< _TPoint<T> >::type coordinate_type; static inline coordinate_type get(_TRect<T> const& rect) { return geometry::get<Dimension>( rect.TopLeft() ); } static inline void set(_TRect<T>& rect, coordinate_type const& value) { geometry::set<Dimension>( rect.TopLeft(), value ); } }; template<typename T, std::size_t Dimension> struct indexed_access< _TRect<T>, max_corner, Dimension > { typedef typename geometry::coordinate_type< _TPoint<T> >::type coordinate_type; static inline coordinate_type get(_TRect<T> const& rect) { return geometry::get<Dimension>( rect.BottomRight() ); } static inline void set(_TRect<T>& rect, coordinate_type const& value) { geometry::set<Dimension>( rect.BottomRight(), value ); } }; } } } // namespace boost::geometry::traits
Change History (2)
comment:1 by , 8 years ago
Version: | Boost 1.55.0 → Boost 1.56.0 |
---|
comment:2 by , 3 years ago
Resolution: | → duplicate |
---|---|
Status: | new → closed |
Transfered to https://github.com/boostorg/geometry/issues/602
Originally filed for 1.55.0, still present in 1.56.0.