2016-08-03 11 views
0

Gibt es eine morphologische Dilatation Operation für Polygon Geometrie Objekte?Dilatation eines Polygon Boost :: Geometrie

Zum Beispiel, ich habe ein Quadrat mit Seitenlänge 1 am Ursprung zentriert (ein boost :: geometry :: model :: polygon mit Punkten (.5, .5), (-.5, .5) , (-5, -5), (0,5, -5)). Wenn ich es mit einer Entfernung/einem Radius von 0,5 dilatiere, würde ich ein Quadrat mit der Seitenlänge 2 erhalten, das immer noch am Ursprung zentriert ist. Das heißt, alle Kanten des Polygons sollten entlang ihrer normalen Richtung "herausgedrückt" werden.

Antwort

2

Der Begriff hierfür ist „Puffer“, und Pufferung Polygonen ist nur in der Überlast des Puffers() mit Strategien umgesetzt: http://www.boost.org/doc/libs/1_61_0/libs/geometry/doc/html/geometry/reference/algorithms/buffer/buffer_7_with_strategies.html

Hier ist ein Beispiel, das ein Dreieck, das durch 0,1 Einheiten dilatiert.

#include <iostream> 
#include <list> 

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

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

int main() 
{ 
    // Construct 
    polygon_type polygon; 
    // Counter clock-wise points don't seem to work (no error, but empty output) 
// boost::geometry::append(polygon, point_type {0,0}); 
// boost::geometry::append(polygon, point_type {1,0}); 
// boost::geometry::append(polygon, point_type {0,1}); 
// boost::geometry::append(polygon, point_type {0,0}); 

    // Points specified in clockwise order 
    boost::geometry::append(polygon, point_type {0,0}); 
    boost::geometry::append(polygon, point_type {0,1}); 
    boost::geometry::append(polygon, point_type {1,0}); 
    boost::geometry::append(polygon, point_type {0,0}); 

    //boost::geometry::buffer(poly, output, .5); // THIS_OPERATION_IS_NOT_OR_NOT_YET_IMPLEMENTED 

    const double buffer_distance = .1; 
    const int points_per_circle = 36; 
    boost::geometry::strategy::buffer::distance_symmetric<coordinate_type> distance_strategy(buffer_distance); 
    boost::geometry::strategy::buffer::join_round join_strategy(points_per_circle); 
    boost::geometry::strategy::buffer::end_round end_strategy(points_per_circle); 
    boost::geometry::strategy::buffer::point_circle circle_strategy(points_per_circle); 
    boost::geometry::strategy::buffer::side_straight side_strategy; 

    boost::geometry::model::multi_polygon<polygon_type> input; 
    input.push_back(polygon); 

    boost::geometry::model::multi_polygon<polygon_type> outputMultiPolygon; 

    boost::geometry::buffer(polygon, outputMultiPolygon, 
       distance_strategy, side_strategy, 
       join_strategy, end_strategy, circle_strategy); 

    std::cout << outputMultiPolygon.size() << std::endl; 

    polygon_type outputPolygon = outputMultiPolygon[0]; 

    // Print the points of the result (there are many more than in the input because the corners have been rounded) 
    for(unsigned int pointID = 0; pointID < outputPolygon.outer().size(); ++pointID) { 
     std::cout << boost::geometry::get<0>(outputPolygon.outer()[pointID]) << " " << boost::geometry::get<1>(outputPolygon.outer()[pointID]) << std::endl; 
    } 

    return 0; 
}