Если я правильно понимаю вопрос, это не сложно сделать, но вам нужно знать возможный диапазон ваших входных значений, прежде чем вы сможете определить нормализованные выходные значения.
Например, если ваши входные значения могут находиться в диапазоне от -500 до +500, то простая функция, такая как input / 500.0, справится с задачей.
Я собираюсь выйти на конечность и предположить, что вы хотите, чтобы любой диапазон значений вы должны были опускать в этот диапазон, от -1 до 1, с масштабированием, установленным так, чтобы самые экстремальные входные значения были быть установленным на -1 и 1 точно.
В этом случае вы хотите перебрать все ваши значения (O (n), блин! ... но вам придется перебирать все ваши значения, чтобы масштабировать их, несмотря ни на что, поэтому O (n ) не избежать), и найдите как самые низкие, так и самые высокие значения. Определите разницу между этими двумя значениями, разделите ее на выходной диапазон и используйте ее в качестве коэффициента масштабирования. Для каждого числа, которое вы хотите масштабировать, добавьте значение, обратное минимальному входному значению, масштабируйте по коэффициенту масштабирования и затем вычтите смещение выходного диапазона.
Это звучит как много тарабарщины, поэтому позвольте мне привести пример. Например, после итерации вы обнаружите, что минимальное входное значение равно -300, а максимальное входное значение равно 700. Разница между этими двумя значениями (abs (max-min)) составляет 1000. Поскольку ваш выходной диапазон имеет размер 2 (-1 1) разделите ваш коэффициент масштабирования на 2 ... это даст вам ваш конечный коэффициент масштабирования 1000/2 = 500.
Затем вы берете первую точку в ваших входных данных ... мы скажем, что это 334. Вы вычитаете из нее минимальное значение, получая 334 + 300 = 634. Вы делите это число на свой коэффициент масштабирования, так что вы получите 634/500 = 1,268. Возьмите это число и вычтите 1 (иначе мы будем масштабироваться до (от 0 до 2) вместо (от -1 до 1). Это дает 0,268. Это ваш ответ. Сделайте это для всех точек в вашем наборе, и все готово.
Быстрая проверка работоспособности показывает, что если мы попробуем 700 (максимальное значение в нашем наборе), то получим ((700 + 300) / 500) - 1 = 1. Аналогично, если мы попробуем -300, мы получим ((-300 + 300) / 500) - 1 = -1.
Так что включите это в функцию, и все хорошо.
Если ваш диапазон ввода не зависит от вашего ввода, но является известной константой, вы, конечно, можете избежать итерации по данным в начале, что, безусловно, было бы хорошо.
Так что, надеюсь, это поможет ... Я не буду беспокоиться о написании реальной функции ... Я предполагаю, что это будет довольно просто. Но если у вас есть какие-либо вопросы или я неправильно понял концепцию, дайте мне знать.
Редактировать: Отвечая на ваше заявление:
Это движение мышки. Значения представляют собой разницу в координатах мыши между одним тиком и следующим. Я не уверен, каково максимальное значение для этого.
Предположительно, в этой системе существует какое-то ограничение драйвера ... если нормальное движение мыши, скажем, (-5, 3), предположительно, мышь просто не может зарегистрировать произвольно большие значения (1000000, 1000000) для движения. Вам нужно выяснить, каков рабочий диапазон для мыши, и какие значения могут из него выйти, и это даст вам ваши минимальные и максимальные значения.