【发布时间】:2015-05-08 03:18:11
【问题描述】:
我正在使用 JavaScript 构建一个 Indicated Airspeed 仪器,它通过 WebSocket 从 X-Plane 获取数据。空速以节为单位,需要在具有非线性刻度的仪器上绘制。
一个名为intervals的数组在仪器上保存了一个标记列表,对应于针的旋转角度,以度为单位,对应的空速以节为单位。
var intervals = {
0: 0.00,
40: 29.73,
50: 49.00,
60: 69.67,
70: 91.25,
80: 114.51,
90: 137.42,
100: 162.68,
110: 185.38,
120: 206.40,
130: 222.46,
140: 238.30,
150: 252.54,
160: 267.25,
170: 279.28,
180: 291.76,
190: 304.81,
200: 317.29
};
插值函数接收上述数组,计算出 x 之间的 y1 和 y2 值,并在三角公式中使用该值来尝试计算针必须倾斜的余弦插值角,以度为单位,以表示Knots 中的正确 IAS。
function interpolate(intervals, x) {
var y1, y2, angle = 0;
// Find y1 <= mu <= y2
for (var key in intervals) {
var f_key = parseFloat(key);
if (x < f_key) {
y1 = intervals[f_key - 10] / 360;
y2 = intervals[f_key] / 360;
break;
}
}
// Calculate cosine interpolated value and return
x = x / 360;
f = (1 - Math.cos(x * Math.PI)) / 2;
angle = (y1 * (1 - f) + y2 * f);
return angle * 360;
}
function setIas(kts) {
var angle = interpolate(intervals, kts);
$('g#needle-1').css({transform: 'rotate(' + angle + 'deg)'});
}
目前这不起作用,指针会捕捉到数组中的角度,并且只对两个间隔之间的值进行微小的移动。
按照任何标准,我都不是数学家,所以希望有人可以帮助解决上述数学问题。解决方案似乎非常接近,但还没有完全解决。
【问题讨论】:
-
我不确定你想要这个东西有多准确,但这不是真正的 IAS 指标的工作方式。他们在断点之间使用线性插值。资料来源:我以制造航空电子仪器为生。
-
@Blindy 很高兴听到这个消息,谢谢。这意味着问题更容易解决。我想我会这样做,我只是在研究余弦插值,因为我担心针的运动在断点间隔周围看起来有点狡猾。
-
规则一般是越简单越好:)
标签: javascript interpolation trigonometry