diff options
author | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2018-07-19 17:54:13 +0300 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2018-07-19 17:54:13 +0300 |
commit | 8a09bc4ae714d47bf539072b62724729f657c869 (patch) | |
tree | 5690aea5caf4109bc71f7019c8cf36435cfc2047 | |
parent | 2dff07435701471fe433c5c58d2bb4d6ad1ef6dc (diff) | |
download | qtlocation-mapboxgl-upstream/wip-transformstate.tar.gz |
[core] Added mbgl::util::fuzzy{Compare,IsNull}upstream/wip-transformstate
-rw-r--r-- | cmake/core-files.cmake | 1 | ||||
-rw-r--r-- | include/mbgl/math/compare.hpp | 36 | ||||
-rw-r--r-- | src/mbgl/util/tile_cover.cpp | 7 |
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); } } |