summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno@mapbox.com>2018-07-19 17:54:13 +0300
committerBruno de Oliveira Abinader <bruno@mapbox.com>2018-07-19 17:54:13 +0300
commit8a09bc4ae714d47bf539072b62724729f657c869 (patch)
tree5690aea5caf4109bc71f7019c8cf36435cfc2047
parent2dff07435701471fe433c5c58d2bb4d6ad1ef6dc (diff)
downloadqtlocation-mapboxgl-upstream/wip-transformstate.tar.gz
[core] Added mbgl::util::fuzzy{Compare,IsNull}upstream/wip-transformstate
-rw-r--r--cmake/core-files.cmake1
-rw-r--r--include/mbgl/math/compare.hpp36
-rw-r--r--src/mbgl/util/tile_cover.cpp7
3 files changed, 42 insertions, 2 deletions
diff --git a/cmake/core-files.cmake b/cmake/core-files.cmake
index 204bb78bce..e5ad757301 100644
--- a/cmake/core-files.cmake
+++ b/cmake/core-files.cmake
@@ -124,6 +124,7 @@ set(MBGL_CORE_FILES
include/mbgl/math/log2.hpp
include/mbgl/math/minmax.hpp
include/mbgl/math/wrap.hpp
+ include/mbgl/math/compare.hpp
src/mbgl/math/log2.cpp
# parsedate
diff --git a/include/mbgl/math/compare.hpp b/include/mbgl/math/compare.hpp
new file mode 100644
index 0000000000..1a4c09c80a
--- /dev/null
+++ b/include/mbgl/math/compare.hpp
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <cfloat>
+#include <cmath>
+
+namespace mbgl {
+namespace util {
+
+//template <typename T,
+// typename = std::enable_if<std::is_floating_point<T>::value>>
+bool fuzzyEqual(double a, double b) {
+ double diff = ::fabs(a - b);
+ a = ::fabs(a);
+ b = ::fabs(b);
+ double min = b > a ? a : b;
+ return diff * 1e12 <= min;
+}
+
+bool fuzzyEqual(float a, float b) {
+ float diff = ::fabs(a - b);
+ a = ::fabs(a);
+ b = ::fabs(b);
+ float min = b > a ? a : b;
+ return diff * 1e5 <= min;
+}
+
+bool fuzzyIsNull(double a) {
+ return ::fabs(a) <= 1e-12;
+}
+
+bool fuzzyIsNull(float a) {
+ return ::fabs(a) <= 1e-5;
+}
+
+} // namespace util
+} // namespace mbgl
diff --git a/src/mbgl/util/tile_cover.cpp b/src/mbgl/util/tile_cover.cpp
index 00a261e083..dacd289d3a 100644
--- a/src/mbgl/util/tile_cover.cpp
+++ b/src/mbgl/util/tile_cover.cpp
@@ -4,6 +4,7 @@
#include <mbgl/map/transform_state.hpp>
#include <mbgl/util/tile_cover_impl.hpp>
#include <mbgl/util/tile_coordinate.hpp>
+#include <mbgl/math/compare.hpp>
#include <functional>
#include <list>
@@ -34,7 +35,8 @@ struct edge {
// scan-line conversion
static void scanSpans(edge e0, edge e1, int32_t ymin, int32_t ymax, ScanLine scanLine) {
- double y0 = util::max(double(ymin), std::floor(e1.y0));
+ bool fuzzyIsNull = util::fuzzyIsNull(e1.y0);
+ double y0 = util::max(double(ymin), fuzzyIsNull ? 0.0 : std::floor(e1.y0));
double y1 = util::min(double(ymax), std::ceil(e1.y1));
// sort edges by x-coordinate
@@ -52,7 +54,8 @@ static void scanSpans(edge e0, edge e1, int32_t ymin, int32_t ymax, ScanLine sca
for (int32_t y = y0; y < y1; y++) {
double x0 = m0 * util::max(0.0, util::min(e0.dy, y + d0 - e0.y0)) + e0.x0;
double x1 = m1 * util::max(0.0, util::min(e1.dy, y + d1 - e1.y0)) + e1.x0;
- scanLine(std::floor(x1), std::ceil(x0), y);
+ fuzzyIsNull = util::fuzzyIsNull(x1);
+ scanLine(fuzzyIsNull ? 0.0 : std::floor(x1), std::ceil(x0), y);
}
}