我有一个度数数组,[10,90,200,280,355]用于圆圈。
我获得学位,让我们说1.我如何确定1最接近355度?
答案 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]);