summaryrefslogtreecommitdiff
path: root/boost/geometry/extensions/algorithms/inverse.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/extensions/algorithms/inverse.hpp')
-rw-r--r--boost/geometry/extensions/algorithms/inverse.hpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/boost/geometry/extensions/algorithms/inverse.hpp b/boost/geometry/extensions/algorithms/inverse.hpp
new file mode 100644
index 0000000000..44f415be42
--- /dev/null
+++ b/boost/geometry/extensions/algorithms/inverse.hpp
@@ -0,0 +1,59 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Copyright (c) 2015 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)
+
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_INVERSE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_INVERSE_HPP
+
+#include <boost/geometry.hpp>
+
+namespace boost { namespace geometry
+{
+
+// TODO: this is shared with sectionalize, move to somewhere else (assign?)
+template <typename Box, typename Value>
+inline void enlarge_box(Box& box, Value value)
+{
+ geometry::set<0, 0>(box, geometry::get<0, 0>(box) - value);
+ geometry::set<0, 1>(box, geometry::get<0, 1>(box) - value);
+ geometry::set<1, 0>(box, geometry::get<1, 0>(box) + value);
+ geometry::set<1, 1>(box, geometry::get<1, 1>(box) + value);
+}
+
+// TODO: when this might be moved outside extensions it should of course
+// input/output a Geometry, instead of a WKT
+template <typename Geometry, typename Value>
+inline std::string inverse(std::string const& wkt, Value margin)
+{
+ Geometry geometry;
+ read_wkt(wkt, geometry);
+
+ geometry::correct(geometry);
+
+ geometry::model::box<typename point_type<Geometry>::type> env;
+ geometry::envelope(geometry, env);
+
+ // Make its envelope a bit larger
+ enlarge_box(env, margin);
+
+ Geometry env_as_polygon;
+ geometry::convert(env, env_as_polygon);
+
+ Geometry inversed_result;
+ geometry::difference(env_as_polygon, geometry, inversed_result);
+
+ std::ostringstream out;
+
+ out << geometry::wkt(inversed_result);
+ return out.str();
+}
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_INVERSE_HPP