blob: c91f31988d8f97fe43a69d9f02bb5d2f9ef33a2a [file] [log] [blame]
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Unit Test
// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
// (geolib/GGL), copyright (c) 1995-2010 Geodan, 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 <iostream>
#include <string>
#include <boost/foreach.hpp>
#include <boost/geometry/algorithms/correct.hpp>
#include <boost/geometry/algorithms/detail/recalculate.hpp>
#include <boost/geometry/algorithms/length.hpp>
#include <boost/geometry/algorithms/num_points.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/strategies/strategies.hpp>
#include <boost/geometry/iterators/point_iterator.hpp>
#include <boost/geometry/policies/robustness/get_rescale_policy.hpp>
#include <boost/geometry/io/wkt/wkt.hpp>
#include <geometry_test_common.hpp>
template
<
typename RescalePolicy,
typename Geometry1,
typename Geometry2
>
void test_one(std::string const& wkt1, std::string const& wkt2,
std::string const& expected_coordinates)
{
Geometry1 geometry1;
bg::read_wkt(wkt1, geometry1);
Geometry2 geometry2;
bg::read_wkt(wkt2, geometry2);
RescalePolicy rescale_policy
= bg::get_rescale_policy<RescalePolicy>(geometry1, geometry2);
typedef typename bg::point_type<Geometry1>::type point_type;
typedef typename bg::robust_point_type
<
point_type, RescalePolicy
>::type robust_point_type;
{
robust_point_type robust_point;
bg::recalculate(robust_point, *bg::points_begin(geometry1), rescale_policy);
std::ostringstream out;
out << bg::get<0>(robust_point) << " " << bg::get<1>(robust_point);
BOOST_CHECK_EQUAL(expected_coordinates, out.str());
}
{
// Assuming Geometry1 is a polygon:
typedef bg::model::polygon<robust_point_type> polygon_type;
polygon_type geometry_out;
bg::recalculate(geometry_out, geometry1, rescale_policy);
robust_point_type p = *bg::points_begin(geometry_out);
std::ostringstream out;
out << bg::get<0>(p) << " " << bg::get<1>(p);
BOOST_CHECK_EQUAL(expected_coordinates, out.str());
}
}
static std::string simplex_normal[2] =
{"POLYGON((0 1,2 5,5 3,0 1))",
"POLYGON((3 0,0 3,4 5,3 0))"};
static std::string simplex_large[2] =
{"POLYGON((0 1000,2000 5000,5000 3000,0 1000))",
"POLYGON((3000 0,0 3000,4000 5000,3000 0))"};
template <bool Rescale, typename P>
void test_rescale(std::string const& expected_normal, std::string const& expected_large)
{
typedef bg::model::polygon<P> polygon;
typedef typename boost::mpl::if_c
<
Rescale,
typename bg::rescale_policy_type<P>::type ,
bg::detail::no_rescale_policy
>::type rescale_policy_type;
test_one<rescale_policy_type, polygon, polygon>(
simplex_normal[0], simplex_normal[1],
expected_normal);
test_one<rescale_policy_type, polygon, polygon>(
simplex_large[0], simplex_large[1],
expected_large);
}
template <typename T>
void test_all(std::string const& expected_normal, std::string const& expected_large)
{
typedef bg::model::d2::point_xy<T> point_type;
test_rescale<true, point_type>(expected_normal, expected_large);
//test_rescale<false, point_type>();
}
int test_main(int, char* [])
{
test_all<double>("-5000000 -3000000", "-5000000 -3000000");
test_all<long double>("-5000000 -3000000", "-5000000 -3000000");
test_all<int>("0 1", "0 1000");
test_all<boost::long_long_type>("0 1", "0 1000");
// test_all<short int>(); // compiles but overflows
return 0;
}