diff --git a/src/point.js b/src/point.js index 7d4f6740..72c91378 100644 --- a/src/point.js +++ b/src/point.js @@ -148,6 +148,18 @@ $.Point.prototype = { ); }, + /** + * Compute the squared distance between this point and another point. + * Useful for optimizing things like comparing distances. + * @function + * @param {OpenSeadragon.Point} point The point to compute the squared distance with. + * @returns {Number} The squared distance between the 2 points + */ + squaredDistanceTo: function( point ) { + return Math.pow( this.x - point.x, 2 ) + + Math.pow( this.y - point.y, 2 ); + }, + /** * Apply a function to each coordinate of this point and return a new point. * @function diff --git a/src/tile.js b/src/tile.js index 04f3c08a..72776aac 100644 --- a/src/tile.js +++ b/src/tile.js @@ -154,11 +154,13 @@ $.Tile = function(level, x, y, bounds, exists, url, context2D) { */ this.opacity = null; /** - * The distance of this tile to the viewport center. - * @member {Number} distance + * The squared distance of this tile to the viewport center. + * Use for comparing tiles. + * @private + * @member {Number} squaredDistance * @memberof OpenSeadragon.Tile# */ - this.distance = null; + this.squaredDistance = null; /** * The visibility score of this tile. * @member {Number} visibility diff --git a/src/tiledimage.js b/src/tiledimage.js index eff98b6c..c65b0503 100644 --- a/src/tiledimage.js +++ b/src/tiledimage.js @@ -1295,12 +1295,12 @@ function positionTile( tile, overlap, viewport, viewportCenter, levelVisibility, boundsSize.x *= tiledImage._scaleSpring.current.value; boundsSize.y *= tiledImage._scaleSpring.current.value; - var positionC = viewport.pixelFromPointNoRotate(boundsTL, true), - positionT = viewport.pixelFromPointNoRotate(boundsTL, false), - sizeC = viewport.deltaPixelsFromPointsNoRotate(boundsSize, true), - sizeT = viewport.deltaPixelsFromPointsNoRotate(boundsSize, false), - tileCenter = positionT.plus( sizeT.divide( 2 ) ), - tileDistance = viewportCenter.distanceTo( tileCenter ); + var positionC = viewport.pixelFromPointNoRotate(boundsTL, true), + positionT = viewport.pixelFromPointNoRotate(boundsTL, false), + sizeC = viewport.deltaPixelsFromPointsNoRotate(boundsSize, true), + sizeT = viewport.deltaPixelsFromPointsNoRotate(boundsSize, false), + tileCenter = positionT.plus( sizeT.divide( 2 ) ), + tileSquaredDistance = viewportCenter.squaredDistanceTo( tileCenter ); if ( !overlap ) { sizeC = sizeC.plus( new $.Point( 1, 1 ) ); @@ -1308,7 +1308,7 @@ function positionTile( tile, overlap, viewport, viewportCenter, levelVisibility, tile.position = positionC; tile.size = sizeC; - tile.distance = tileDistance; + tile.squaredDistance = tileSquaredDistance; tile.visibility = levelVisibility; } @@ -1452,7 +1452,7 @@ function compareTiles( previousBest, tile ) { if ( tile.visibility > previousBest.visibility ) { return tile; } else if ( tile.visibility == previousBest.visibility ) { - if ( tile.distance < previousBest.distance ) { + if ( tile.squaredDistance < previousBest.squaredDistance ) { return tile; } }