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

Subject: [Boost-bugs] [Boost C++ Libraries] #8365: "Overlay invalid input exception" (2)
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2013-04-02 08:16:46


#8365: "Overlay invalid input exception" (2)
----------------------------------------------------------------+-----------
 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, sym_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(((971 1402,5395 1402,5395 3353,971
 3353)))" );
 {
 _intPolygon const polygonB = _intPolygon("MULTIPOLYGON(((966 2862,1704
 3348,2442 3186,3180 2376,3912 1722,4650 1398,5388 1560,5388 32767,966
 32767)))") ^ _intPolygon("MULTIPOLYGON(((966 2700,1704 3348,2442 3186,3180
 2376,3912 1884,4650 1398,5388 1560,5388 32767,966 32767)))");
        polygon -= polygonB;
 }
 {
        _intPolygon const polygonB = _intPolygon("MULTIPOLYGON(((966
 2700,1704 3348,2442 3186,3180 2376,3912 1884,4650 1398,5388 1560,5388
 32767,966 32767)))") ^ _intPolygon("MULTIPOLYGON(((966 2700,1704 3024,2442
 3186,3180 2376,3912 1884,4650 1722,5388 1560,5388 32767,966 32767)))");
        polygon -= polygonB;
 }
 {
        _intPolygon const polygonB = _intPolygon("MULTIPOLYGON(((966
 2700,1704 3024,2442 3186,3180 2376,3912 1884,4650 1722,5388 1560,5388
 32767,966 32767)))") ^ _intPolygon("MULTIPOLYGON(((966 2208,1704 3024,2442
 3186,3180 2376,3912 2376,4650 1722,5388 1560,5388 32767,966 32767)))");
        polygon -= polygonB;
 }
 }}}

 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/8365>
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