geometry/test/algorithms/buffer/buffer_with_strategies.cpp

142 lines
4.2 KiB
C++

// Boost.Geometry (aka GGL, Generic Geometry Library)
// Unit Test
// Copyright (c) 2015-2019 Barend Gehrels, Amsterdam, the Netherlands.
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include "geometry_test_common.hpp"
#include <boost/geometry/algorithms/buffer.hpp>
#include <boost/geometry/strategies/strategies.hpp>
#include <boost/geometry/geometries/geometries.hpp>
// For test
#include <boost/geometry/algorithms/area.hpp>
#include <boost/geometry/algorithms/correct.hpp>
#include <boost/geometry/algorithms/num_points.hpp>
// This unit test tests boost::geometry::buffer (overload with strategies)
// More detailed tests are, per geometry type, available in buffer_<TYPE>.cpp
// (testing boost::geometry::buffer_inserter)
// SVG's are not created (they are in detailed tests)
static std::string const polygon_simplex = "POLYGON ((0 0,1 5,6 1,0 0))";
static std::string const polygon_empty = "POLYGON()";
static std::string const multi_polygon_empty = "MULTIPOLYGON()";
static std::string const multi_polygon_simplex
= "MULTIPOLYGON(((0 1,2 5,5 3,0 1)),((1 1,5 2,5 0,1 1)))";
template
<
typename Geometry,
typename GeometryOut,
typename JoinStrategy,
typename EndStrategy,
typename SideStrategy,
typename PointStrategy,
typename DistanceStrategy
>
void test_with_strategies(std::string const& caseid,
std::string const& wkt,
JoinStrategy const& join_strategy,
EndStrategy const& end_strategy,
SideStrategy const& side_strategy,
PointStrategy const& point_strategy,
DistanceStrategy const& distance_strategy,
double expected_area,
std::size_t expected_numpoints,
double tolerance = 0.01)
{
namespace bg = boost::geometry;
Geometry g;
bg::read_wkt(wkt, g);
bg::correct(g);
GeometryOut result;
bg::buffer(g, result,
distance_strategy, side_strategy,
join_strategy, end_strategy, point_strategy);
BOOST_CHECK_MESSAGE
(
bg::num_points(result) == expected_numpoints,
"Buffer " << caseid
<< " numpoints expected: " << expected_numpoints
<< " detected: " << bg::num_points(result)
);
double const area = bg::area(result);
double const difference = area - expected_area;
BOOST_CHECK_MESSAGE
(
bg::math::abs(difference) < tolerance,
"Buffer " << caseid
<< std::setprecision(12)
<< " area expected: " << expected_area
<< " detected: " << area
);
}
template <bool Clockwise, typename Point>
void test_all()
{
typedef bg::model::polygon<Point, Clockwise> polygon;
typedef bg::model::multi_polygon<polygon> multi_polygon;
bg::strategy::buffer::join_round join(160);
bg::strategy::buffer::end_round end(160);
bg::strategy::buffer::point_circle circle(160);
bg::strategy::buffer::side_straight side;
typedef bg::strategy::buffer::distance_symmetric
<
typename bg::coordinate_type<Point>::type
> distance;
test_with_strategies<multi_polygon, multi_polygon>(
"multi_polygon_empty", multi_polygon_empty,
join, end, side, circle, distance(1.0),
0.0, 0);
// PostGIS: 34.2550669294223 216 (40 / qcircle)
// SQL Server: 34.2550419903829 220 (default options)
test_with_strategies<multi_polygon, multi_polygon>(
"multi_polygon_simplex", multi_polygon_simplex,
join, end, side, circle, distance(1.0),
34.2551, 219);
test_with_strategies<polygon, multi_polygon>(
"polygon_empty", polygon_empty,
join, end, side, circle, distance(1.0),
0.0, 0);
//
// PostGIS: 35.2256914798762 164 (40 / qcircle)
// SQL Server: 35.2252355201605 153 (default options)
test_with_strategies<polygon, multi_polygon>(
"polygon_simplex", polygon_simplex,
join, end, side, circle, distance(1.0),
35.2257, 166);
}
int test_main(int, char* [])
{
BoostGeometryWriteTestConfiguration();
test_all<true, bg::model::point<default_test_type, 2, bg::cs::cartesian> >();
return 0;
}