Ticket #8310: geom.cpp

File geom.cpp, 3.6 KB (added by Paolo Giangrandi <paolo@…>, 10 years ago)

A C++11 source file that reproduces this bug. It can be compiled with `g++ --std=c++11 -o geom geom.cp'

Line 
1
2#include <boost/geometry.hpp>
3#include <boost/geometry/geometries/point_xy.hpp>
4#include <boost/geometry/geometries/polygon.hpp>
5#include <iostream>
6
7using namespace boost::geometry;
8
9typedef model::d2::point_xy<float> point;
10typedef model::polygon<point, true, false> polygon;
11
12
13void print( const polygon &poly )
14{
15 bool first = true;
16 std::cout << "POLYGON(( ";
17 for( const point &p : poly.outer() ) {
18 if( first ) {
19 first = false;
20 }
21 else {
22 std::cout << ", ";
23 }
24 std::cout << p.x() << " " << p.y();
25 }
26 std::cout << " ))" << std::endl;
27}
28void print( const std::vector< polygon > &out )
29{
30 for( const polygon &poly : out ) {
31 std::cout << "\t";
32 print( poly );
33 }
34 std::cout << std::endl;
35}
36
37void testDiff( const polygon &a, const polygon &b )
38{
39 std::vector< polygon > out;
40 boost::geometry::difference( a, b, out );
41
42 print( out );
43}
44void testSymDiff( const polygon &a, const polygon &b )
45{
46 std::vector< polygon > out;
47 boost::geometry::sym_difference( a, b, out );
48 print( out );
49}
50void testIntersection( const polygon &a, const polygon &b )
51{
52 std::vector< polygon > out;
53 boost::geometry::intersection( a, b, out );
54 print( out );
55}
56void testUnion( const polygon &a, const polygon &b )
57{
58 std::vector< polygon > out;
59 boost::geometry::union_( a, b, out );
60 print( out );
61}
62void test( const polygon &a, const polygon &b )
63{
64 std::cout << "a: ";
65 print( a );
66 std::cout << "b: ";
67 print( b );
68 std::cout << std::endl;
69
70 std::cout << "a - b:" << std::endl;
71 testDiff( a, b );
72 std::cout << "b - a:" << std::endl;
73 testDiff( b, a );
74 std::cout << "b ^ a:" << std::endl;
75 testSymDiff( a, b );
76 std::cout << "b & a:" << std::endl;
77 testIntersection( b, a );
78 std::cout << "b | a:" << std::endl;
79 testUnion( b, a );
80 std::cout << "disjoint: " << boost::geometry::disjoint( a, b ) << std::endl;
81 std::cout << "intersects: " << boost::geometry::intersects( a, b ) << std::endl;
82}
83void test( const std::string &aStr, const std::string &bStr )
84{
85 polygon a, b;
86
87 boost::geometry::read_wkt( aStr, a);
88 boost::geometry::correct( a );
89 boost::geometry::read_wkt( bStr, b );
90 boost::geometry::correct( b );
91
92 test( a, b );
93}
94
95int main( )
96{
97 std::cout.precision( 15 );
98 std::cout << std::fixed;
99
100 test( "POLYGON(( -2.559375047683716 -0.615625500679016, -2.559375047683716 0.384374797344208, 7.940625190734863 0.384374588727951, 7.940625190734863 -0.615625441074371 ))",
101 "POLYGON(( 1.000000000000000 0.384374707937241, 1.000000000000000 0.000000000000000, 0.000000000000000 0.000000000000000, 0.000000000000000 0.384374737739563 ))" );
102 std::cout << " = = = = = " << std::endl << std::endl;
103
104 test( "POLYGON(( 0.000000000000000 0.373437941074371, 1.000000000000000 0.373437792062759, 1.000000000000000 0.000000000000000, 0.000000000000000 0.000000000000000 ))",
105 "POLYGON(( -2.592187881469727 -0.626561701297760, -2.592187643051147 0.373438000679016, 7.907812595367432 0.373437851667404, 7.907812595367432 -0.626561224460602 ))" );
106 std::cout << " = = = = = " << std::endl << std::endl;
107
108 test( "POLYGON(( 1.000000000000000 2.531045913696289, 1.000000000000000 3.000000000000000, 2.000000000000000 3.000000000000000, 2.000000000000000 2.531045913696289 ))",
109 "POLYGON(( 5.204249382019043 3.531043529510498, 5.204247951507568 2.531045675277710, -5.295750617980957 2.531046152114868, -5.295751094818115 3.531045913696289 ))" );
110 std::cout << " = = = = = " << std::endl << std::endl;
111
112 std::cout << "This one is working as expected...." << std::endl;
113 test( "POLYGON(( 1. 2., 1. 3., 2. 3., 2. 2. ))",
114 "POLYGON(( 5. 3., 5. 2., -5. 2., -5. 3. ))" );
115
116 /*
117
118 test( "POLYGON(( ))",
119 "POLYGON(( ))" );
120 std::cout << " = = = = = " << std::endl << std::endl;
121 */
122 return 0;
123}