我使用JavaScript构建一个指示空速乐器,通过WebSocket从X-Plane获取数据。空速以节点形式接收,需要在仪器上绘制,仪器具有非线性刻度。
一个名为 interval 的数组在仪器上保留一个标记列表,对应于针的旋转角度,以度为单位,以相应的空速为单位。
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值,并在三角公式中使用它来尝试计算针必须以度为单位的角度的余弦插值角度,以表示结中正确的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)'});
}
目前无法正常工作,指针会捕捉到数组中的角度,并且只会在两个时间间隔内对值进行微小的移动。
我不是任何标准的数学家,所以希望有人可以协助上面的数学。解决方案似乎非常接近,但还没有完全削减它。
答案 0 :(得分:0)
cos
函数的参数错误。您的目标是模拟lerp函数y1*(1-f)+y2*f
,其中f
介于0和1之间。
这意味着cos
函数的参数必须介于0和pi/2
之间,其范围是此范围的一小部分,具体取决于整个序列中的位置。