2009-09-17 3 views
4

Я новичок в общую библиотеку геометрии, которая предлагается для включения с усилением:Инициализация многоугольник повышения :: геометрии

http://geometrylibrary.geodan.nl/ 

У меня есть два вектора vector<int> Xb, Yb что я пытаюсь создать многоугольник. Я пытаюсь получить что-то вдоль линий в следующем фрагменте кода:

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)); 

Приведенный выше код не работает, жалуясь, что P не имеет функции в push_back члена. Как инициализировать многоугольник из точек с координатами vector<int> Xb,vector<int> Yb?

+7

быстрого примечания, вероятный капота, что конкретная библиотека вы упоминаете выживете процесс обзора весьма маловероятна. Ваш лучший вариант сегодня - написать легковесную C++-оболочку для библиотеки Generic Polygon Clipper, так как ни одно из предлагаемых представлений для операций двумерного многоугольника не приближается к производительности GPC. – 2009-09-17 20:12:12

+0

Спасибо за предложение, Beh. GPC выглядит как хорошая библиотека, однако, похоже, у меня отсутствует важная для меня функция - а именно, возможность вычислить область многоугольника. – dzhelil

+1

Dzhelil, к счастью, алгоритм области тривиально реализовать. http://alienryderflex.com/polygon_area/ –

ответ

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

Спасибо, это решает вышеуказанную проблему. Однако теперь я бегу в другой. Попытка пересечь polygon_2d с другим polygon_2d возвращает ошибку. В примерах показано, как выполнять пересечения между box_2d и polygon_2d. Возможны ли пересечения между многоугольниками? – dzhelil

12

Вот пример расширения вашего первоначального вопроса вы задали в качестве комментария ниже ответа Кирилла: ли пересечение между полигонами возможно?

Да, полигон-полигон перекрестки поддерживаются 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 является результатом (многоугольник является пересечением перемещается на юг для лучшей видимости):

alt text

I надеюсь, что это сработает для вас.

0

Вы также можете использовать кортеж для инициализации многоугольника

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

и

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) 
); 
Смежные вопросы