2016-08-07 33 views
1

Ich versuche den Teil einer Linienfolge innerhalb eines Polygons zu finden. Ich habe versucht, die intersection Funktion, aber es scheint nur die tatsächlichen Schnittpunkte und nicht den Teil der Linienfolge, die das Polygon überlappt. Gibt es eine Möglichkeit, dieses Objekt zu bekommen?Schnittpunkt von boost :: geometry :: model :: linestring mit boost :: geometry :: model :: polygon

Hier ist eine Demo-Situation:

#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; 
} 

Antwort

2

Es scheint, dass Sie eine multi_linestring als Ausgabetyp verwenden müssen:

#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

Es ist nicht "erscheinen" so. Sie zitieren im Grunde die Dokumentation hier. – sehe

+0

@sehe Es ist überhaupt nicht offensichtlich von http://www.boost.org/doc/libs/1_61_0/libs/geometry/doc/html/geometry/reference/algorithms/intersection.html welche Typen erwartet werden sollten Tonnen von Kombinationen von möglichen Eingabearten. Der erste Weg, den ich versucht habe, ich denke, ich hätte die richtige Antwort erwartet, wenn in diesem Fall eine Linienfolge als Ausgabe erzeugt wird, da es keine getrennte (Mehrfach-) Linienfolge ist. Wie auch immer, das Beispiel ist jetzt hier für diejenigen, die das wollen :) –

+0

Von diesem Link: _ "GeometryOut & Sammlung von Geometrien: (zB Std :: Vektor, Std :: Deque, Boost :: Geometrie :: Multi *) von denen der value_type ein Point-, LineString- oder Polygon-Konzept erfüllt, oder es ist die Ausgabe-Geometrie (zB für eine Box) "_ Ich frage mich wirklich, welche Informationen hinzugefügt werden könnten. Außerdem ist das Beispiel bereits auf der gleichen Dokumentationsseite vorhanden. – sehe