数值重映射方法(Remap)

Posted 勥小透明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数值重映射方法(Remap)相关的知识,希望对你有一定的参考价值。

数值重映射虽然不属于系统的 api,但在我们平时的工作中又是不可或缺的。

0~1 之间其实很简单

-1,1 -> 0,1 时,就是  x * 0.5 + 0.5 = y
0,1 -> -1,1 时,就是  y * 2 - 1 = x

x和y是具有可逆性的

除了像上面这种确定的值外,比如我的范围是不固定的话怎么办?
别慌,这也是有公式可以用的,要不说数学的世界很神奇呢~

float Remap(float x, float t1, float t2, float s1, float s2)

    return (s2 - s1) / (t2 - t1) * (x - t1) + s1;
    return (x - t1) / (t2 - t1) * (s2 - s1) + s1;

上面这2条公式是等效的,具体怎么用,就看你要怎么组织了。

其中 x = 输入值, t1 = 输入值的最小值, t2 = 输入值的最大值, s1 = 输出值的最小值, s2 = 输出值的最大值

举个🌰:

设 t1=0, t2=1, s1=-1, s2=1时,

当x=0时,函数输出值=-1

当x=1时,函数输出值=1

当x=0.5时,函数输出值=0

怎么样,聪明的你应该看懂怎么用了吧

上面一般是在逻辑脚本里的写法,如果换到 shader 这边,例如 hlsl 的话,因为有矢量寄存器的加持,写起来是这样的

void Remap(float4 In, float2 InMinMax, float2 OutMinMax, out float4 Out)

    Out = (In - InMinMax.x) * (OutMinMax.y - OutMinMax.x) / (InMinMax.y - InMinMax.x) + OutMinMax.x;

像 unity 如果想在 c# 里也能这么写的话,就需要它新的数据库 com.unity.mathematics 才行,它有 SIMD 功能的加持,当然有很多人其实是不太适应 hlsl 这种写法的~

以上是关于数值重映射方法(Remap)的主要内容,如果未能解决你的问题,请参考以下文章

详解OpenCV的坐标重映射函数remap()的两种使用方法并附使用它得到图像的水平镜像和垂直镜像的示例代码

OpenCV 像素重映射(cv::remap)

OpenCV 例程300篇249. 图像的重映射(cv2.remap)

OpenCV 例程300篇249. 图像的重映射(cv2.remap)

STM32上特殊管脚应用 重映射那个GPIO_Remap_SWJ_JTAGDisable

重映射