[Boost-bugs] [Boost C++ Libraries] #8364: "Overlay invalid input exception" (1)

Subject: [Boost-bugs] [Boost C++ Libraries] #8364: "Overlay invalid input exception" (1)
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2013-04-02 08:13:59


#8364: "Overlay invalid input exception" (1)
-----------------------------------------------------+----------------------
 Reporter: Volker Schöch <vschoech@…> | Owner: barendgehrels
     Type: Bugs | Status: new
Milestone: To Be Determined | Component: geometry
  Version: Boost 1.52.0 | Severity: Problem
 Keywords: polygon, multi polygon, difference |
-----------------------------------------------------+----------------------
 Please find below some code that triggers "Overlay invalid input
 exception" (in the last statement of the example). I have a couple of
 different reproductions, and since I'm not sure if they all share the same
 root cause, I'm filing them in separate tickets.

 As always, my polygon type is oriented '''counter-clockwise''' and '''not
 closed''', my point type is based on '''int'''.

 This is the data that triggers the exception:

 {{{
 _intPolygon polygon( "MULTIPOLYGON(((1031 1056,3232 1056,3232 2856,1031
 2856)))" );
 polygon -= _intPolygon( "MULTIPOLYGON(((1032 1458,1032 1212,2136 2328,3234
 2220,3234 2412,2136 2646)))" );
 polygon -= _intPolygon( "MULTIPOLYGON(((1032 1764,1032 1458,2136 2646,3234
 2412,3234 2532,2136 2790)))" );
 polygon -= _intPolygon( "MULTIPOLYGON(((1032 2130,1032 1764,2052
 2712)),((3234 2580,2558 2690,3234 2532)),((2558 2690,2136 2790,2052
 2712,2136 2760)))" );
 polygon -= _intPolygon( "MULTIPOLYGON(((1032 2556,1032 2130,1778
 2556)),((3234 2580,2136 2760,1778 2556,3234 2556)))" );
 }}}

 This is my code that wraps boost::geometry to implement the operators used
 above:

 {{{
 template<typename T>
 template<typename Geometry>
 _TPolygon< T > _TPolygon< T >::operator-(Geometry const& geometry) const
 {
        // should not be necessary
        //if( boost::geometry::area(geometry)==0 ) return *this;

        _TPolygon< T > polygonOut;
        boost::geometry::difference(*this, geometry, polygonOut);

        // should not be necessary
        //boost::geometry::correct( polygonOut );

        return polygonOut;
 }

 template<typename T>
 template<typename Geometry>
 _TPolygon<T>& _TPolygon< T >::operator-=(Geometry const& geometry)
 {
        // boost::geometry::difference cannot operate in-place
        // http://lists.boost.org/geometry/2012/02/1796.php
        *this = *this - geometry;
        return *this;
 }

 template<typename T>
 template<typename Geometry>
 _TPolygon< T > _TPolygon< T >::operator^(Geometry const& geometry) const
 {
        _TPolygon< T > polygonOut;
        boost::geometry::sym_difference(*this, geometry, polygonOut);

        // should not be necessary
        //boost::geometry::correct( polygonOut );

        return polygonOut;
 }
 }}}

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/8364>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:12 UTC