ColorGradient

__NOTOC__
Converts a percent value into a gradient from 2 or more RGB percent values (0.0-1.0). If more than 2 colors are passed, the gradient will be between the two colors which perc lies in an evenly divided range.
(Note that if you will always be generating a gradient between the same number of colors, you will see *significantly* greater performance if you customize this function to take a fixed number of arguments.)
 local function ColorGradient(perc, ...)
 	if perc >= 1 then
 		local r, g, b = select(select('#', ...) - 2, ...)
 		return r, g, b
 	elseif perc <= 0 then
 		local r, g, b = ...
 		return r, g, b
 	end
 	
 	local num = select('#', ...) / 3
 
 	local segment, relperc = math.modf(perc*(num-1))
 	local r1, g1, b1, r2, g2, b2 = select((segment*3)+1, ...)
 
 	return r1 + (r2-r1)*relperc, g1 + (g2-g1)*relperc, b1 + (b2-b1)*relperc
 end
The same function, changed to accept only 3 colors and optimize speed.
 local function ColorGradient(perc, r1,g1,b1, r2,g2,b2, r3,g3,b3)
 if perc >= 1 then
 return r3, g3, b3
 elseif perc <= 0 then
 return r1, g1, b1
 end
 
 local segment, relperc = math.modf(perc * 2)
 local rr1, rg1, rb1, rr2, rg2, rb2 = select((segment * 3) + 1, r1,g1,b1, r2,g2,b2, r3,g3,b3)
 
 return rr1 + (rr2 - rr1) * relperc, rg1 + (rg2 - rg1) * relperc, rb1 + (rb2 - rb1) * relperc
 end
== Example==
For this example we'll use 3 colors: red, yellow and green. For a percent value of 0.75 we'd expect to get back a color that's halfway between yellow and green. 0.5 would yield pure yellow, 0.25 would yield an orange.
local r,g,b = ColorGradient(0.75, 1,0,0, 1,1,0, 0,1,0) -- r = 0.5, g = 1.0, b = 0.0