Ticket #7983: test_polygon_diff.cpp

File test_polygon_diff.cpp, 3.0 KB (added by jp.charras@…, 10 years ago)

sample of erroeous polygon when using gcc 4.7 with -O2 optimization level

Line 
1/*
2 * This sample calculates the diff of 2 polygons.
3 * It works fine when compiled with g++ 4.4 and 4.6 with optimization -O2
4 * When compiled with g++ 4.7 :
5 * with optimization -O2 the result is false (void polygon)
6 * with optimization -O1 or -00 the result is OK
7 *
8 * Note also the same issue exists with the sum of these 2 polygons.
9 */
10
11#include <vector>
12#include <boost/polygon/polygon.hpp>
13
14#include <stdio.h>
15
16// Define some types used here from boost::polygon
17namespace bpl = boost::polygon; // bpl = boost polygon library
18using namespace bpl::operators; // +, -, =, ...
19
20// Definitions needed by boost::polygon
21typedef int coordinate_type;
22
23/**
24 * KI_POLYGON defines a single polygon ( boost::polygon_data type.
25 */
26typedef bpl::polygon_data<int> KI_POLYGON;
27
28/**
29 * KI_POLYGON_SET defines a set of single KI_POLYGON.
30 * A KI_POLYGON_SET is used to store a set of polygons
31 * when performing operations between 2 polygons
32 * or 2 sets of polygons
33 * The result of operations like and, xor... between 2 polygons
34 * is always stored in a KI_POLYGON_SET, because these operations
35 * can create many polygons
36 */
37typedef std::vector<KI_POLYGON> KI_POLYGON_SET;
38
39/**
40 * KI_POLY_POINT defines a point for boost::polygon.
41 * KI_POLY_POINT store x and y coordinates (int)
42 */
43typedef bpl::point_data<int> KI_POLY_POINT;
44
45
46int polyset_main[]=
47{
48 -10, -10,
49 -10, 10,
50 10, 10,
51 10, -10
52};
53int polyset_main_corner_count = 4;
54
55// polyset polygons count 2
56int polyset_holes[]=
57{
58 -5, -5,
59 -5, 5,
60 5, 5,
61 5, -5
62};
63int polyset_holes_corner_count = 4;
64
65void CopyPolygons( KI_POLYGON_SET& aKiPolyList, int polyset[], int corners_count )
66{
67 std::vector<KI_POLY_POINT> cornerslist;
68
69 KI_POLYGON poly;
70 for( int ii = 0; ii < corners_count; ii++ )
71 {
72 int jj = ii * 2;
73 cornerslist.push_back( KI_POLY_POINT( polyset[jj], polyset[jj+1] ) );
74 }
75
76 bpl::set_points( poly, cornerslist.begin(), cornerslist.end() );
77 aKiPolyList.push_back( poly );
78}
79
80// Debug function: dump a KI_POLYGON_SET to stdout
81// each corner is output under <xcoord>, <ycoord>
82void dumpPolySet( const KI_POLYGON_SET& polyset )
83{
84 printf("// polyset polygons count %d\n", polyset.size());
85 for( unsigned kk = 0; kk < polyset.size(); kk++ )
86 {
87 const KI_POLYGON& poly = polyset[kk];
88 printf("**** polygon %d, corners count %d\n", kk, poly.size() );
89 for( unsigned ij = 0; ij < poly.size(); ij++ )
90 {
91 printf( " %d, %d\n", (poly.begin() + ij)->x(),
92 (poly.begin() + ij)->y() );
93 }
94 printf("\n");
95 }
96}
97
98
99int main()
100{
101 KI_POLYGON_SET polys_main;
102 CopyPolygons( polys_main, polyset_main, polyset_main_corner_count );
103
104 KI_POLYGON_SET polys_holes;
105 CopyPolygons( polys_holes, polyset_holes, polyset_holes_corner_count );
106
107 polys_main -= polys_holes;
108
109 dumpPolySet( polys_main );
110
111 return 0;
112}