Конвертировать из одного диапазона в другой
У меня есть два набора диапазонов, которые мне нужно перевести с одного на другой.
Первый диапазон -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 ответа
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
Надеюсь, что это может помочь.
Существует фундаментальная проблема с проблемой. Вы пытаетесь подогнать три точки одного диапазона к другому диапазону. Если вы просто заинтересованы в сопоставлении двух конечных точек, что было бы легко, вы можете использовать линейную интерполяцию 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).
На диаграмме черная кривая является простым линейным решением. Красная кривая является кусочно-линейной, зеленая - экспоненциальной, а синий - степенью.