Merge pull request #1027 from rdlester/square

Use the squared distance when comparing tiles.
This commit is contained in:
Ian Gilman 2016-10-10 15:34:17 -07:00 committed by GitHub
commit 77ff2bfd05
3 changed files with 25 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 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

View File

@ -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

View File

@ -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;
}
}