summaryrefslogtreecommitdiff
path: root/boost/geometry/algorithms/detail/centroid/translating_transformer.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/algorithms/detail/centroid/translating_transformer.hpp')
-rw-r--r--boost/geometry/algorithms/detail/centroid/translating_transformer.hpp119
1 files changed, 119 insertions, 0 deletions
diff --git a/boost/geometry/algorithms/detail/centroid/translating_transformer.hpp b/boost/geometry/algorithms/detail/centroid/translating_transformer.hpp
new file mode 100644
index 0000000000..56a7e3ec91
--- /dev/null
+++ b/boost/geometry/algorithms/detail/centroid/translating_transformer.hpp
@@ -0,0 +1,119 @@
+// 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 <cstddef>
+
+#include <boost/core/addressof.hpp>
+#include <boost/core/ref.hpp>
+
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/core/tag_cast.hpp>
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/arithmetic/arithmetic.hpp>
+
+#include <boost/geometry/iterators/point_iterator.hpp>
+
+
+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 <typename Geometry,
+ typename CastedTag = typename tag_cast
+ <
+ typename tag<Geometry>::type,
+ areal_tag
+ >::type,
+ typename CSTag = typename cs_tag<Geometry>::type>
+struct translating_transformer
+{
+ typedef typename geometry::point_type<Geometry>::type point_type;
+ typedef boost::reference_wrapper<point_type const> 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 <typename ResPt>
+ void apply_reverse(ResPt &) const {}
+};
+
+// Specialization for Areal Geometries in cartesian CS
+template <typename Geometry>
+struct translating_transformer<Geometry, areal_tag, cartesian_tag>
+{
+ typedef typename geometry::point_type<Geometry>::type point_type;
+ typedef point_type result_type;
+
+ explicit translating_transformer(Geometry const& geom)
+ : m_origin(NULL)
+ {
+ geometry::point_iterator<Geometry const>
+ 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 <typename ResPt>
+ 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