求可实现-1映射到1、1映射到0的简单计算机数学函数
求可实现-1映射到1、1映射到0的简单计算机数学函数
哈哈,这种搞反精灵表行的情况我也碰到过!不用纠结,几个超简单的表达式就能搞定这个映射,都是你提到的标准计算机数学运算,给你列几个实用的选项:
最简洁的线性表达式:
f(v) = (1 - v) / 2
验证一下:当v=-1时,(1 - (-1))/2 = 2/2 = 1;当v=1时,(1 - 1)/2 = 0/2 = 0,完全符合你的需求。这个表达式计算效率极高,不管是整数还是浮点数环境都能直接用,甚至在只支持整数运算的语言里(比如C),结果也会是正确的整数,不需要额外处理。基于绝对值的表达式:
f(v) = (abs(v) - v) / 2
这个逻辑也很直观:因为你的v只有±1两种值,abs(v)永远是1。代入v=-1时,(1 - (-1))/2 = 1;v=1时,(1 - 1)/2 = 0,同样满足要求。如果你的代码里已经频繁用到绝对值函数,这个写法也很顺手。整数位运算小技巧(仅适用于整数类型的v):
f(v) = (1 - v) >> 1
这其实是第一个表达式的整数优化版,因为对于整数来说,除以2等价于右移1位(正数和负数的补码右移都适用)。计算速度比除法更快,适合对性能有要求的场景,结果和第一个表达式完全一致。
直接把上面任意一个函数套在你的velocity变量上,得到的结果就是纠正后的精灵表行号,刚好能把搞反的行对应回来,完美解决你的问题~
备注:内容来源于stack exchange,提问作者Math chiller




