Преобразовать произвольную длину в значение между -1,0 и 1,0? - PullRequest
6 голосов
/ 18 июня 2010

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

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

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

Ответы [ 7 ]

11 голосов
/ 18 июня 2010
-1 + (2/440)*x

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

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

a + x*(b-a)/k

, где x равно >= 0 и <= k

4 голосов
/ 18 июня 2010

Это, по сути, два шага:

  1. Центрируйте диапазон по 0, например, диапазон от 400 до 800 ходов, так что он составляет от -200 до 200. Сделайте это, вычтя центр (среднее) из минимума и максимума диапазона
  2. Разделите на абсолютное значение крайних значений диапазона для преобразования из диапазона -n to n в диапазон -1 to 1. В примере от -200 до 200 вы поделили бы на 200
3 голосов
/ 18 июня 2010

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

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

(image alt text)

1 голос
/ 18 июня 2010

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

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

Вы также можете ограничить х диапазоном [-1,1] здесь?

if ( x < -1 ) x = -1.0;
if ( x >  1 ) x =  1.0;

или предоставить какую-либо обратную связь / предупреждение / ошибку, если она выходит за пределы (только если это действительно имеет значение, и просто обрезать его до диапазона [-1,1] недостаточно).

1 голос
/ 18 июня 2010

У вас есть интервал [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 голос
/ 18 июня 2010

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

(XCoordinate - 220) / 220.0
1 голос
/ 18 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...