给定度x,找到度数数组中最接近的度数

时间:2011-08-16 00:03:17

标签: javascript math geometry

我有一个度数数组,[10,90,200,280,355]用于圆圈。

我获得学位,让我们说1.我如何确定1最接近355度?

9 个答案:

答案 0 :(得分:4)

减去这两个数字。如果差异大于180 [或低于-180],则减去[或添加] 360.现在您可以只比较差异的绝对值。

答案 1 :(得分:3)

这是一个实际公式:

degreediff = min(abs(x-y),360-abs(x-y))

答案 2 :(得分:1)

这更加紧凑和高效:

function difference(a, b) {
    var d = Math.abs(a - b);
    return d > 180 ? 360 - d : d;
};

function closest(a, bs) {
    var ds = bs.map(function(b) { return difference(a, b); });
    return bs[ds.indexOf(Math.min.apply(null, ds))];
};

> difference(1, 355)
6

> closest(1, [10, 90, 200, 280, 355])
355

答案 3 :(得分:0)

您有一个值,其中包含找到found_degree的结束度,另一个值包含实际差异degree_difference

接下来,迭代整个数组并计算两个值:abs(degree_at_position - target_degree)abs(degree_at_position - 360 - target_degree)。如果其中一个值小于degree_difference,则您拥有更接近的学位 - 将其存储在found_degree并相应地更新degree_difference

就是这样。

您可能应该使用-1初始化found_degree和使用360初始化degree_difference,以确保您可以在空的给定数组的情况下正确解释结果 - 或者您只是处理案例分别为空输入数组。

顺便说一句,这是作业吗?

答案 4 :(得分:0)

蛮力方法将是这样的:

var closestElement;
var closestDivergence = 360;

var toCompare = 355;
var choices = [1, 90, 200, 280, 355];

for(i=0;i<choices.length;i++){
    var currentDivergence=choices[i] - toCompare;
    if (currentDivergence<0) {
        currentDivergence+=360;
    }
    if (currentDivergence < closestDivergence){
        closestDivergence = currentDivergence;
        closestElement = i;
    }
}

if (closestElement != NaN){
    alert('Closest value is '+choices[closestElement]);
}

答案 5 :(得分:0)

这是一个很好的小动作

function closest(deg,ar) {
  return ar.sort(function(a,b){var c = deg; return Math.min(360 - (a-c),Math.abs(a-c)) - Math.min(360 - (b-c),Math.abs(b-c))})
}
var myArray = [355, 280, 200, 181, 90, 30];
alert(closest(180,myArray));

根据哪一个最接近提供的度数对数组进行排序和返回。索引0最接近。它确实使355更接近0而不是10。

答案 6 :(得分:0)

首先使用给定的度数(在您的示例中为1)检查数组(检查哪个元素最接近),然后添加360并检查该度数(361)。比较哪个结果更好:

给定度数,y为第一个结果,z为第二个结果

if (abs(x-y) < 360+x-z)
    choose y;
else
    choose z;

如果数组已排序,您可以使用二进制排序检查它,在最坏的情况下为您提供O(log n)时间。否则你必须浏览整个数组两次。

答案 7 :(得分:0)

此公式仅适用于圈子。它当然是伪代码。

 degree diff = min(abs(x-y),360-abs(x-y))

答案 8 :(得分:0)

使用此页面中的评论,我设法得到了这段代码:

function closest(deg, degs) {

deg = (deg / 360 > 1 ? deg - (Math.floor(deg / 360)*360) : deg);

var difference = 360;
var closest = -1;

for(i=0;i<degs.length;i++) {

    var x = degs[i];

    var diff = Math.min(Math.abs(x-deg),360-Math.abs(x-deg))

    if(diff <= difference) {
        closest = i;
        difference = diff;
    }
};

return closest;

}

最近(1000,[10,90,200,280,355]);