// Boost.Geometry (aka GGL, Generic Geometry Library) // 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. // Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland. // This file was modified by Oracle on 2014. // Modifications copyright (c) 2014 Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // 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_ALGORITHMS_DETAIL_CENTROID_TRANSLATING_TRANSFORMER_HPP #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_CENTROID_TRANSLATING_TRANSFORMER_HPP #include #include #include #include #include #include #include #include #include namespace boost { namespace geometry { #ifndef DOXYGEN_NO_DETAIL namespace detail { namespace centroid { // NOTE: There is no need to translate in other coordinate systems than // cartesian. But if it was needed then one should translate using // CS-specific technique, e.g. in spherical/geographic a translation // vector should contain coordinates being multiplies of 2PI or 360 deg. template ::type, areal_tag >::type, typename CSTag = typename cs_tag::type> struct translating_transformer { typedef typename geometry::point_type::type point_type; typedef boost::reference_wrapper result_type; explicit translating_transformer(Geometry const&) {} explicit translating_transformer(point_type const&) {} result_type apply(point_type const& pt) const { return result_type(pt); } template void apply_reverse(ResPt &) const {} }; // Specialization for Areal Geometries in cartesian CS template struct translating_transformer { typedef typename geometry::point_type::type point_type; typedef point_type result_type; explicit translating_transformer(Geometry const& geom) : m_origin(NULL) { geometry::point_iterator pt_it = geometry::points_begin(geom); if ( pt_it != geometry::points_end(geom) ) { m_origin = boost::addressof(*pt_it); } } explicit translating_transformer(point_type const& origin) : m_origin(boost::addressof(origin)) {} result_type apply(point_type const& pt) const { point_type res = pt; if ( m_origin ) geometry::subtract_point(res, *m_origin); return res; } template void apply_reverse(ResPt & res_pt) const { if ( m_origin ) geometry::add_point(res_pt, *m_origin); } const point_type * m_origin; }; }} // namespace detail::centroid #endif // DOXYGEN_NO_DETAIL }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_CENTROID_TRANSLATING_TRANSFORMER_HPP