From 8a09bc4ae714d47bf539072b62724729f657c869 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Thu, 19 Jul 2018 17:54:13 +0300 Subject: [core] Added mbgl::util::fuzzy{Compare,IsNull} --- cmake/core-files.cmake | 1 + include/mbgl/math/compare.hpp | 36 ++++++++++++++++++++++++++++++++++++ src/mbgl/util/tile_cover.cpp | 7 +++++-- 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 include/mbgl/math/compare.hpp 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 +#include + +namespace mbgl { +namespace util { + +//template ::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 #include #include +#include #include #include @@ -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); } } -- cgit v1.2.1