Skip to content

UNION fails to output simple polygons. #1083

@baobaotuo

Description

@baobaotuo

I have this example.

    const Clipper2Lib::Path64 polygon = {
        {0, 0, 0},
        {-1296208, -753754, -38748},
        {-2436151, -1712448, -56988},
        {-3502931, -2766654, -81247},
        {-3641113, -2903207, -81777},
        {-2855175, -4180823, -81394},
        {-2069237, -5458438, -80305},
        {-1283300, -6736052, -78619},
        {-497362, -8013666, -76406},
        {288575, -9291280, -73786},
        {1074511, -10568893, -70842},
        {1860448, -11846505, -67666},
        {2646384, -13124118, -64370},
        {3432320, -14401730, -61024},
        {4218257, -15679342, -57747},
        {5004193, -16956955, -54621},
        {5790130, -18234568, -51739},
        {6576067, -19512181, -49213},
        {7362004, -20789796, -47113},
        {8147942, -22067410, -45560},
        {8933880, -23345025, -44633},
        {9642555, -24658213, -44459},
        {10102208, -26086050, -45563},
        {10561861, -27513885, -48067},
        {11021512, -28941718, -51752},
        {11481163, -30369548, -56514},
        {11940813, -31797375, -62106},
        {12400463, -33225199, -68430},
        {12860111, -34653022, -75252},
        {13319759, -36080842, -82460},
        {13779407, -37508662, -89836},
        {14239054, -38936482, -97245},
        {14698702, -40364302, -104497},
        {15158351, -41792124, -111426},
        {15618000, -43219948, -117875},
        {16077650, -44647775, -123645},
        {16537300, -46075604, -128610},
        {16996952, -47503436, -132546},
        {17456604, -48931271, -135336},
        {17916258, -50359107, -136758},
        {18530672, -51718540, -136883},
        {19277175, -53019591, -136542},
        {20023677, -54320642, -135909},
        {20770180, -55621693, -135028},
        {21516682, -56922744, -133948},
        {22263185, -58223794, -132702},
        {23009687, -59524845, -131342},
        {23756190, -60825895, -129904},
        {24502692, -62126945, -128432},
        {25249194, -63427996, -126975},
        {25995697, -64729046, -125565},
        {26742199, -66030097, -124255},
        {27488702, -67331147, -123081},
        {28235204, -68632198, -122086},
        {28981707, -69933249, -121319},
        {29728210, -71234300, -120815},
        {30474712, -72535351, -120621},
        {31280978, -73800083, -118875},
        {32091933, -75061955, -113396},
        {32902880, -76323814, -104716},
        {33713817, -77585657, -93203},
        {34524744, -78847485, -79504},
        {35335662, -80109298, -63994},
        {36146572, -81371100, -47219},
        {36957477, -82632894, -29707},
        {37768381, -83894685, -11854},
        {38579286, -85156479, 5716},
        {39390195, -86418279, 22640},
        {40201112, -87680091, 38333},
        {41012038, -88941916, 52319},
        {41822973, -90203757, 64164},
        {42633919, -91465614, 73250},
        {43444873, -92727485, 79210},
        {44255833, -93989363, 81468},
        {45049777, -95262008, 82129},
        {45842560, -96535386, 84125},
        {46635342, -97808762, 87265},
        {47428122, -99082136, 91400},
        {48220901, -100355509, 96309},
        {49013680, -101628879, 101801},
        {49806457, -102902249, 107717},
        {50599234, -104175617, 113827},
        {51392011, -105448986, 119975},
        {52184788, -106722354, 125963},
        {52977566, -107995725, 131578},
        {53770345, -109269096, 136673},
        {54563125, -110542470, 141023},
        {55355906, -111815846, 144452},
        {56148689, -113089224, 146777},
        {56941472, -114362602, 147786},
        {57664839, -115676033, 148076},
        {58370492, -116999684, 149044},
        {59076146, -118323335, 150642},
        {59781799, -119646985, 152794},
        {60487452, -120970634, 155373},
        {61193104, -122294283, 158305},
        {61898757, -123617931, 161482},
        {62604409, -124941579, 164799},
        {63310061, -126265227, 168178},
        {64015713, -127588875, 171497},
        {64721365, -128912523, 174679},
        {65427018, -130236172, 177618},
        {66132671, -131559821, 180207},
        {66838324, -132883471, 182371},
        {67543977, -134207122, 183983},
        {68249631, -135530773, 184968},
        {68963631, -136849781, 185326},
        {69716007, -138147440, 188350},
        {70468377, -139445088, 195334},
        {71220737, -140742720, 205580},
        {71973088, -142040336, 218327},
        {72725430, -143337937, 232865},
        {73477767, -144635528, 248541},
        {74230102, -145933116, 264626},
        {74982438, -147230707, 280381},
        {75734780, -148528306, 295100},
        {76487130, -149825920, 308125},
        {77239489, -151123549, 318727},
        {77991857, -152421195, 326150},
        {78744233, -153718854, 329714},
        {79513439, -155006545, 331548},
        {80290024, -156289845, 338822},
        {81066590, -157573114, 351667},
        {81843132, -158856342, 369205},
        {82619644, -160139522, 391022},
        {83396130, -161422657, 416171},
        {84172588, -162705748, 444282},
        {84949026, -163988805, 474422},
        {85725447, -165271833, 506210},
        {86501859, -166554848, 538714},
        {87278268, -167837856, 571554},
        {88054684, -169120876, 603796},
        {88831110, -170403913, 635062},
        {89607556, -171686984, 664418},
        {90384024, -172970091, 691483},
        {91160521, -174253244, 715325},
        {91937045, -175536443, 735581},
        {92713597, -176819689, 751273},
        {93490171, -178102971, 762025},
        {94266761, -179386279, 766961},
        {94497229, -179767126, 767296},
        {95785121, -178998143, 768387},
        {97073011, -178229162, 770542},
        {98360903, -177460179, 772086},
        {99648794, -176691197, 773102},
        {100936682, -175922217, 777015},
        {102224562, -175153242, 783351},
        {103512436, -174384270, 791386},
        {104800304, -173615301, 800409},
        {106088172, -172846334, 809709},
        {107376041, -172077365, 818571},
        {108663916, -171308392, 826283},
        {109951798, -170539416, 832135},
        {111239687, -169770435, 835402},
        {111887832, -169383437, 835852},
        {111158985, -168072417, 833182},
        {110430146, -166761411, 825598},
        {109701320, -165450429, 813859},
        {108972511, -164139476, 798480},
        {108243716, -162828550, 780273},
        {107514935, -161517649, 759874},
        {106786165, -160206767, 737885},
        {106057401, -158895896, 715123},
        {105328639, -157585027, 692092},
        {104599872, -156274153, 669577},
        {103871098, -154963263, 648243},
        {103142312, -153652352, 628671},
        {102413510, -152341414, 611687},
        {101684693, -151030448, 597788},
        {100955862, -149719455, 587782},
        {100227018, -148408441, 582324},
        {99494215, -147099636, 580988},
        {98756374, -145793660, 577073},
        {98018540, -144487696, 569394},
        {97280716, -143181750, 558532},
        {96542902, -141875821, 545066},
        {95805098, -140569911, 529435},
        {95067303, -139264015, 512307},
        {94329513, -137958131, 494080},
        {93591727, -136652251, 475377},
        {92853940, -135346371, 456732},
        {92116151, -134040485, 438604},
        {91378354, -132734587, 421656},
        {90640549, -131428675, 406285},
        {89902734, -130122744, 393120},
        {89164908, -128816795, 382677},
        {88427073, -127510829, 375458},
        {87689231, -126204852, 372080},
        {86942850, -124903748, 371068},
        {86192716, -123604793, 367468},
        {85442585, -122305845, 361262},
        {84692460, -121006907, 352791},
        {83942341, -119707978, 342550},
        {83192227, -118409059, 330816},
        {82442118, -117110147, 318063},
        {81692011, -115811240, 304646},
        {80941905, -114512335, 290932},
        {80191799, -113213429, 277387},
        {79441691, -111914519, 264298},
        {78691579, -110615603, 252144},
        {77941462, -109316678, 241265},
        {77191339, -108017743, 232041},
        {76441211, -106718799, 224935},
        {75691078, -105419846, 220246},
        {74940941, -104120888, 218429},
        {74204499, -102814127, 216807},
        {73469324, -101506652, 211691},
        {72734155, -100199188, 203575},
        {71998995, -98891739, 192825},
        {71263842, -97584304, 180039},
        {70528696, -96276882, 165634},
        {69793556, -94969470, 150076},
        {69058419, -93662063, 133928},
        {68323283, -92354658, 117550},
        {67588146, -91047250, 101518},
        {66853004, -89739835, 86273},
        {66117857, -88432409, 72262},
        {65382702, -87124970, 60059},
        {64647539, -85817517, 50015},
        {63912368, -84510050, 42721},
        {63177191, -83202572, 38620},
        {62426662, -81904040, 37843},
        {61650917, -80620210, 37701},
        {60875173, -79336379, 37411},
        {60099429, -78052549, 36997},
        {59323685, -76768718, 36480},
        {58547940, -75484888, 35878},
        {57772196, -74201057, 35216},
        {56996452, -72917227, 34509},
        {56220708, -71633397, 33783},
        {55444964, -70349566, 33055},
        {54669219, -69065736, 32346},
        {53893475, -67781905, 31680},
        {53117731, -66498075, 31072},
        {52341987, -65214245, 30549},
        {51566242, -63930414, 30126},
        {50790498, -62646584, 29827},
        {50014754, -61362753, 29673},
        {49084990, -60199190, 30047},
        {48027528, -59135345, 32495},
        {46970070, -58071503, 37147},
        {45912616, -57007666, 43662},
        {44855169, -55943835, 51932},
        {43797727, -54880010, 61616},
        {42740292, -53816191, 72550},
        {41682862, -52752377, 84493},
        {40625436, -51688568, 97187},
        {39568014, -50624763, 110474},
        {38510594, -49560959, 124022},
        {37453174, -48497156, 137728},
        {36395754, -47433352, 151225},
        {35338331, -46369546, 164428},
        {34280904, -45305736, 176967},
        {33223473, -44241922, 188743},
        {32166037, -43178102, 199419},
        {31108594, -42114275, 208845},
        {30051145, -41050443, 216761},
        {28993691, -39986605, 222912},
        {27936231, -38922762, 227128},
        {26878769, -37858916, 229114},
        {25996546, -36656451, 228836},
        {25204752, -35382459, 226677},
        {24412959, -34108468, 223136},
        {23621168, -32834480, 218682},
        {22829377, -31560493, 213780},
        {22037586, -30286506, 208897},
        {21245794, -29012517, 204497},
        {20454001, -27738527, 201046},
        {19662207, -26464534, 199012},
        {18826456, -25220526, 198414},
        {17929172, -24018496, 196171},
        {17031892, -22816470, 191620},
        {16134615, -21614450, 185103},
        {15237345, -20412437, 176755},
        {14340079, -19210431, 166921},
        {13442819, -18008432, 155785},
        {12545564, -16806441, 143606},
        {11648312, -15604454, 130647},
        {10751064, -14402471, 117098},
        {9853817, -13200491, 103284},
        {8956571, -11998511, 89343},
        {8059324, -10796530, 75641},
        {7162075, -9594546, 62287},
        {6264822, -8392557, 49667},
        {5367565, -7190562, 37877},
        {4470302, -5988560, 27307},
        {3573034, -4786552, 18057},
        {2675761, -3584535, 10501},
        {1778483, -2382513, 4789},
        {881201, -1180485, 1230},
        {0, 0, 0},
        {1469073, -293323, -68857},
        {2936969, -586411, -164120},
        {3210348, 323920, -137577},
        {2925747, 1794732, -64845},
        {2894086, 1958355, -63637},
        {3178741, 487263, -127736},
        {3100332, -619029, -169130},
        {1632066, -325867, -81143},
        {163432, -32632, -1167},
    };
    // clang-format on

    ASSERT_EQ(polygon.size(), 300);

    // ACTION
    // Run Clipper2 Union with EvenOdd fill rule to simplify the complex polygon.
    Clipper2Lib::Clipper64 clipper64;
    clipper64.AddSubject({polygon});

    Clipper2Lib::Paths64 simple_polygons;
    ASSERT_TRUE(clipper64.Execute(
        Clipper2Lib::ClipType::Union, Clipper2Lib::FillRule::EvenOdd, simple_polygons));

    ASSERT_EQ(simple_polygons.size(), 4);

    // The polygon returned at pos 1 is not actually a simple polygon.
    // simple_polygon[1] (6 vertices):
    // vertex[0]: x=1389918 y=-277518 z=-66551
    // vertex[1]: x=1632066 y=-325867 z=-81143
    // vertex[2]: x=3100332 y=-619029 z=-169130
    // vertex[3]: x=3153823 y=135698 z=-141977
    // vertex[4]: x=2936969 y=-586411 z=-164120
    // vertex[5]: x=1469073 y=-293323 z=-68857

    // Find the 6-vertex simple polygon (index 1).
    const Clipper2Lib::Path64 &polygon_6 = simple_polygons[1];
    ASSERT_EQ(polygon_6.size(), 6);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions