【问题标题】:JavaScript cosine interpolationJavaScript 余弦插值
【发布时间】: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


【解决方案1】:

cos 函数的参数错误。您的目标是模拟 lerp 函数 y1*(1-f)+y2*f,其中 f 介于 0 和 1 之间。

这意味着您的 cos 函数的参数必须介于 0 和 pi/2 之间,其中您的范围是其中的一小部分,具体取决于您在整个序列中的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多