0

我有两组范围需要从一组翻译到另一组。

第一个范围-100 ↔ 1000值。

第二个范围0.0 ↔ 10.01值。

我在 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 使用第一个范围。

4

2 回答 2

2

为什么不尝试这样的事情:

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

希望能有所帮助。

于 2015-09-29T00:47:04.417 回答
1

这个问题有一个根本性的困难。您正在尝试将一个范围的三个点拟合到另一个范围。如果您只是对匹配两个端点感兴趣,那么您可以使用线性插值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)。

四种不同的解决方案

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

于 2015-09-29T05:14:40.337 回答