Javascript 给定度x,在度数组中查找最近的度
我有一个圆圈的度数数组,[10,90200280355]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
我拿到了学位,比如说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(每件作品)。