JavaScript实现[1,2]输入范围到自定义输出区间的映射方法
固定输入区间到自定义输出区间的线性映射方案
这是标准的线性区间重映射问题,你之前找不到统一乘数是正常的——线性映射是y = 斜率 * x + 偏移量的结构,不是纯乘法关系,自然不存在跨所有输入点、所有输出范围的固定乘数。
通用计算公式
已知固定输入为x = a/b(对应你的缩放比endScale/startScale),取值范围恒为[1, 2];自定义输出y的范围为[ymin, ymax],要求线性对应(输入进度提升多少百分比,输出就提升多少百分比),推导逻辑如下:
- 第一步:把输入值转换为[0,1]区间的进度比例:输入区间总长度为
2-1=1,因此输入x对应的进度p = x - 1。比如x=1.5时p=0.5,正好对应50%的进度,和你手动演算的比例完全匹配。 - 第二步:把进度比例映射到输出区间:输出区间总长度为
ymax - ymin,进度p对应的输出增量为p * (ymax - ymin),加上输出区间最小值就是最终结果。
合并后得到最终通用公式:
y = ymin + (x - 1) * (ymax - ymin)
用你给出的透明度范围0.12~0.38做验证:
- x=1时:
y = 0.12 + 0 * (0.38-0.12) = 0.12,符合要求 - x=1.25时:
y = 0.12 + 0.25 * 0.26 = 0.185,和你手动计算结果一致 - x=1.5时:
y = 0.12 + 0.5 * 0.26 = 0.25,符合要求 - x=1.75时:
y = 0.12 + 0.75 * 0.26 = 0.315,和你手动计算结果一致 - x=2时:
y = 0.12 + 1 * 0.26 = 0.38,符合要求
可直接使用的JavaScript实现
封装为通用函数,支持任意自定义透明度范围,同时增加边界钳制避免异常输入导致结果超出配置范围:
function calculateGridOpacity(scaleRatio, opacityMin, opacityMax) { // 钳制输入到合法的[1,2]区间 const validRatio = Math.max(1, Math.min(2, scaleRatio)); return opacityMin + (validRatio - 1) * (opacityMax - opacityMin); }
说明
你之前演算时发现不同输入点的y/x乘数不统一,是因为线性关系存在固定偏移量(也就是x=1时的基础输出值ymin),不是纯比例乘法,这个现象完全正常,不代表线性方案不符合需求。该公式可以适配任意自定义输出范围,不管是透明度、尺寸还是其他线性映射需求,只要输入固定在[1,2]区间都可以直接使用。
内容的提问来源于stack exchange,提问作者Bachir Messaouri
相关产品推荐
相关产品推荐

