Nee er bestaat geen magische functie om dit op te lossen... Aangezien je wel een magische classe gebruikt waarvan geen inzicht wordt gegeven kan ik moeilijk een oplossing geven (ik ga de code niet opzoeken), ik kan je wel een aantal (lees: 1) functies geven waardoor je het wel kan laten werken:
Tekst print je via de GD Lib (aannemende dat chartdirector dat ook gebruikt)
http://nl.php.net/manual/en/function.imageftbbox.php
Met deze functie kan je de punten (x1, y1, x2, y2) krijgen waar de tekst begint, en waar deze zou eindigen. Kijk of elke volgende toegevoegde box in deze reeks zit, zo ja, verlaag deze naar de dichtstbijzeinde x1 of y1 (dus links van de tekst) of x2 of y2 (beneden of rechts van de box).
Ja hierbij moet je wel je interne classe waarschijnlijk aanpassen, aangezien deze labels direct boven het driehoekje plaatst.
Succes
Okey een klein voorbeeldje:
PHP:
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
26
27
28
29
30
31
| // Coordinaten array:
$array = array();
// Een paar gegeven coordinaten: (zijn 2 regels onder elkaar... x1, y1 representateren linkerboven hoek,
// x2, y2 de rechteronder hoek
$array[] = array("x1" => 100, "y1" => 100, "x2" => 200, "y2" => 120);
$array[] = array("x1" => 100, "y1" => 120, "x2" => 200, "y2" => 140);
// Nu wil ik het volgende punt toevoegen, ik moet dus gaan kijken of de punten
// niet conflicteren:
$toAdd = array("x1" => 110, "y1" => 100, "x2" => 210, "y2" => 120);
// volgende ga ik vergelijken:
foreach($array as $textItem) {
// x1 moet verder staan dan x2, als deze binnen y1 en y2 staat
// Zelf moet je nog kijken of x2 niet binnen een x1 van textItem valt
if($toAdd['x1'] > $textItem['x2'] || !($toAdd['y1'] >= $textItem['y1'] && $toAdd['y1'] <= $textItem['y2']))
{
// Mja plaatsbaar, niets doen!
}
else
{
// Pas de x1 en x2 aan naar eigen wens, hij moet nu links of rechts van het zojuist geteste
// element staan. Dus geef voor x1 (van toAdd) b.v. x2 (zo zet je m dus rechts van t element neer, waarmee het conflicteerd) mee van $textItem als deze afstand kleiner is,
// plaats m anders op de volgende regel door y2 mee te geven van $textItem aan de y1 van toAdd.
// Laat de loop draaien om volgende conflicten op te lossen
// Kijk dus in beide gevallen vanaf het centrum wat het dichstbijzijnde punt is.
}
} |
Alle handelingen mag je zelf verzinnen verder
Zie hierboven het voorbeeld, daaronder met de rode lijnen is aangegeven hoe je kan kijken wat je moet doen.
Staat hij boven de helft van het tekstelement, verschuif m naar boven, staat hij onder de helft van het tekstelement, verschuif naar onder.
Staat hij bijna recht op het tekstelement, maar dicht bij het einde van x1, verschuif m naar links.
In donkergroen is aangegeven waar hij dan komt te staan (na herberekening). De x en y punten kan je makkelijk terug berekenen.
De 2 roze lijnen geven aan tot waar hij hem naar links of rechts moet schuiven van het tekstelement waar het al stond. Neem hier b.v. 25% voor het einde, en 25% voor het begin voor. Schuif m anders naar boven of naar beneden.
Ik zie net wat in je code:
PHP:
1
2
3
4
| $x1 = $plotAreaObj->getLeftX();
$x2 = $plotAreaObj->getLeftX()+$plotAreaObj->getWidth();
$y1 = $plotAreaObj->getLeftY();
$y2 = $plotAreaObj->getLeftY()+$plotAreaObj->getHeight(); |
zo kan je aan je variabelen komen om bovenstaande functie te doen laten werken.
[
Voor 69% gewijzigd door
XiniX88 op 24-10-2009 16:38
]