From 726bcbef8383da4a334e4d5c9404f50c6bbe7460 Mon Sep 17 00:00:00 2001 From: Petr Sloup Date: Wed, 26 Aug 2015 18:37:18 +0200 Subject: [PATCH] Alternative reprojection triangulation strategy The quads are now subdivided more granually (to 2 instead of 4), which usually leads to reduced number of triangles and higher performance. --- src/ol/ol.js | 4 ++-- src/ol/reproj/triangulation.js | 41 ++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/ol/ol.js b/src/ol/ol.js index bd96b4817a..48d80a1416 100644 --- a/src/ol/ol.js +++ b/src/ol/ol.js @@ -189,9 +189,9 @@ ol.RASTER_REPROJ_MAX_SOURCE_TILES = 100; * @define {number} Maximum number of subdivision steps during raster * reprojection triangulation. Prevents high memory usage and large * number of proj4 calls when for certain transformations and areas. - * At most `2*(4^this)` triangles are created. Default is `5`. + * At most `2*(2^this)` triangles are created. Default is `10`. */ -ol.RASTER_REPROJ_MAX_SUBDIVISION = 5; +ol.RASTER_REPROJ_MAX_SUBDIVISION = 10; /** diff --git a/src/ol/reproj/triangulation.js b/src/ol/reproj/triangulation.js index da4655d0d1..26f2b274ae 100644 --- a/src/ol/reproj/triangulation.js +++ b/src/ol/reproj/triangulation.js @@ -185,10 +185,10 @@ ol.reproj.Triangulation.prototype.addQuadIfValid_ = function(a, b, c, d, } if (maxSubdiv > 0) { - var center = [(a[0] + c[0]) / 2, (a[1] + c[1]) / 2]; - var centerSrc = this.transformInv_(center); - if (!needsSubdivision) { + var center = [(a[0] + c[0]) / 2, (a[1] + c[1]) / 2]; + var centerSrc = this.transformInv_(center); + var dx; if (wrapsX) { goog.asserts.assert(!goog.isNull(this.sourceWorldWidth_)); @@ -205,24 +205,27 @@ ol.reproj.Triangulation.prototype.addQuadIfValid_ = function(a, b, c, d, needsSubdivision = centerSrcErrorSquared > this.errorThresholdSquared_; } if (needsSubdivision) { - var ab = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2]; - var abSrc = this.transformInv_(ab); - var bc = [(b[0] + c[0]) / 2, (b[1] + c[1]) / 2]; - var bcSrc = this.transformInv_(bc); - var cd = [(c[0] + d[0]) / 2, (c[1] + d[1]) / 2]; - var cdSrc = this.transformInv_(cd); - var da = [(d[0] + a[0]) / 2, (d[1] + a[1]) / 2]; - var daSrc = this.transformInv_(da); + if (Math.abs(a[0] - c[0]) <= Math.abs(a[1] - c[1])) { + var bc = [(b[0] + c[0]) / 2, (b[1] + c[1]) / 2]; + var bcSrc = this.transformInv_(bc); + var da = [(d[0] + a[0]) / 2, (d[1] + a[1]) / 2]; + var daSrc = this.transformInv_(da); - this.addQuadIfValid_(a, ab, center, da, - aSrc, abSrc, centerSrc, daSrc, maxSubdiv - 1); - this.addQuadIfValid_(ab, b, bc, center, - abSrc, bSrc, bcSrc, centerSrc, maxSubdiv - 1); - this.addQuadIfValid_(center, bc, c, cd, - centerSrc, bcSrc, cSrc, cdSrc, maxSubdiv - 1); - this.addQuadIfValid_(da, center, cd, d, - daSrc, centerSrc, cdSrc, dSrc, maxSubdiv - 1); + this.addQuadIfValid_(a, b, bc, da, + aSrc, bSrc, bcSrc, daSrc, maxSubdiv - 1); + this.addQuadIfValid_(da, bc, c, d, + daSrc, bcSrc, cSrc, dSrc, maxSubdiv - 1); + } else { + var ab = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2]; + var abSrc = this.transformInv_(ab); + var cd = [(c[0] + d[0]) / 2, (c[1] + d[1]) / 2]; + var cdSrc = this.transformInv_(cd); + this.addQuadIfValid_(a, ab, cd, d, + aSrc, abSrc, cdSrc, dSrc, maxSubdiv - 1); + this.addQuadIfValid_(ab, b, c, cd, + abSrc, bSrc, cSrc, cdSrc, maxSubdiv - 1); + } return; } }