2min

Het raster tekenen

Het raster wordt in twee stappen getekend. Eerst wordt het horizontale raster getekend en later het verticale raster. Om het horizontale raster te tekenen doorloop ik de waarden die het grafiekgebied moet weergegeven (de minimale en de maximale y waarde dus). Hier voor maak ik gebruik van een for-loop:

PHP Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 // Teken links de waarde labels + horizontaal raster.
for ($waarde = $y_min; $waarde <= $y_max; $waarde += $y_stap)
{
	$y = $rand_boven + $grafiek_hoogte * ( 1 - ($waarde-$y_min) / ($y_max - $y_min) ); 
	imageline($graph, $rand_links, $y, $breedte-$rand_rechts, $y, $raster);
 
	// Lettertype 10px, 0 graden gedraaid, verdana.TTF als font, en de waarde als tekst.
	$tekst_grootte = imagettfbbox(10, 0, "verdana.TTF", $waarde);
 
	$tekst_breedte = $tekst_grootte[4]+$tekst_grootte[0];
	$tekst_hoogte =  0-$tekst_grootte[5];
 
	imagettftext($graph, 10, 0, $rand_links-$tekst_breedte-8, $y + $tekst_hoogte/2, $black, "verdana.TTF", round($waarde,1));
}

De variabele waarde is in het begin gelijkgesteld aan de minimale waarde van de grafiek. Per keer dat de loop is uitgevoerd wordt de stap tussen elk label erbij opgeteld. Dit gaat door totdat het maximum is bereikt.

Als eerst is het nodig de y-waarde (de hoogte waar op getekend moet worden) te berekenen. De x-waarde is namelijk altijd vast. Als eerst is de y-waarde natuurlijk met de hoogte van de omlijsting aan de bovenkant naar beneden geschoven. Vervolgens wordt het deel berekend waar dit label zit.

Na de y-waarde is het nodig om in de grafiek op die hoogte de lijn te tekenen. De lijn moet wel in de grafiek zelf worden getekend, vandaar de verschuiving met rand_links en rand_rechts. Na deze berekening wordt het label getekend. Omdat de tekst kan variëren in grootte wordt imagettfbbox gebruikt. TTF staat voor TrueTypeFont. Bbox is een afkorting voor ‘bounding box’. Dit betekent de denkbeeldige rechthoek waar de tekst in wordt getekend. Deze functie geeft een array mee met acht waardes, waarin de coördinaten staan van elke hoek van deze rechthoek. Op PHP.net staat met welke index welke hoek wordt opgevraagd.

De breedte is dus blijkbaar index 4 en 0 bij elkaar optellen. De hoogte is blijkbaar index 1 en 3 van elkaar af halen. Deze breedtes en hoogtes zijn nodig om de tekst te verschuiven. Aangezien de tekst rechts uitgelijnd moet worden is de breedte zeer belangrijk. De tekst wordt namelijk altijd op het linkerbovenhoekcoördinaat getekend, niet op het rechterbovenhoekcoördinaat.

Vervolgens wordt met imagettftext de tekst daadwerkelijk getekend. De tekst met zijn breedte naar links verschoven, en wordt vervolgens nog eens acht pixels aan marge toegevoegd. De tekst wordt met de helft van de hoogte naar beneden geschoven, op die manier wordt de tekst in het midden gezet (in de hoogte gezien).