2016-12-28 3 views
4

Je suis aux prises avec Boost :: Polygon - apparemment, il peut tout faire sauf la chose que je veux. J'ai quelques limites décrivant l'ensemble des polygones et leurs trous (dans l'espace 2d). En général, nous pouvons même avoir un trou dans un trou (plus petit polygone dans le trou d'un plus grand polygone) ou plusieurs trous dans un polygone. Si nécessaire, je peux vérifier quelle frontière décrit un trou et qui décrit un polygone. Parfois, les frontières sont séparées (et ne se contiennent pas les unes les autres), ce qui signifie que nous avons beaucoup de polygones. Ce que je veux, c'est une méthode qui me donne un ensemble de polygones simples, ne contenant pas de trous, qui forment ensemble un polygone «troué».C++: Obtenir la liste des polygones simples à partir du polygone avec des trous

+1

Il est pas clair ce que vous voulez exactement. Si vos polygones ont des trous, ils ne sont pas de simples polygones. Supposons que vous ayez ce polygone avec un trou ▣, quel genre de sortie voulez-vous? –

+0

Ma sortie désirée est d'obtenir deux polygones qui forment ensemble un polygone d'entrée avec trou. – Ch3shire

+0

Oh, donc vous voulez couper la forme d'entrée en polygones simples. –

Répondre

1

Ceci est possible avec Boost Polygon. Vous avez besoin de polygon_set_data::get(), qui fait la fracturation du trou pour vous au cas où vous convertissez d'un concept de polygone supportant des trous à celui qui ne le fait pas. Voir: pour plus de détails.

Voici un exemple où nous représentons un polygone avec un premier trou, puis le convertir en un polygone simple avec un seul anneau:

#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

Merci! Cette question a été suspendue pendant si longtemps que je vous donne d'accepter la marque, peu importe quoi. – Ch3shire

+0

Savez-vous comment aller dans l'autre sens, c'est-à-dire d'un polygone_set à un polygone_avec des trous? –

+0

Je ne suis pas sûr que Boost Polygon supporte cela en mode natif, mais il ne devrait pas être trop difficile de l'implémenter vous-même, en recherchant les bords de 'fracturation' et en les supprimant. –