I was looking for a way to introduce some colour into my example Drawing A Mandelbrot Set With Zend PDF.
The method I settled upon was to use HSV – Hue, Saturation, Value.
I’m not an expert on colour theory, so I may not be the best person to describe how it works. The best way I can though, is to describe it as a cylinder, round the circumference is the hue, the radius is the saturation, and the height is the value. For a detailed definition, read the Wikipedia entry on HSL and HSV.
I can pick a hue and value, then just vary the saturation to give a nice graduated colour version of the earlier grayscale example.
Alternatively I can pick a value and saturation, and vary the hue to give a vivid rainbow style fractal.
To achieve the first, we replace the code in the loop that prepared the grayscale colours, and instead generate our $colours array with the following…
|
1 2 |
list($red, $green, $blue) = hsvToRgb(0.5, $grayLevel, 1); $colours[$i] = new Zend_Pdf_Color_Rgb($red, $green, $blue); |
Firstly we get the values for $red, $green and $blue for a hue of 0.5 (blue), our varying $graylevel between 0 and 1, and a $value of 1 for the most vivid colours. After this we create a Zend_Pdf_Color and store it in the $colours array to use later.
To achieve the latter we just change how we call the hsvToRgb function.
|
1 2 |
list($red, $green, $blue) = hsvToRgb($grayLevel, 1, 1); $colours[$i] = new Zend_Pdf_Color_Rgb($red, $green, $blue); |
Now, you may have noticed that there isn’t a function called hsvToRgb available to PHP. Just drop in the following code.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
function hsvToRgb ($hue, $saturation, $value) { $rgb = array($value, $value, $value); if ($saturation != 0) { $varH = $hue * 6; $varI = floor($varH); $var1 = $value * ( 1 - $saturation ); $var2 = $value * ( 1 - $saturation * ( $varH - $varI ) ); $var3 = $value * ( 1 - $saturation * (1 - ( $varH - $varI ) ) ); if ($varI == 0) { $rgb = array($value, $var3, $var1); } else if ($varI == 1) { $rgb = array($var2, $value, $var1); } else if ($varI == 2) { $rgb = array($var1, $value, $var3); } else if ($varI == 3) { $rgb = array($var1, $var2, $value); } else if ($varI == 4) { $rgb = array($var3, $var1, $value); } else { $rgb = array($value, $var1, $var2); } } return $rgb; } |