从一个范围转换为另一个范围

时间:2015-09-28 20:18:57

标签: actionscript-3 math range vapoursynth

我需要将两组范围从一个范围翻译成另一个范围。

第一个范围是-100 ↔ 100,默认为0

第二个范围是0.0 ↔ 10.0,默认为1

我在AS3中使用第一个范围,第二个范围是python类,我需要这些数字排成一行。

我正在使用滑块实时调整视频的亮度。视频过滤器接受-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类:https://github.com/dubhater/vapoursynth-adjust它使用第二个范围,而AS3使用第一个范围。

2 个答案:

答案 0 :(得分:2)

Why not trying something like this :

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

Hope that can help.

答案 1 :(得分:1)

这个问题存在根本性的困难。你试图将一个范围的三个点放到另一个范围上。如果您只想对两个端点进行匹配,那么您可以使用线性插值y = 10 * (x+100) /200或简单y = (x+100)/20或等效y=x/20+5。问题是它与默认值不匹配且x = 0 - &gt; 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)。

Four different solutions

在图中,黑色曲线是一个简单的线性解决方案。红色曲线是分段线性曲线,绿色曲线是指数曲线,蓝色曲线是幂曲线。