Как я могу преобразовать длину в значение в диапазоне-1.0 к 1,0?
Пример: мой этап составляет 440 пкс в длине и принимает события от нажатия мыши. Я хотел бы нажать посреди этапа, и а не вывод X = 220
, Я хотел бы, чтобы это было X = 0
. Точно так же я хотел бы реальное X = 0
стать X = -1.0
и реальное X = 440
стать X = 1.0
.
У меня нет доступа к этапу, таким образом, я не могу просто центральный регистр он, который сделал бы этот процесс намного легче. Кроме того, не возможно динамично изменить фактический размер моего этапа, таким образом, я ищу формулу, которая переведет мышь, реальную X координат этапа для ровной установки в диапазоне от-1 до 1.
-1 + (2/440)*x
где x
- расстояние
Итак, обобщим, если минимальное нормированное значение равно a
, а максимальное нормированное значение равно b
(в вашем примере a = -1.0, b = 1. 0
и максимально возможное значение - k
(в вашем примере k = 440
):
a + x*(b-a)/k
где x
- >= 0
и <= k
Не отвечает на ваш вопрос, но для будущих гуглеров, ищущих непрерывную монотонную функцию, которая отображает все действительные числа в (-1, 1), любые сигмовидная кривая , например атан или логистическая кривая :
f(x) = atan(x) / (pi/2) f(x) = 2/(1+e-x) - 1
Вам нужно сместить начало координат и нормализовать диапазон. Таким образом, выражение становится
(XCoordinate - 220) / 220.0
У вас есть интервал [a, b]
, который вы хотите сопоставить с новым интервалом [c, d]
, и значение x
в исходных координатах, которое вы хотите сопоставить с y
в новых координатах.Затем:
y = c + (x-a)*(c-d)/(b-a)
И для вашего примера с [a, b] = [0,440]
и [c, d] = [-1,1]
, с x = 220
:
y = -1 + (220-0)*(1 - -1)/(440-0)
= 0
и так далее.
Кстати, это работает, даже если x
находится вне [a, b]
. Итак, если вы знаете любые два значения в обеих системах, вы можете преобразовать любое значение в любом направлении.
По сути, это два шага:
-n до n
в диапазон от -1 до 1
. В примере от -200 до 200 нужно разделить на 200обработка произвольной ширины сцены (не знаю, есть ли у вас потоки для рассмотрения, для которых могут потребоваться мьютексы или что-то подобное в зависимости от вашего языка?)
stageWidth = GetStageWidth(); // which may return 440 in your case
clickedX = MouseInput(); // should be 0 to 440
x = -1.0 + 2.0 * (clickedX / stageWidth); // scale to -1.0 to +1.0
вы также можете захотеть ограничить x значением range [-1,1] здесь?
if ( x < -1 ) x = -1.0;
if ( x > 1 ) x = 1.0;
или предоставить какую-либо обратную связь / предупреждение / ошибку, если он выходит за пределы (только если он действительно имеет значение, и просто обрезая его до диапазона [-1, 1] недостаточно хорошо).