WoW:USERAPI ColorGradient: Difference between revisions

no edit summary
m (Correcting a small bug with the perc >= 1 case)
No edit summary
 
(3 intermediate revisions by 3 users not shown)
Line 4: Line 4:
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.
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.)
<pre>
  local function ColorGradient(perc, ...)
  local function ColorGradient(perc, ...)
local num = select("#", ...) / 3
  if perc >= 1 then
  if perc >= 1 then
  local r, g, b = select(num*3-2, ...)
  local r, g, b = select(select('#', ...) - 2, ...)
  return r, g, b
  return r, g, b
  elseif perc <= 0 then
  elseif perc <= 0 then
Line 14: Line 14:
  return r, g, b
  return r, g, b
  end
  end
local num = select('#', ...) / 3
   
   
  local segment, relperc = math.modf(perc*(num-1))
  local segment, relperc = math.modf(perc*(num-1))
Line 20: Line 22:
  return r1 + (r2-r1)*relperc, g1 + (g2-g1)*relperc, b1 + (b2-b1)*relperc
  return r1 + (r2-r1)*relperc, g1 + (g2-g1)*relperc, b1 + (b2-b1)*relperc
  end
  end
</pre>


== Example ==
== 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.
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.
 
<pre>
  local r,g,b = ColorGradient(0.75, 1,0,0, 1,1,0, 0,1,0)
  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
  -- r = 0.5, g = 1.0, b = 0.0
</pre>