从特定点计算最近的点

Compute the closest point from a specific point

我创建了一个全景图,中间有一个指南针,最初指南针指向图像的顶部中心。

现在我想相对于这一点移动指南针,因为它是 360 全景图,它会创建一个相邻的副本。所以我想要的是将指南针指向从左到右或从右到左移动时更近的那个点。

这是我到目前为止所做的,它的行为并不像我想要的那样。

所以这里是代码:https://gist.github.com/joeyhipolito/8678bf35dba7795de4d5

我所做的是创建了两个点:

points.push({
  x: target.offset().left + (windowWidth) / 2,
  y: target.offset().top
});

points.push({
  x: (target.offset().left + (windowWidth) / 2) + (common.width / 2),
  y: target.offset().top
});

然后尝试通过勾股定理计算哪些点更接近参考

var closestPoint = points[0];
var closestValue = Math.sqrt(Math.pow(points[0].x, 2) + Math.pow(points[0].y, 2));

for (var i = 1; i >= points.length; i++) {
  var z = Math.sqrt(Math.pow(points[i].x, 2) + Math.pow(points[i].y, 2));
  if(z < closestValue) {
    closestPoint = points[i];
    closestValue = z;
  }
};

你认为我错过了什么?

您似乎对 for 循环的控制有问题。这个循环:

for (var i = 1; i >= points.length; i++) {
};

(注意退出条件)不会 运行,因为 1(i 的初始值)紧接在数组长度下方,大概至少为 2。另一方面,如果数组长度最多为 1,则此循环将永远不会终止,因为 i 将继续增加,并且 i>=length 语句保持为真。

您可能想将该退出条件更改为 i<=length,那么最小值查找逻辑应该没问题。

改变

//                 ↓↓
for ( var i = 1; i >= points.length; i++ ) {
  // ...
};

//                 ↓
for ( var i = 1; i < points.length; i++ ) {
  // ...
};

另一种方法是使用 Array.reduce()。它可能没有那么快,但可能更语义化:

function distFromOrigin( point ) {
  return Math.sqrt( Math.pow( point, 2 ) + Math.pow( point, 2 ) );
}


var closestPoint = points.reduce(
  function( closestPoint, currPoint, index, array ) {
    var currDist = distFromOrigin( currPoint ),
      closestDist = distFromOrigin( closestDist );

    if ( currDist < closestDist ) {
      return currPoint;
    } else {
      return closestPoint;
    }
  }
);