Boost logo

Geometry :

Subject: Re: [geometry] Strange behavior at difference algorithm
From: Adam Wulkiewicz (adam.wulkiewicz_at_[hidden])
Date: 2015-03-17 10:38:28


Hi,

Franz Alt wrote:
> Hi,
>
> I've written a simple test program using the difference algorithm of
> geometry. I want to build the difference of two simple rectangle
> polygons (see attachment input.png).
>
> Regardless of whether I subtract polygon A from B or I subtract B from
> A I got very strange output polygons (see attachments output1.png and
> output2.png).
>
> I've tested with Boost 1.56, 1.57 and the beta of 1.58. All versions
> lead to the same results.
>
> Does someone know what is wrong here?

Which compiler exactly are you using and on which platform?
What flags were passed into the compiler?
In particular, was optimization enabled?

I get the correct results (attached) on windows msvc12, mingw4.9.1 and
linux gcc 4.8.2.
Using latest develop and 1.57 (though I tested the latter only on msvc12).

The attached svg files were generated with bg::svg_mapper
(http://www.boost.org/doc/libs/1_57_0/libs/geometry/doc/html/geometry/reference/io/svg/svg_mapper.html).
In the file green_output2.svg there is green and output2[0] from your
code so (blue \ green). In the output1_blue.svg output1[0] (green \
blue) and blue.

What's the output of your program? For me it's:

polygon #0: (15802,253.976) (15943,254) (15943,-1485) (15802,-1485)
(15802,253.976)
polygon #1: (-7901,250.024) (-7901,-1485) (-8042,-1485) (-8042,250)
(-7901,250.024)

----
polygon #0: (-7901,250.024) (-7901,529) (15802,544) (15802,253.976) 
(-7901,250.024)
<tldr>
Btw, you can use bg::wkt(), there is no need to manually print 
coordinates (see: 
http://www.boost.org/doc/libs/1_57_0/libs/geometry/doc/html/geometry/reference/io/wkt/wkt.html).
E.g. this:
   namespace bg = boost::geometry;
   std::cout << "green: " << bg::wkt(green) << std::endl;
   std::cout << "blue: " << bg::wkt(blue) << std::endl;
   std::cout << "output1: " << bg::wkt(output1[0]) << std::endl;
   std::cout << "output2: " << bg::wkt(output2[0]) << std::endl;
prints:
green: POLYGON((-8042 -1485,-8042 250,-8042 250,15943 254,15943 
-1485,-8042 -1485))
blue: POLYGON((-7901 -1485,-7901 529,-7901 529,15802 544,15802 
-1485,-7901 -1485))
output1: POLYGON((15802 253.976,15943 254,15943 -1485,15802 -1485,15802 
253.976))
output2: POLYGON((-7901 250.024,-7901 529,15802 544,15802 253.976,-7901 
250.024))
Instead of std::vector<polygon> you could use 
bg::multi_polygon<polygon>. Then it'd be handled by wkt() or svg_mapper 
automatically.
</tldr>
Regards,
Adam







Geometry list run by mateusz at loskot.net