Improve precision of polygon area calculations (#19)

* Improve precision of get_area by using long double

* Trying to get consistent polygon area results between ARM and x86

* Calculate polygon area closer to the origin for better precision

* Update changelog

* Also exercise tiny polygon dust in the ring area test

They previously behaved differently here between x86 and ARM

* On M1 Macs, long double is just double anyway, so don't use it

* Be more careful about overflow: scale the polygon ring down into range

* Fix the bug I just introduced in the scaled area calculation

* Use only the sign from the scaled-down area calculation

Co-authored-by: Roman Karavia <47303530+romankaravia@users.noreply.github.com>
This commit is contained in:
Erica Fischer
2022-10-04 10:04:34 -07:00
committed by GitHub
co-authored by Roman Karavia
parent a6abb0bc30
commit 182093bdc7
9 changed files with 239 additions and 14 deletions
+3 -3
View File
@@ -505,11 +505,11 @@ void layer_to_geojson(mvt_layer const &layer, unsigned z, unsigned x, unsigned y
int outer = 0;
for (size_t i = 0; i < rings.size(); i++) {
long double area = 0;
double area = 0;
for (size_t k = 0; k < rings[i].size(); k++) {
if (rings[i][k].op != VT_CLOSEPATH) {
area += (long double) rings[i][k].x * (long double) rings[i][(k + 1) % rings[i].size()].y;
area -= (long double) rings[i][k].y * (long double) rings[i][(k + 1) % rings[i].size()].x;
area += (double) rings[i][k].x * (double) rings[i][(k + 1) % rings[i].size()].y;
area -= (double) rings[i][k].y * (double) rings[i][(k + 1) % rings[i].size()].x;
}
}
area /= 2;