2016-12-06 3 views
1

Когда многоугольник является выровненным по оси полем «POLYGON ((0 0,1 0,1 1,0 1))», то union_() не даст правильный результат, просто пустой вывод. Собственно, union_() любого многоугольника не должно быть пустым.Почему boost :: geometry :: union_ не может дать результат для выровненного по оси поля?

Но если вы измените зеленый многоугольник с выровненной по оси поля на «POLYGON» ((2 1,3,2,4 1,7,2,8 1,8)), тогда выдается осмысленный результат (не пустой).

Является ли это ошибкой boost union_()?

Большое спасибо

int main() 
{ 
    typedef boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > polygon; 

    polygon green, blue; 

    boost::geometry::read_wkt(
     "POLYGON((0 0,1 0,1 1,0 1))", 
     green); 

    boost::geometry::read_wkt(
     "POLYGON((2 1.3,2.4 1.7,2.8 1.8))", 
     blue); 

    std::deque<polygon> output; 
    boost::geometry::union_(green, blue, output); 

    int i = 0; 
    std::cout << "green && blue:" << std::endl; 
    BOOST_FOREACH(polygon const& p, output) 
    { 
     std::cout << i++ << ": " << boost::geometry::area(p) << std::endl; 
    } 

    return 0; 
} 
+0

Кажется, что я получил ответ. Но я должен проверить это. Просто вызовите boost :: geometry :: correct() для каждого многоугольника. И затем boost даст правильный результат для uion_() и intersection(). Подожди минуту. Позвольте мне проверить это. –

ответ

1

Существует simmilar вопрос об этом. Алгоритм требует некоторых предварительных условий. 1) Полигон должен быть по часовой стрелке. 2) Многоугольник имеет бо, закрывается, т. Е. Последняя точка просто совпадает с первой точкой.

Поэтому, чтобы исправить ошибки в данных ортогональных многоугольников, вызовите boost :: geometry :: correct(), чтобы данные соответствовали правилам. И алгоритм wil принимает многоугольник и дает правильный результат.

Why boost::geometry::intersection does not work correct?

Смежные вопросы