|
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