2009-09-17 6 views
4

Je suis nouveau à la bibliothèque de géométrie générique qui est proposé pour inclusion avec boost:Initialiser un polygone en boost :: géométrie

http://geometrylibrary.geodan.nl/ 

J'ai deux vecteurs vector<int> Xb, Yb que je suis en train de créer un polygone. Je suis en train de faire quelque chose le long des lignes de l'extrait de code suivant:

polygon_2d P; 

vector<double>::const_iterator xi; 
vector<double>::const_iterator yi; 

for (xi=Xb.begin(), yi=Yb.begin(); xi!=Xb.end(); ++xi, ++yi) 
    P.push_back (make<point_2d>(*xi, *yi)); 

Le code ci-dessus ne fonctionne pas, se plaignant que P n'a pas une fonction membre push_back. Comment initialiser le polygone à partir de points ayant les coordonnées vector<int> Xb,vector<int> Yb?

+7

Une note rapide, le capot probable que la bibliothèque spécifique que vous mentionnez survivra un processus d'examen est très peu probable. Votre meilleure option aujourd'hui est d'écrire un wrapper C++ léger pour la bibliothèque Generic Polygon Clipper, car aucune des propositions proposées pour les opérations de polygones 2D ne se trouve à proximité de la performance GPC. –

+0

Merci pour la suggestion, Beh. GPC semble être une belle bibliothèque, mais il semble qu'il manque une caractéristique importante pour moi - à savoir la possibilité de calculer la surface d'un polygone. – dzhelil

+1

Dzhelil, heureusement l'algorithme de zone est trivial à implémenter. http://alienryderflex.com/polygon_area/ –

Répondre

6
append(P, make<point_2d>(*xi, *yi)); 
+0

Merci, cela résout le problème ci-dessus. Cependant, maintenant je cours dans un autre. Essayer d'intersecter un polygone_2d avec un autre polygone_2d renvoie une erreur. Les exemples montrent seulement comment faire des intersections entre box_2d et polygon_2d. Les intersections entre les polygones sont-elles possibles? – dzhelil

12

est ici par exemple à l'extension de votre question initiale que vous avez demandé un commentaire ci-dessous la réponse de Kirill: sont des intersections entre les polygones possibles?

Oui, les intersections de polygones de polygone sont pris en charge par Boost.Geometry (aka GGL)

#include <iostream> 
#include <vector> 
#include <boost/geometry/geometry.hpp> 
#include <boost/geometry/geometries/cartesian2d.hpp> 
#include <boost/geometry/geometries/adapted/c_array_cartesian.hpp> 

using namespace boost::geometry; 

int main(void) 
{ 
    // Define a polygons and fill the outer rings. 
    polygon_2d a; 
    { 
     const double c[][2] = { 
      {160, 330}, {60, 260}, {20, 150}, {60, 40}, {190, 20}, {270, 130}, {260, 250}, {160, 330} 
     }; 
     assign(a, c); 
    } 
    correct(a); 
    std::cout << "A: " << dsv(a) << std::endl; 

    polygon_2d b; 
    { 
     const double c[][3] = { 
      {300, 330}, {190, 270}, {150, 170}, {150, 110}, {250, 30}, {380, 50}, {380, 250}, {300, 330} 
     }; 
     assign(b, c); 
    } 
    correct(b); 
    std::cout << "B: " << dsv(b) << std::endl; 

    // Calculate interesection 
    typedef std::vector<polygon_2d > polygon_list; 
    polygon_list v; 

    intersection_inserter<polygon_2d>(a, b, std::back_inserter(v)); 
    std::cout << "Intersection of polygons A and B" << std::endl; 
    for (polygon_list::const_iterator it = v.begin(); it != v.end(); ++it) 
    { 
     std::cout << dsv(*it) << std::endl; 
    } 

    return 0; 
} 

Here est le résultat (le polygone étant intersection est déplacé vers le sud pour une meilleure visibilité):

alt text

I J'espère que cela fonctionnera pour vous.

0

Vous pouvez également utiliser un tuple pour initialiser le polygone

#include <boost/geometry/geometries/adapted/boost_tuple.hpp> 

et

boost::geometry::assign_points(
    polygon, boost::assign::tuple_list_of 
     (300, 330) (190, 270) (150, 170) (150, 110) (250, 30) (380, 50) 
     (380, 250) (300, 330) 
);