More efficient ol.geom.Circle#closestPointXY, thanks @tschaub
This commit is contained in:
+10
-5
@@ -42,13 +42,18 @@ ol.geom.Circle.prototype.closestPointXY =
|
|||||||
var radius = flatCoordinates[this.stride] - flatCoordinates[0];
|
var radius = flatCoordinates[this.stride] - flatCoordinates[0];
|
||||||
var dx = x - flatCoordinates[0];
|
var dx = x - flatCoordinates[0];
|
||||||
var dy = y - flatCoordinates[1];
|
var dy = y - flatCoordinates[1];
|
||||||
var distance = Math.max(Math.sqrt(dx * dx + dy * dy) - radius, 0);
|
var d = Math.sqrt(dx * dx + dy * dy);
|
||||||
|
var distance = Math.max(d, 0);
|
||||||
var squaredDistance = distance * distance;
|
var squaredDistance = distance * distance;
|
||||||
if (squaredDistance < minSquaredDistance) {
|
if (squaredDistance < minSquaredDistance) {
|
||||||
// FIXME it must be possible to do this without trigonometric functions
|
if (d === 0) {
|
||||||
var theta = Math.atan2(dy, dx);
|
closestPoint[0] = flatCoordinates[0];
|
||||||
closestPoint[0] = flatCoordinates[0] + radius * Math.cos(theta);
|
closestPoint[1] = flatCoordinates[1];
|
||||||
closestPoint[1] = flatCoordinates[1] + radius * Math.sin(theta);
|
} else {
|
||||||
|
var delta = radius / d;
|
||||||
|
closestPoint[0] = flatCoordinates[0] + delta * dx;
|
||||||
|
closestPoint[1] = flatCoordinates[1] + delta * dy;
|
||||||
|
}
|
||||||
return squaredDistance;
|
return squaredDistance;
|
||||||
} else {
|
} else {
|
||||||
return minSquaredDistance;
|
return minSquaredDistance;
|
||||||
|
|||||||
Reference in New Issue
Block a user