Преобразовать произвольную длину до значения между-1.0 1.0?

Как я могу преобразовать длину в значение в диапазоне-1.0 к 1,0?

Пример: мой этап составляет 440 пкс в длине и принимает события от нажатия мыши. Я хотел бы нажать посреди этапа, и а не вывод X = 220, Я хотел бы, чтобы это было X = 0. Точно так же я хотел бы реальное X = 0 стать X = -1.0 и реальное X = 440 стать X = 1.0.

У меня нет доступа к этапу, таким образом, я не могу просто центральный регистр он, который сделал бы этот процесс намного легче. Кроме того, не возможно динамично изменить фактический размер моего этапа, таким образом, я ищу формулу, которая переведет мышь, реальную X координат этапа для ровной установки в диапазоне от-1 до 1.

6
задан Michael Mrozek 18 June 2010 в 03:33
поделиться

7 ответов

-1 + (2/440)*x

где x - расстояние

Итак, обобщим, если минимальное нормированное значение равно a, а максимальное нормированное значение равно b (в вашем примере a = -1.0, b = 1. 0 и максимально возможное значение - k (в вашем примере k = 440):

a + x*(b-a)/k

где x - >= 0 и <= k

11
ответ дан 8 December 2019 в 05:53
поделиться

Не отвечает на ваш вопрос, но для будущих гуглеров, ищущих непрерывную монотонную функцию, которая отображает все действительные числа в (-1, 1), любые сигмовидная кривая , например атан или логистическая кривая :

f(x) = atan(x) / (pi/2)  
f(x) = 2/(1+e-x) - 1

(image alt text)

3
ответ дан 8 December 2019 в 05:53
поделиться

(x - 220) / 220 = новый X

Это то, что вы ищете?

1
ответ дан 8 December 2019 в 05:53
поделиться

Вам нужно сместить начало координат и нормализовать диапазон. Таким образом, выражение становится

(XCoordinate - 220) / 220.0
1
ответ дан 8 December 2019 в 05:53
поделиться

У вас есть интервал [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] . Итак, если вы знаете любые два значения в обеих системах, вы можете преобразовать любое значение в любом направлении.

1
ответ дан 8 December 2019 в 05:53
поделиться

По сути, это два шага:

  1. Центрируйте диапазон на 0, например, диапазон от 400 до 800 перемещается так, чтобы он был от -200 до 200. Для этого вычтите центральное (среднее) значение min и max диапазона
  2. Разделите на абсолютное значение крайних значений диапазона, чтобы преобразовать диапазон от -n до n в диапазон от -1 до 1. В примере от -200 до 200 нужно разделить на 200
4
ответ дан 8 December 2019 в 05:53
поделиться

обработка произвольной ширины сцены (не знаю, есть ли у вас потоки для рассмотрения, для которых могут потребоваться мьютексы или что-то подобное в зависимости от вашего языка?)

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] недостаточно хорошо).

1
ответ дан 8 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: