From 6eaeabcd1d10942ce7d7b281e42620672f9e2ba9 Mon Sep 17 00:00:00 2001 From: David Schnur Date: Wed, 18 Jul 2012 09:54:35 -0400 Subject: [PATCH] Improve generation of color variations. As the size of the variation increases, the resulting colors approach white and black. To avoid this we now reset the variation when it gets too large. This results in repeated colors, but that's much better than a list full of whites and blacks. --- jquery.flot.js | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/jquery.flot.js b/jquery.flot.js index 847e1e3..f76ebcd 100644 --- a/jquery.flot.js +++ b/jquery.flot.js @@ -439,34 +439,32 @@ neededColors = maxIndex + 1; } - // Generate as many colors as necessary, using the provided - // colors as a base and alternatingly increasing/decreasing - // their luminosity in steps that grow smaller each time we - // hit the edge of the color space. - - var colors = [], variation = 0; - - i = 0; - while (colors.length < neededColors) { - var c; - if (options.colors.length == i) // check degenerate case - c = $.color.make(100, 100, 100); - else - c = $.color.parse(options.colors[i]); + // Generate the needed colors, based on the option colors - // vary color if needed - var sign = variation % 2 == 1 ? -1 : 1; - c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2); + var c, colors = [], colorPool = options.colors, + colorPoolSize = colorPool.length, variation = 0; - // FIXME: if we're getting to close to something else, - // we should probably skip this one - colors.push(c); - - ++i; - if (i >= options.colors.length) { - i = 0; - ++variation; + for (i = 0; i < neededColors; i++) { + + c = $.color.parse(colorPool[i % colorPoolSize] || "#666"); + + // Each time we exhaust the colors in the pool we adjust + // a scaling factor used to produce more variations on + // those colors. The factor alternates negative/positive + // to produce lighter/darker colors. + + // Reset the variation after every few cycles, or else + // it will end up producing only white or black colors. + + if (i % colorPoolSize == 0 && i) { + if (variation >= 0) { + if (variation < 0.5) { + variation = -variation - 0.2; + } else variation = 0; + } else variation = -variation; } + + colors[i] = c.scale('rgb', 1 + variation); } // Finalize the series options, filling in their colors