【问题标题】:What is the common name for mapping one range of numbers maps to another range of numbers?将一个数字范围映射到另一个数字范围的通用名称是什么?
【发布时间】:2018-09-21 18:12:19
【问题描述】:

我很确定这是一种常见的模式,但我正在寻找将一个数字范围与另一个数字范围匹配的模式的名称。类似的东西:

Map(from1: 60, to1: 90, from2: 100, to2: 140, value: 75);  // Result: 120 (middle of from2/to2)
Map(from1: 60, to1: 90, from2: 100, to2: 140, value: 30);  // Result: 100 (clamped bottom)
Map(from1: 60, to1: 90, from2: 100, to2: 140, value: 60);  // Result: 100 (bottom)
Map(from1: 60, to1: 90, from2: 100, to2: 140, value: 500); // Result: 140 (clamped to2)
Map(from1: 60, to1: 90, from2: 100, to2: 140, value: 85);  // Result: 133.33 (in between)

这个方法的名称是什么?我专门在 Unity 中寻找解决方案,但我很确定如果我知道模式的名称我能找到它。

【问题讨论】:

  • 我称之为线性插值。 numpy.interp 将自己描述为“分段线性插值”,在 len(xp) == len(fp) == 2 的情况下,它具有您所描述的行为,包括钳位。例如。 numpy.interp(85, [60, 90], [100, 140]) -> 133.33333333333331.

标签: function math naming


【解决方案1】:

没关系 - 我在虚幻引擎教程中找到了它:

https://www.youtube.com/watch?v=11T4UvkVYb8

这里使用的术语是 MapRangeClamped 和 MapRangeUnclamped。

这是 C# 的代码:

public static class FloatExtensions
{
    public static float MapRange(this float value, float from1, float to1, float from2, float to2, bool clamp = false) 
    {
        if ( clamp )
        {
            if ( value < from1 )
                return from2;
            if ( value > to1 )
                return to2;
        }

        return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多