计算特定点的最近点

时间:2015-03-13 05:47:18

标签: javascript css math

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

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

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

diagram of 1st solution

所以这是代码: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;
  }
};

你认为我错过了什么?

2 个答案:

答案 0 :(得分:3)

您的for循环似乎存在问题。这个循环:

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

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

您可能希望将退出条件更改为i&lt; = length,然后最小查找逻辑应该没问题。

答案 1 :(得分:1)

更改

//                 ↓↓
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;
    }
  }
);