How can I convert a length into a value in the range -1.0 to 1.0?
Example: my stage is 440px in length and accepts mouse events. I would like to click in the middle of the stage, and rather than an output of X = 220
, I'd like it to be X = 0
. Similarly, I'd like the real X = 0
to become X = -1.0
and the real X = 440
to become X = 1.0
.
I don't have access to the stage, so i can't simply center-register it, which would make this process a lot easier. Also, it's not possible to dynamically change the actual size of my stage, so I'm looking for a formula that will translate the mouse's real X coordinate of the stage to evenly fit within a range from -1 to 1.
where
x
is the distanceSo, to generalize it, if the minimum normalized value is
a
and the maximum normalized value isb
(in your examplea = -1.0, b = 1.0
and the maximum possible value isk
(in your examplek = 440
):where
x
is>= 0
and<= k
handling arbitrary stage widths (no idea if you've got threads to consider, which might require mutexes or similar depending on your language?)
you may also want to limit x to the range [-1,1] here?
or provide some kind of feedback/warning/error if its out of bounds (only if it really matters and simply clipping it to the range [-1,1] isn't good enough).
You have an interval
[a,b]
that you'd like to map to a new interval[c,d]
, and a valuex
in the original coordinates that you'd like to map toy
in the new coordinates. Then:And for your example with
[a,b] = [0,440]
and[c,d] = [-1,1]
, withx=220
:and so forth.
By the way, this works even if
x
is outside of[a,b]
. So as long as you know any two values in both systems, you can convert any value in either direction.You need to shift the origin and normalize the range. So the expression becomes
This is essentially two steps:
-n to n
range to a-1 to 1
range. In the -200 to 200 example, you'd divide by 200Doesn't answer your question, but for future googlers looking for a continuous monotone function that maps all real numbers to (-1, 1), any sigmoid curve will do, such as atan or a logistic curve: