Autor | Zpráva | ||
---|---|---|---|
Seki Profil |
Zdravím, při tvorbě grafu v PHP přes GD library jsem narazil na problém se stínem koláče. Pokud některý z kvadrantů překročí hranici 90 stupňů stín se vygeneruje špatně. Kód vám možná bude připadat složitý, ale je vytržen z širšího kontextu. Generování probíhá zprava do leva, takže se překreslí kus vedlejšího kvadrantu.
<?php // kódování musí být v ISO 8859-2 # úprava funkce function imgFilledArc ($image, $sx, $sy, $start, $end, $color) { return imageFilledArc ($image, $sx, $sy, 250, 170, $start, $end, $color, IMG_ARC_PIE); } # vstupní data $data = array(10, 15, 18, 110); $values = array("Moľnost 1", "Moľnost 2", "Moľnost 3", "Moľnost4"); $question = "Otázka....?"; # procento $setina = array_sum($data) / 100; # tvorba obrázku $image = imageCreate(650, 300); # barvy $white = imageColorAllocate($image, 255, 255, 255); # nastaví se jako pozadí stránky $black = imageColorAllocate($image, 0, 0, 0); $silver = imageColorAllocate($image, 192, 192, 192); $lBlue = imageColorAllocate($image, 0, 94, 188); $dBlue = imageColorAllocate($image, 0, 4, 98); $lYellow = imageColorAllocate($image, 255, 251, 17); $dYellow = imageColorAllocate($image, 165, 161, 0); $lRed = imageColorAllocate($image, 255, 74, 38); $dRed = imageColorAllocate($image, 165, 0, 0); $lGreen = imageColorAllocate($image, 154, 235, 103); $dGreen = imageColorAllocate($image, 65, 145, 13); $nadpis = imageColorAllocate($image, 0, 68, 204); $lColors = array($lBlue, $lGreen, $lYellow, $lRed); $dColors = array($dBlue, $dGreen, $dYellow, $dRed); # počty $countOfData = sizeOf($data); $countOfColors = sizeOf($lColors); # výpočty úhlů $start = array(0); $end = array(); for ($i = 0; $i < $countOfData; $i++) { $start[] = $start[$i] + ($data[$i] / $setina) * 3.6; # poslední prvek je navíc $end[] = $start[$i+1]; } # 3D efekt for ($i = 0; $i < $countOfData; $i++) { for ($y = 160; $y > 145; $y--) { imgFilledArc ($image, 175, $y, $start[$i], $end[$i], $dColors[$i]); } } # samotný graf for ($i = 0; $i < $countOfData; $i++) { imgFilledArc ($image, 175, 145, $start[$i], $end[$i], $lColors[$i]); } # vykreslení header('Content-type: image/png'); imagePng($image); imageDestroy($image); |
||
posuk13 Profil |
#2 · Zasláno: 14. 1. 2013, 17:07:35
Takze tu mas riesenie.
<?php // kódování musí být v ISO 8859-2 # úprava funkce function imgFilledArc ($image, $sx, $sy, $start, $end, $color) { return imageFilledArc ($image, $sx, $sy, 250, 170, $start, $end, $color, IMG_ARC_PIE); } # vstupní data $data = array(10, 10, 35, 120); $values = array("Moľnost 1", "Moľnost 2", "Moľnost 3", "Moľnost4"); $question = "Otázka....?"; # procento $setina = array_sum($data) / 100; # tvorba obrázku $image = imageCreate(650, 300); # barvy $white = imageColorAllocate($image, 255, 255, 255); # nastaví se jako pozadí stránky $black = imageColorAllocate($image, 0, 0, 0); $silver = imageColorAllocate($image, 192, 192, 192); $lBlue = imageColorAllocate($image, 0, 94, 188); $dBlue = imageColorAllocate($image, 0, 4, 98); $lYellow = imageColorAllocate($image, 255, 251, 17); $dYellow = imageColorAllocate($image, 165, 161, 0); $lRed = imageColorAllocate($image, 255, 74, 38); $dRed = imageColorAllocate($image, 165, 0, 0); $lGreen = imageColorAllocate($image, 154, 235, 103); $dGreen = imageColorAllocate($image, 65, 145, 13); $nadpis = imageColorAllocate($image, 0, 68, 204); $lColors = array($lBlue, $lGreen, $lYellow, $lRed); $dColors = array($dBlue, $dGreen, $dYellow, $dRed); # počty $countOfData = sizeOf($data); $countOfColors = sizeOf($lColors); # výpočty úhlů $start = array(0); $end = array(); for ($i = 0; $i < $countOfData; $i++) { $start[] = $start[$i] + ($data[$i] / $setina) * 3.6; # poslední prvek je navíc $end[] = $start[$i+1]; } # 3D efekt for ($i = 0; $i <$countOfData; $i++) { if(($start[$i]<90)AND($end[$i]>90)) { $last=$i; $i==$countOfData+100; }else{ for ($ii = 160; $ii > 145; $ii--) { imgFilledArc ($image, 175, $ii, $start[$i], $end[$i], $dColors[$i], IMG_ARC_PIE); } } } if(!empty($last)) { for ($i = $countOfData-1; $i>=$last; $i--) { for ($ii = 160; $ii > 145; $ii--) { imgFilledArc ($image, 175, $ii, $start[$i], $end[$i], $dColors[$i], IMG_ARC_PIE); } } } # samotný graf for ($i = 0; $i < $countOfData; $i++) { //imgFilledArc ($image, 185, 145+$i, $start[$i], $end[$i], $dColors[$i], IMG_ARC_PIE); imgFilledArc ($image, 175, 145, $start[$i], $end[$i], $lColors[$i], IMG_ARC_PIE); } # vykreslení header('Content-type: image/png'); imagePng($image); imageDestroy($image); ?> |
||
Seki Profil |
#3 · Zasláno: 14. 1. 2013, 19:58:46
[#2] posuk13To řešení rozhodně není, protože když změním
$data = array(140, 50, 35, 120); na tyto hodnoty, tak graf zase funguje špatně a ošetřením by akorát silně nabobtnali podmínky, což se mi moc nechce....
|
||
posuk13 Profil |
#4 · Zasláno: 15. 1. 2013, 01:30:02
Seki:
V tom, ze to nejde, spravne mas pravdu, ale osetrenie je uplne jednoduche a vobec nenabobtnali podmienky-staci zmenit if(!empty($last)) if(isset($last)) |
||
Časová prodleva: 4 měsíce
|
|||
Jansvabik Profil |
#5 · Zasláno: 11. 5. 2013, 22:41:02
Dobrý den,
zkoušel jsem zdrojový kód a místo hodnot jsem nastavil $_GET['hodnoty'], ale nefunguje mi to. Mrkněte se na to, prosím. Kód: <?php // kódování musí být v ISO 8859-2 # úprava funkce function imgFilledArc ($image, $sx, $sy, $start, $end, $color) { return imageFilledArc ($image, $sx, $sy, 250, 170, $start, $end, $color, IMG_ARC_PIE); } # vstupní data $data = array($_GET['hodnoty']); $values = array("Moľnost 1", "Moľnost 2", "Moľnost 3", "Moľnost4"); $question = "Otázka....?"; # procento $setina = array_sum($data) / 100; # tvorba obrázku $image = imageCreate(650, 300); # barvy $white = imageColorAllocate($image, 255, 255, 255); # nastaví se jako pozadí stránky $black = imageColorAllocate($image, 0, 0, 0); $silver = imageColorAllocate($image, 192, 192, 192); $lBlue = imageColorAllocate($image, 0, 94, 188); $dBlue = imageColorAllocate($image, 0, 4, 98); $lYellow = imageColorAllocate($image, 255, 251, 17); $dYellow = imageColorAllocate($image, 165, 161, 0); $lRed = imageColorAllocate($image, 255, 74, 38); $dRed = imageColorAllocate($image, 165, 0, 0); $lGreen = imageColorAllocate($image, 154, 235, 103); $dGreen = imageColorAllocate($image, 65, 145, 13); $nadpis = imageColorAllocate($image, 0, 68, 204); $lColors = array($lBlue, $lGreen, $lYellow, $lRed); $dColors = array($dBlue, $dGreen, $dYellow, $dRed); # počty $countOfData = sizeOf($data); $countOfColors = sizeOf($lColors); # výpočty úhlů $start = array(0); $end = array(); for ($i = 0; $i < $countOfData; $i++) { $start[] = $start[$i] + ($data[$i] / $setina) * 3.6; # poslední prvek je navíc $end[] = $start[$i+1]; } # 3D efekt for ($i = 0; $i <$countOfData; $i++) { if(($start[$i]<90)AND($end[$i]>90)) { $last=$i; $i==$countOfData+100; }else{ for ($ii = 160; $ii > 145; $ii--) { imgFilledArc ($image, 175, $ii, $start[$i], $end[$i], $dColors[$i], IMG_ARC_PIE); } } } if(isset($last)) { for ($i = $countOfData-1; $i>=$last; $i--) { for ($ii = 160; $ii > 145; $ii--) { imgFilledArc ($image, 175, $ii, $start[$i], $end[$i], $dColors[$i], IMG_ARC_PIE); } } } # samotný graf for ($i = 0; $i < $countOfData; $i++) { //imgFilledArc ($image, 185, 145+$i, $start[$i], $end[$i], $dColors[$i], IMG_ARC_PIE); imgFilledArc ($image, 175, 145, $start[$i], $end[$i], $lColors[$i], IMG_ARC_PIE); } # vykreslení header('Content-type: image/png'); imagePng($image); imageDestroy($image); ?> ...../index.php?hodnoty=25,25,25,25 to byla zkouška, která neuspěla. Jan Švábík |
||
Jansvabik Profil |
#6 · Zasláno: 12. 5. 2013, 09:10:52
Už není potřeba, našel jsem jiný způsob tvorby grafů v PHP.
|
||
Petr ZZZ Profil |
#7 · Zasláno: 12. 5. 2013, 16:03:47
Ach jo. Jaký?
|
||
Jansvabik Profil |
#8 · Zasláno: 13. 5. 2013, 13:42:12
JAKÝ?
Našel jsem si hotové PHP programy, které graf vytvoří, hledejte taky... JPGraph, PHPGraphs,... Já jsem svůj problém neřešil, ale "obešel". |
||
Časová prodleva: 11 let
|
0