2016-12-28 2 views
4

Ich kämpfe mit Boost :: Polygon - anscheinend kann es alles außer dem, was ich will. Ich habe ein paar Grenzen, die Polygone und ihre Löcher beschreiben (im 2D-Raum). Im Allgemeinen können wir sogar ein Loch in einem Loch (kleineres Polygon im Loch eines größeren Polygons) oder viele Löcher in einem Polygon haben. Wenn es notwendig ist, kann ich überprüfen, welche Grenze ein Loch beschreibt und welches ein Polygon beschreibt. Manchmal sind die Grenzen getrennt (und sie enthalten sich nicht gegenseitig), was bedeutet, dass wir viele Polygone haben. Was ich will, ist eine Methode, die mir eine Reihe einfacher, keine Löcher enthaltender Polygone gibt, die zusammen ein "löchriges" Polygon bilden.C++: Liste einfacher Polygone aus Polygon mit Löchern

+1

klar ist nicht, was genau Sie wollen. Wenn Ihre Polygone Löcher haben, sind sie keine einfachen Polygone. Angenommen, Sie haben dieses Polygon mit einem Loch ▣, welche Art von Ausgabe möchten Sie? –

+0

Meine gewünschte Ausgabe ist, zwei Polygone zu erhalten, die zusammen ein Eingabe-Polygon mit Loch bilden. – Ch3shire

+0

Oh, Sie möchten die Eingabeform in einfache Polygone schneiden. –

Antwort

1

Dies ist mit Boost Polygon möglich. Sie benötigen polygon_set_data::get(), was das Loch für Sie bricht, wenn Sie von einem Polygon-Konzept, das Löcher unterstützt, in ein anderes umwandeln. Siehe: http://www.boost.org/doc/libs/1_65_0/libs/polygon/doc/gtl_polygon_set_concept.htm für weitere Details.

Das Folgende ist ein Beispiel, wo wir ein Polygon mit einem Loch zuerst darstellen, es dann mit nur einem Ring zu einem einfachen Polygon umwandeln:

#include <boost/polygon/polygon.hpp> 

namespace bp = boost::polygon; 

int main(void) 
{ 
    using SimplePolygon = bp::polygon_data<int>; 
    using ComplexPolygon = bp::polygon_with_holes_data<int>; 
    using Point = bp::point_data<int>; 
    using PolygonSet = bp::polygon_set_data<int>; 
    using SimplePolygons = std::vector<bp::polygon_data<int>>; 

    using namespace boost::polygon::operators; 

    std::vector<Point> points{{5, 0}, {10, 5}, {5, 10}, {0, 5}}; 

    ComplexPolygon p; 
    bp::set_points(p, points.begin(), points.end()); 

    { 
    std::vector<Point> innerPoints{{4, 4}, {6, 4}, {6, 6}, {4, 6}}; 

    std::vector<SimplePolygon> inner(1, SimplePolygon{}); 
    bp::set_points(inner.front(), innerPoints.begin(), innerPoints.end()); 
    bp::set_holes(p, inner.begin(), inner.end()); 
    } 

    PolygonSet complexPolygons; 
    complexPolygons += p; 

    SimplePolygons simplePolygons; 
    complexPolygons.get<SimplePolygons>(simplePolygons); 

    std::cout << "Fractured:\n"; 
    for (const auto& polygon : simplePolygons) 
    { 
    for (const Point& p : polygon) 
    { 
     std::cout << '\t' << std::to_string(p.x()) << ", " << std::to_string(p.y()) 
       << '\n'; 
    } 
    } 

    return 0; 
} 
+0

Danke! Diese Frage wurde so lange aufgehängt, dass ich dir, egal was, ein Zeichen gab. – Ch3shire

+0

Wissen Sie, wie Sie umgekehrt vorgehen, d. H. Von einem polygon_set zu polygon_with_holes? –

+0

Ich bin mir nicht sicher, ob Boost Polygon das nativ unterstützt, aber es sollte nicht allzu schwierig sein, dies selbst zu implementieren, indem man nach den 'Fracturing'-Kanten sucht und sie entfernt. –

Verwandte Themen