2015-09-28 3 views
0

У меня есть два набора диапазонов, которые мне нужно перевести с одного на другой.Конвертировать из одного диапазона в другой

Первый диапазон: -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 использует первый диапазон.

+0

добавьте 100, а затем разделите их на 20. (хотя вам может потребоваться проверить, что значение не равно 0 перед делением), например: 'pythonVal = (as3Val + 100)/20;' – BadFeelingAboutThis

+0

@BadFeelingAboutЭто как бы работая над тем, как работает моя функция. Скажем, я положил свой слайдер на 0, pythonVal показывает 5, где он должен показывать 1. Мне интересно, могу ли я изменить этот скрипт python для принятия тех же значений. AS3 использует – Ronnie

+0

. Если ваш слайдер равен «0» (указанная половина точки между -100 и 100), это должно быть '5' в python (половина от 0 до 10), а не' 1' - если вы не ошиблись в своем сообщении – BadFeelingAboutThis

ответ

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 

Надежда, которая может помочь.

+0

. Чтобы соответствовать двум конечным точкам, а по умолчанию требуется нелинейное решение. Вы делаете это, используя два кусочно-линейных сегмента. Это верный ответ, но он может быть не идеальным, подумайте о том, чтобы настроить слайдер от min до max, вы видите очень медленное увеличение яркости, чтобы начать, а затем оно начинает увеличиваться намного быстрее, если вы пройдете ноль. –

+0

Я плюхнулся и, кажется, отлично работает. Как отметил @Salixalba, если x <0, яркость изменяется намного медленнее, чем если x> 0, но это может быть так, как python обрабатывает эти значения (я вроде думал, что это произойдет в любом случае). Мой парень-питон сегодня, поэтому я собираюсь спросить его, насколько строгие числа питона и, если возможно, используйте значения, которые я использую здесь, в AS. – Ronnie

+0

Я собираюсь принять этот ответ, потому что именно это задал мой вопрос. Я не уверен, буду ли я придерживаться этой формулы, но это, безусловно, решает мою проблему. – Ronnie

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. Проблема с этим заключается в том, что вы не получаете гладкой реакции. Подумайте о настройке ползунка от min до max, вы увидите очень медленное увеличение яркости для начала, а затем оно начинает увеличиваться намного быстрее, как только вы пройдете ноль.

Большое различие между первой половиной диапазона и второй половиной предполагает использование экспоненциального типа. 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

В диаграмме черная кривая является простым линейным решением. Красная кривая - кусочно-линейная, зеленая - экспоненциальная, тогда синяя - мощность.

+0

Благодарим вас за разъяснение этого в такой детали. Хотя я не мог видеть эти графики в своем уме, не говоря уже об этом, я подумал, что это так, потому что значения Python уменьшают яркость, а x <1, но заканчивается на 0. Я решил, что слайдер будет значительно сокращаться после 0 и медленно увеличиваться после 1. Мой инженер-питон сегодня, и я собираюсь спросить его, насколько строги эти значения: от 0.0 до 10.0. Может быть, он может соответствовать моим значениям AS, и это просто решит все это. – Ronnie

Смежные вопросы