2011-08-16 44 views
7

我有一个度数组,[10,90,200,280,355]为一个圆。给定度x,找到度数组中的最近度数

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

+0

+1,我最近有非常相同的任务,我的解决方案是一个小马车,所以我很感兴趣,看看是否有任何其他实现我之前尝试并修复它:-) –

回答

0

您有一个值将包含关闭程度找到found_degree和一个实际差异degree_difference

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

就是这样。

你可能应该初始化found_degree与-1和degree_difference与360,只是为了确保你可以正确解释结果的情况下,一个空的给定数组 - 也可以单独处理空输入数组的情况。

顺便问一下这是作业吗?

4

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

+0

+1,但需要获得差异的绝对值并与180比较(例如可以是-200),然后从360减去。 – RobG

+0

@RobG,好点。我已经编辑了相应的答案。 –

4

下面是一个实际的公式:

degreediff = min(abs(x-y),360-abs(x-y)) 
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]); 
} 
+1

不适用于零值附近,例如1接近355比10(每OP)。 – RobG

+0

非常正确,我修改了我的答案。 –

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更接近0。

0

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

X给定的程度,y中的第一个结果,z中的第二个结果

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

如果数组进行排序,你可以用二进制排序,让你O(日志检查n)最坏情况下的时间。否则,你必须浏览整个阵列两次。

0

此公式只适用于圆形。这当然是伪代码。

degree diff = min(abs(x-y),360-abs(x-y)) 
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]) ;

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 
相关问题