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
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
[#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
Seki:
V tom, ze to nejde, spravne mas pravdu, ale osetrenie je uplne jednoduche a vobec nenabobtnali podmienky-staci zmenit
if(!empty($last))
za
if(isset($last))
a funguje to tak ako ma.
Jansvabik
Profil
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
Už není potřeba, našel jsem jiný způsob tvorby grafů v PHP.
Petr ZZZ
Profil
Ach jo. Jaký?
Jansvabik
Profil
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".

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: