Javascript 给定度x,在度数组中查找最近的度

Javascript 给定度x,在度数组中查找最近的度,javascript,math,geometry,Javascript,Math,Geometry,我有一个圆圈的度数数组,[10,90200280355] 我拿到了学位,比如说1。如何确定1最接近355度?您有一个值,其中包含查找到的关闭度查找到的度,还有一个值用于实际差异度差异 接下来,迭代整个数组并计算两个值:abs(位置处的度数-目标度数)和abs(位置处的度数-360-目标度数)。如果其中一个值小于degree\u difference,则有一个更接近的度-将其存储在found\u degree中,并相应地更新degree\u difference 就这样 您可能应该用-1初始化fo

我有一个圆圈的度数数组,[10,90200280355]


我拿到了学位,比如说1。如何确定1最接近355度?

您有一个值,其中包含查找到的关闭度
查找到的度
,还有一个值用于实际差异
度差异

接下来,迭代整个数组并计算两个值:
abs(位置处的度数-目标度数)
abs(位置处的度数-360-目标度数)
。如果其中一个值小于
degree\u difference
,则有一个更接近的度-将其存储在
found\u degree
中,并相应地更新
degree\u difference

就这样

您可能应该用-1初始化
found_degree
,用360初始化
degree_difference
,以确保在给定数组为空的情况下也能正确解释结果,或者只需单独处理输入数组为空的情况


顺便问一下,这是家庭作业吗?

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

这里是一个实际公式:

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

暴力手段是这样的:

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]);
}
var闭合元件;
var闭散度=360;
var-toCompare=355;
var选项=[1,90200280355];

对于(i=0;i,这里有一个很好的小快捷键

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

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

x表示给定的度,y表示第一个结果,z表示第二个结果

if (abs(x-y) < 360+x-z)
    choose y;
else
    choose z;
if(abs(x-y)<360+x-z)
选择y;
其他的
选择z;

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

此公式仅适用于圆。当然,它是伪代码

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

使用本页的注释,我成功地得出了以下代码:

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;
功能最近(度,度){
度=(度/360>1度-(数学地板(度/360)*360):度);
var差=360;
var最近值=-1;

对于(i=0;i而言,这更紧凑、更高效:

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

+1,我最近有一个非常相同的任务,我的解决方案有点问题,所以在我尝试修复它之前,我想看看是否还有其他的实现:-)+1,但需要获得差值的绝对值,并与180(例如,可能是-200)进行比较,然后从360中减去。对于接近零的值,将不起作用,例如,1更接近355而不是10(每件作品)。