2016-08-07 9 views
1

Я пытаюсь найти часть линейной строки, которая находится внутри многоугольника. Я попробовал функцию intersection, но, похоже, просто нашел фактические точки пересечения, а не часть линии, которая перекрывает многоугольник. Есть ли способ получить этот объект?Пересечение boost :: geometry :: model :: linestring with boost :: geometry :: model :: polygon

Вот демо ситуация:

#include <iostream> 
#include <fstream> 

#include <boost/geometry.hpp> 
#include <boost/geometry/geometries/point_xy.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 
#include <boost/geometry/io/svg/svg_mapper.hpp> 
#include <boost/geometry/geometries/linestring.hpp> 

using point_type = boost::geometry::model::d2::point_xy<double>; 
using polygon_type = boost::geometry::model::polygon<point_type>; 
using linestring_type = boost::geometry::model::linestring<point_type>; 

int main() 
{ 
    polygon_type polygon; 

    polygon.outer().push_back(point_type{10,10}); 
    polygon.outer().push_back(point_type{12,10}); 
    polygon.outer().push_back(point_type{12,12}); 
    polygon.outer().push_back(point_type{10,12}); 
    polygon.outer().push_back(point_type{10,10}); 

    linestring_type linestring; 
    linestring.push_back(point_type{11,9}); 
    linestring.push_back(point_type{11,11}); 
    linestring.push_back(point_type{13,11}); 

    // Expected intersections at (11, 10) and (12, 11) 

    std::ofstream svg("both.svg"); 

    linestring_type output; 
    boost::geometry::intersection(polygon, linestring, output); 

    for(auto iter = output.begin(); iter != output.end(); ++iter) { 
     std::cout << boost::geometry::get<0>(*iter) << " " << boost::geometry::get<1>(*iter) << std::endl; 
    } 
// The output is: 
// 11 10 
// 12 11 

// But I want it to be: 
// 11 10 
// 11 11 
// 12 11 
    return 0; 
} 

ответ

2

Похоже, что вы должны использовать multi_linestring как тип вывода:

#include <iostream> 

#include <boost/geometry.hpp> 
#include <boost/geometry/geometries/point_xy.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 
#include <boost/geometry/geometries/linestring.hpp> 
#include <boost/geometry/multi/geometries/multi_linestring.hpp> 

using point_type = boost::geometry::model::d2::point_xy<double>; 
using polygon_type = boost::geometry::model::polygon<point_type>; 
using linestring_type = boost::geometry::model::linestring<point_type>; 
using multi_linestring_type = boost::geometry::model::multi_linestring<linestring_type>; 

int main() 
{ 
    polygon_type polygon; 

    polygon.outer().push_back(point_type{10,10}); 
    polygon.outer().push_back(point_type{10,12}); 
    polygon.outer().push_back(point_type{12,12}); 
    polygon.outer().push_back(point_type{12,10}); 
    polygon.outer().push_back(point_type{10,10}); 

    linestring_type linestring; 
    linestring.push_back(point_type{11,9}); 
    linestring.push_back(point_type{11,11}); 
    linestring.push_back(point_type{13,11}); 

    // Expected intersections at (11, 10) and (12, 11) 

    multi_linestring_type intersection; 
    boost::geometry::intersection(polygon, linestring, intersection); 

    for(auto intersectionIter = intersection.begin(); intersectionIter != intersection.end(); ++intersectionIter) { 
     linestring_type intersectionPiece = *intersectionIter; 
     std::cout << "Piece:" << std::endl; 
     for(auto intersectionPieceIter = intersectionPiece.begin(); intersectionPieceIter != intersectionPiece.end(); ++intersectionPieceIter) { 
      std::cout << boost::geometry::get<0>(*intersectionPieceIter) << " " << boost::geometry::get<1>(*intersectionPieceIter) << std::endl; 
     } 

    } 

    return 0; 
} 
+0

Это не «казаться», как это. Вы в основном цитируете документацию здесь. – sehe

+0

@sehe Это совершенно не очевидно из http://www.boost.org/doc/libs/1_61_0/libs/geometry/doc/html/geometry/reference/algorithms/intersection.html того, какие типы следует ожидать, учитывая тонны комбинаций возможных типов ввода. Первый способ, который я пробовал, я предполагаю, что я ожидал бы правильного ответа при создании linestring в качестве вывода в этом случае, поскольку он не является непересекающимся (многострочным) linestring. Во всяком случае, пример теперь для тех, кто хочет это сделать :) –

+0

С этой ссылкой: _ «GeometryOut & Коллекция геометрий: (например, std :: vector, std :: deque, boost :: geometry :: multi *), из которых value_type выполняет концепцию Point, LineString или Polygon, или это выходная геометрия (например, для ящика) "_ Мне действительно интересно, какую информацию можно добавить. Кроме того, пример уже существует на той же самой странице документации. – sehe

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

  • Нет связанных вопросов^_^