Use the squared distance when comparing tiles.

This drops a Math.sqrt calculation from every tile iterated over while
drawing, improving performance.
This commit is contained in:
Ryan Lester 2016-09-02 10:31:36 -04:00
parent 52fd82d4be
commit 0d4e17b627
3 changed files with 24 additions and 11 deletions

View File

@ -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 distance with.
* @returns {Number} The 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

View File

@ -154,11 +154,12 @@ $.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.
* @member {Number} squaredDistance
* @memberof OpenSeadragon.Tile#
*/
this.distance = null;
this.squaredDistance = null;
/**
* The visibility score of this tile.
* @member {Number} visibility

View File

@ -1300,7 +1300,7 @@ function positionTile( tile, overlap, viewport, viewportCenter, levelVisibility,
sizeC = viewport.deltaPixelsFromPointsNoRotate(boundsSize, true),
sizeT = viewport.deltaPixelsFromPointsNoRotate(boundsSize, false),
tileCenter = positionT.plus( sizeT.divide( 2 ) ),
tileDistance = viewportCenter.distanceTo( tileCenter );
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;
}
}