// Boost.Geometry (aka GGL, Generic Geometry Library) test file // // Copyright Barend Gehrels 2007-2009, 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) #ifndef BOOST_GEOMETRY_TEST_CENTROID_HPP #define BOOST_GEOMETRY_TEST_CENTROID_HPP // Test-functionality, shared between single and multi tests #include #include #include #include #include template struct check_result { }; template <> struct check_result<2> { template static void apply(Point const& p, T const& x, T const& y, T const&) { BOOST_CHECK_CLOSE(double(boost::geometry::get<0>(p)), double(x), 0.001); BOOST_CHECK_CLOSE(double(boost::geometry::get<1>(p)), double(y), 0.001); } }; template <> struct check_result<3> { template static void apply(Point const& p, T const& x, T const& y, T const& z) { BOOST_CHECK_CLOSE(double(boost::geometry::get<0>(p)), double(x), 0.001); BOOST_CHECK_CLOSE(double(boost::geometry::get<1>(p)), double(y), 0.001); BOOST_CHECK_CLOSE(double(boost::geometry::get<2>(p)), double(z), 0.001); } }; template void test_with_other_calculation_type(Geometry const& geometry, Point& c1) { typedef typename boost::geometry::point_type::type point_type; // Calculate it with user defined strategy point_type c2; boost::geometry::centroid(geometry, c2, boost::geometry::strategy::centroid::bashein_detmer()); std::cout << typeid(CalculationType).name() << ": " << std::setprecision(20) << boost::geometry::get<0>(c2) << " " << boost::geometry::get<1>(c2) << " -> difference: " << boost::geometry::distance(c1, c2) << std::endl; } template void test_centroid(std::string const& wkt, T const& x, T const& y, T const& z = T()) { Geometry geometry; boost::geometry::read_wkt(wkt, geometry); typedef typename boost::geometry::point_type::type point_type; point_type c1; boost::geometry::centroid(geometry, c1); check_result::type::value>::apply(c1, x, y, z); #ifdef REPORT_RESULTS std::cout << "normal: " << std::setprecision(20) << boost::geometry::get<0>(c1) << " " << boost::geometry::get<1>(c1) << std::endl; //test_with_other_calculation_type(geometry, c1); test_with_other_calculation_type(geometry, c1); test_with_other_calculation_type(geometry, c1); #if defined(HAVE_GMP) test_with_other_calculation_type(geometry, c1); #endif #if defined(HAVE_CLN) test_with_other_calculation_type(geometry, c1); #endif #endif } #endif