summaryrefslogtreecommitdiffstats
path: root/include/mapbox/geometry/envelope.hpp
diff options
context:
space:
mode:
authorwanglu <wang_lu@dl.cn.nexty-ele.com>2019-03-25 09:42:49 +0800
committerwanglu <wang_lu@dl.cn.nexty-ele.com>2019-03-25 09:52:02 +0800
commit4a8b7a6301e4b093c99329d0a16fbee6c535f312 (patch)
treefe9f589e1723e8f173b50dfa617374042f4cf7a7 /include/mapbox/geometry/envelope.hpp
parentfb539bbd9f7b36d26cd56fe09b804e18b3b3d984 (diff)
Change-Id: I0866a7d9ffa347c0935b4d00259ad1a74cd00d6e Signed-off-by: wanglu <wang_lu@dl.cn.nexty-ele.com>
Diffstat (limited to 'include/mapbox/geometry/envelope.hpp')
-rw-r--r--include/mapbox/geometry/envelope.hpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/include/mapbox/geometry/envelope.hpp b/include/mapbox/geometry/envelope.hpp
new file mode 100644
index 0000000..8603583
--- /dev/null
+++ b/include/mapbox/geometry/envelope.hpp
@@ -0,0 +1,33 @@
+#pragma once
+
+#include <mapbox/geometry/box.hpp>
+#include <mapbox/geometry/for_each_point.hpp>
+
+#include <limits>
+
+namespace mapbox {
+namespace geometry {
+
+template <typename G, typename T = typename G::coordinate_type>
+box<T> envelope(G const& geometry)
+{
+ using limits = std::numeric_limits<T>;
+
+ T min_t = limits::has_infinity ? -limits::infinity() : limits::min();
+ T max_t = limits::has_infinity ? limits::infinity() : limits::max();
+
+ point<T> min(max_t, max_t);
+ point<T> max(min_t, min_t);
+
+ for_each_point(geometry, [&] (point<T> const& point) {
+ if (min.x > point.x) min.x = point.x;
+ if (min.y > point.y) min.y = point.y;
+ if (max.x < point.x) max.x = point.x;
+ if (max.y < point.y) max.y = point.y;
+ });
+
+ return box<T>(min, max);
+}
+
+} // namespace geometry
+} // namespace mapbox