| 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: 12 let
|
|||
0