在比例之间映射一个值
创建数据的图形或视觉表示时的常用技术是在两个比例之间映射一个值。这在处理一组值时很有用,并且您需要将它们映射到一组不同的值以便在图形上显示它们。
这里涉及的数学本质上是弄清楚我们初始尺度(x,y)中的值(v)之间的关系,并将其乘以第二个尺度(a,b)的最大范围。
a + (b - a) * ((v - x) / (y - x))
取0.5的值,它在0到1的范围内。将其映射到0到100的范围意味着我们进行以下计算。
0+(100−0)×((0.5−0)÷(1−0))
这导致值为50。
将此数学转换为PHP中的函数,我们得到以下结果。
/** * Map a value between scales. * * @param int|float $value * The value to map. * @param int|float $valueRangeStart * The value range start. * @param int|float $valueRangeEnd * The value range end. * @param int|float $newRangeStart * The new range start. * @param int|float $newRangeEnd * The new range end. * * @return int|float * The new value, mapped to the new range. */ function map($value, $valueRangeStart, $valueRangeEnd, $newRangeStart, $newRangeEnd) { return $newRangeStart + ($newRangeEnd - $newRangeStart) * (($value - $valueRangeStart) / ($valueRangeEnd - $valueRangeStart)); }
我们可以很容易地使用它来将0到1范围内的值打印为0到100范围内的值。
for ($i = 0; $i < 1; $i += 0.1) { echo map($i, 0, 1, 0, 100) . PHP_EOL; }
这将打印出以下值。
0 10 20 30 40 50 60 70 80 90 100
我们还可以使用此函数将时间值映射到十进制值。
echomap(30,0,60,0,100).PHP_EOL;
这将打印出50的值。
此函数还可用于将较大的值归一化为0到1的范围,这在神经网络中执行数学运算时非常有用。
echomap(342,0,500,0,1).PHP_EOL;
这将打印出0.684的值 。