Algorithm for coloring a line based on its length

I’m having trouble figuring out the math involved in changing a line’s stroke color based on its variable length. The goal is that when the line gets shorter it will be gradually drawn red and when it gets longer it gradually draws blue. And there is a middle ground where in between shorter and longer it is just white. For example:

-- line test
supportedOrientations(LANDSCAPE_ANY)

function setup()
    parameter.integer( "length", 100, 600, 350 )
    parameter.watch( "i" )
    
    RED_MIN = 200
    RED_MAX = 100
    BLUE_MIN = 500
    BLUE_MAX = 600
end

function draw()
    
    if length <= RED_MIN then
--      i = 255 - (255 * a value between 0 and 1, where 0 is f(length=RED_MIN) and 1 is f(length=RED_MAX)
        c = color(255, i, i, 255)
    elseif length >= BLUE_MIN then
--      i = 255 - (255 * a value between 0 and 1, where 0 is f(length=BLUE_MIN) and 1 is f(length=BLUE_MAX)
        c = color(i, i, 255, 255)
    else
        c = color(255,255,255,255)
    end

    background(40, 40, 50)

    strokeWidth(5)
    stroke(c)
    line(70, HEIGHT/2, 70+length, HEIGHT/2)
end

Thanks again guys!

function interp(l,m,n)
    return math.max(0,math.min(1,(l-m)/(n-m))
end

call as interp(length,RED_MIN,RED_MAX) and you get out a number between 0 and 1 so that if length is in between then it is the correct proportion, but it is “clamped” to the end points in that it never goes below 0 or above 1.

Check this:


-- line test
supportedOrientations(LANDSCAPE_ANY)

function setup()
    parameter.integer( "length", 100, 600, 350 )
    parameter.watch( "i" )

    RED_MIN = 200
    RED_MAX = 100
    BLUE_MIN = 500
    BLUE_MAX = 600
end

function draw()
    background(40, 40, 50)
    strokeWidth(5)
    local r,g,b,i
    if length < RED_MAX then
        r,g,b = 255,0,0
    elseif length < RED_MIN then
        i = 255*(length-RED_MAX)/(RED_MIN-RED_MAX)
        r,g,b = 255,i,i
    elseif length < BLUE_MIN then
        r,g,b = 255,255,255
    elseif length < BLUE_MAX then
        i = 255*(length-BLUE_MAX)/(BLUE_MIN-BLUE_MAX)
        r,g,b = i,i,255
    else
        r,g,b = 0,0,255
    end
    c = color(r,g,b,255)
    stroke(c)
    line(70, HEIGHT/2, 70+length, HEIGHT/2)
end

@Andrew_Stacey and @Jmv38

Excellent solutions guys! Exactly what I was hoping for from this forum! Thanks so much!