# How to scale down a range of numbers with a known min and max value

## Issue

So I am trying to figure out how to take a range of numbers and scale the values down to fit a range. The reason for wanting to do this is that I am trying to draw ellipses in a java swing jpanel. I want the height and width of each ellipse to be in a range of say 1-30. I have methods that find the minimum and maximum values from my data set, but I won’t have the min and max until runtime. Is there an easy way to do this?

## Solution

Let’s say you want to scale a range `[min,max]` to `[a,b]`. You’re looking for a (continuous) function that satisfies

``````f(min) = a
f(max) = b
``````

In your case, `a` would be 1 and `b` would be 30, but let’s start with something simpler and try to map `[min,max]` into the range `[0,1]`.

Putting `min` into a function and getting out 0 could be accomplished with

``````f(x) = x - min   ===>   f(min) = min - min = 0
``````

So that’s almost what we want. But putting in `max` would give us `max - min` when we actually want 1. So we’ll have to scale it:

``````        x - min                                  max - min
f(x) = ---------   ===>   f(min) = 0;  f(max) =  --------- = 1
max - min                                 max - min
``````

which is what we want. So we need to do a translation and a scaling. Now if instead we want to get arbitrary values of `a` and `b`, we need something a little more complicated:

``````       (b-a)(x - min)
f(x) = --------------  + a
max - min
``````

You can verify that putting in `min` for `x` now gives `a`, and putting in `max` gives `b`.

You might also notice that `(b-a)/(max-min)` is a scaling factor between the size of the new range and the size of the original range. So really we are first translating `x` by `-min`, scaling it to the correct factor, and then translating it back up to the new minimum value of `a`.