从一个范围转换到另一个范围
Convert from one range to another
我有两组范围需要从一组转换到另一组。
第一个范围是 -100 ↔ 100
,默认为 0
。
第二个范围是 0.0 ↔ 10.0
,默认为 1
。
我在 AS3 中工作,第一个范围是 python class,我需要这些数字对齐。
我正在使用滑块实时调整视频的亮度。视频过滤器接受 -100 ↔ 100
之间的值。然后我需要获取该值并将其传递给 python 脚本,但它只接受来自 0.0 ↔ 10.0
的值
我尝试了在网上找到的这个函数,但在这种特殊情况下它没有正确转换值。
private function convertRange(originalStart:Number,originalEnd:Number,newStart:Number,newEnd:Number,value:Number):Number
{
var originalRange:Number = originalEnd - originalStart;
var newRange:Number = newEnd - newStart;
var ratio:Number = newRange / originalRange;
var newValue:Number = value * ratio;
var finalValue:Number = newValue + newStart;
return finalValue;
}
这可能吗?希望我的问题很清楚,如果需要澄清,请告诉我。
我指的是 python class:https://github.com/dubhater/vapoursynth-adjust 它使用第二个范围,而 AS3 使用第一个范围。
为什么不尝试这样的事情:
function from_AS_to_PY(as_value:Number): Number // as_value : -100 ----- 0 ----- 100
{
var py_value:Number = (as_value / 100);
py_value = (py_value <= 0 ? py_value : py_value * 9) + 1;
return py_value;
}
function from_PY_to_AS(py_value:Number): Number // py_value : 0 - 1 --------- 10
{
var as_value:Number = (py_value <= 1 ? py_value - 1 : ((py_value - 1) / 9)) * 100;
return as_value;
}
trace(from_AS_to_PY(-100)); // gives : 0
trace(from_AS_to_PY(-99)); // gives : 0.01
trace(from_AS_to_PY(-1)); // gives : 0.99
trace(from_AS_to_PY(0)); // gives : 1
trace(from_AS_to_PY(1)); // gives : 1.09
trace(from_AS_to_PY(99)); // gives : 9.91
trace(from_AS_to_PY(100)); // gives : 10
//---------------------------------------------------
trace(from_PY_to_AS(0)); // gives : -100
trace(from_PY_to_AS(0.01)); // gives : -99
trace(from_PY_to_AS(0.99)); // gives : -1
trace(from_PY_to_AS(1)); // gives : 0
trace(from_PY_to_AS(1.09)); // gives : 1
trace(from_PY_to_AS(9.91)); // gives : 99
trace(from_PY_to_AS(10)); // gives : 100
希望能帮到你。
这个问题有一个根本性的困难。您正在尝试将一个范围的三个点拟合到另一个范围。如果您只是对匹配两个容易的端点感兴趣,您可以使用线性插值 y = 10 * (x+100) /200
或简单地 y = (x+100)/20
或等效的 y=x/20+5
。问题是它与默认值和 x=0 -> 5 不匹配。
这可能是您想要的解决方案。但是,如果默认值匹配很重要,则需要使用非线性解决方案。有许多可能的解决方案。您可以使用像 akmozo 解决方案这样的分段线性解决方案,它需要一个 if 语句。 if x<0 then y = x/100+1 else y = 1 + 9 x /100
。这个的问题是你没有得到一个流畅的响应。考虑将滑块从最小值调整到最大值,您会看到开始时亮度的增加非常缓慢,然后当您超过零时它开始增加得更快。
范围的前半部分和后半部分之间的巨大差异表明采用指数型解决方案。 y = A exp(b x)
。取 y = exp(x * ln(10)/100)
匹配中心点和顶端,底端稍微高一点,为 0.1,而不是零。这可能没问题,否则您可以找到一个指数解 y = A exp(b x)-c
匹配所有三个点。
另一种可能是使用力量。像 y = A pow(x,n)
这样的等式。一些计算表明 y=10 pow(x/200+0.5),3.321928095)
匹配所有三个点。常数 3.321928095 = ln(0.1)/ln(0.5).
图中黑色曲线是简单的线性解。红色曲线是分段线性曲线,绿色是指数曲线,然后蓝色是幂。
我有两组范围需要从一组转换到另一组。
第一个范围是 -100 ↔ 100
,默认为 0
。
第二个范围是 0.0 ↔ 10.0
,默认为 1
。
我在 AS3 中工作,第一个范围是 python class,我需要这些数字对齐。
我正在使用滑块实时调整视频的亮度。视频过滤器接受 -100 ↔ 100
之间的值。然后我需要获取该值并将其传递给 python 脚本,但它只接受来自 0.0 ↔ 10.0
我尝试了在网上找到的这个函数,但在这种特殊情况下它没有正确转换值。
private function convertRange(originalStart:Number,originalEnd:Number,newStart:Number,newEnd:Number,value:Number):Number
{
var originalRange:Number = originalEnd - originalStart;
var newRange:Number = newEnd - newStart;
var ratio:Number = newRange / originalRange;
var newValue:Number = value * ratio;
var finalValue:Number = newValue + newStart;
return finalValue;
}
这可能吗?希望我的问题很清楚,如果需要澄清,请告诉我。
我指的是 python class:https://github.com/dubhater/vapoursynth-adjust 它使用第二个范围,而 AS3 使用第一个范围。
为什么不尝试这样的事情:
function from_AS_to_PY(as_value:Number): Number // as_value : -100 ----- 0 ----- 100
{
var py_value:Number = (as_value / 100);
py_value = (py_value <= 0 ? py_value : py_value * 9) + 1;
return py_value;
}
function from_PY_to_AS(py_value:Number): Number // py_value : 0 - 1 --------- 10
{
var as_value:Number = (py_value <= 1 ? py_value - 1 : ((py_value - 1) / 9)) * 100;
return as_value;
}
trace(from_AS_to_PY(-100)); // gives : 0
trace(from_AS_to_PY(-99)); // gives : 0.01
trace(from_AS_to_PY(-1)); // gives : 0.99
trace(from_AS_to_PY(0)); // gives : 1
trace(from_AS_to_PY(1)); // gives : 1.09
trace(from_AS_to_PY(99)); // gives : 9.91
trace(from_AS_to_PY(100)); // gives : 10
//---------------------------------------------------
trace(from_PY_to_AS(0)); // gives : -100
trace(from_PY_to_AS(0.01)); // gives : -99
trace(from_PY_to_AS(0.99)); // gives : -1
trace(from_PY_to_AS(1)); // gives : 0
trace(from_PY_to_AS(1.09)); // gives : 1
trace(from_PY_to_AS(9.91)); // gives : 99
trace(from_PY_to_AS(10)); // gives : 100
希望能帮到你。
这个问题有一个根本性的困难。您正在尝试将一个范围的三个点拟合到另一个范围。如果您只是对匹配两个容易的端点感兴趣,您可以使用线性插值 y = 10 * (x+100) /200
或简单地 y = (x+100)/20
或等效的 y=x/20+5
。问题是它与默认值和 x=0 -> 5 不匹配。
这可能是您想要的解决方案。但是,如果默认值匹配很重要,则需要使用非线性解决方案。有许多可能的解决方案。您可以使用像 akmozo 解决方案这样的分段线性解决方案,它需要一个 if 语句。 if x<0 then y = x/100+1 else y = 1 + 9 x /100
。这个的问题是你没有得到一个流畅的响应。考虑将滑块从最小值调整到最大值,您会看到开始时亮度的增加非常缓慢,然后当您超过零时它开始增加得更快。
范围的前半部分和后半部分之间的巨大差异表明采用指数型解决方案。 y = A exp(b x)
。取 y = exp(x * ln(10)/100)
匹配中心点和顶端,底端稍微高一点,为 0.1,而不是零。这可能没问题,否则您可以找到一个指数解 y = A exp(b x)-c
匹配所有三个点。
另一种可能是使用力量。像 y = A pow(x,n)
这样的等式。一些计算表明 y=10 pow(x/200+0.5),3.321928095)
匹配所有三个点。常数 3.321928095 = ln(0.1)/ln(0.5).
图中黑色曲线是简单的线性解。红色曲线是分段线性曲线,绿色是指数曲线,然后蓝色是幂。