Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Rysowanie wykresu liniowego, Wielkosc wykresu
buker
post 6.12.2011, 23:35:46
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 8.01.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Witam napisałem skrypt rysujący wykres na podstawie danych z bazy danych. Chciał bym zmienić wielkość wykresu bo to co mi sie udało zrobić w żaden sposób mnie nie zadowala. Prolemem jest to że nie wiem jak to zrobic.

Kod PHP
  1. <?php
  2. require('/var/www/https/config.php');
  3. $x = 288; // szerokoć grafiki
  4. $y = 100; // wysokoć grafiki
  5.  
  6. header("Content-type: image/png");
  7. $im = imagecreate($x, $y);
  8. imagecolorallocate($im, 255, 255, 255);
  9. $czarny = imagecolorallocate($im, 0, 0, 0);
  10. $czerwony = imagecolorallocate($im, 255, 0, 0);
  11. imagerectangle($im, 0, 0, $x-1, $y-1, $czarny);
  12. $n=0;
  13. $sql = mysql_query("SELECT cpu FROM `sys_info` WHERE data > '2011-12-06 00:00:00' AND data <= '2011-12-06 23:59:59' ORDER BY data ASC");
  14. for($i=0; $i<mysql_num_rows($sql);$i++)
  15. {
  16. $j=$i*10;
  17. $row = mysql_fetch_array($sql);
  18. $wartosci[] = "".$n++.",".$row[cpu]."";
  19. }
  20.  
  21. $akt = explode(",", $wartosci[0]);
  22. $popx = $akt[0];
  23. $popy = $akt[1];
  24.  
  25. for ($i=1;$i<count($wartosci);$i++)
  26. {
  27. $akt = explode(",", $wartosci[$i]);
  28. $punkt1 = $akt[0];
  29. $punkt2 = $y-$akt[1];
  30. $linia = imageline($im,$popx,$y-$popy,$akt[0],$y-$akt[1],$czarny);
  31. $popx = $akt[0]; $popy = $akt[1];
  32. }
  33.  
  34. $czerwony = imagecolorallocate($im, 255, 0, 0);
  35. imagestring($im, 3, 5, 5, "Wykres", $czerwony);
  36.  
  37. imagepng($im);
  38. ?>

Chciał bym żeby linia była bardziej widoczna. Może chodzi o skalowanie. Proszę o pomoc.
Go to the top of the page
+Quote Post
Uriziel01
post 7.12.2011, 07:43:27
Post #2





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


1)Zmień kod:
  1. for ($i=1;$i<count($wartosci);$i++)

Bo dla kazdej iteracji tej pętli liczysz wielkośc tablicy. A po liczyć coś 5 tysięcy razy skoro można tylko raz:
  1. $wartosci_size = count($wartosci);
  2. for ($i=1;$i< $wartosci_size;$i++)

2)Przenieś linię:
  1. imagerectangle($im, 0, 0, $x-1, $y-1, $czarny);

Na koniec kodu (zaraz przed generowanie obrazka), GD nie obsługuje z-indexowania dlatego wszystko jesr swrysowywane wg kolejności.
3)Jedyny sposób na zwiększenie wysokości wykresu to znalezienie najwyższej jakości w całym zbiorze a potem opisywanie całej reszty wartości jakos % tej najwyższej.
4)Jeżeli nie chodzi o wysokość wykresu a o widocznośc samej linii, rysuj linie podwójnie, przesunięte o 1px lub (jeżeli nie masz zamiaru tam korzystać z pół przezroczystości) skorzystaj z funkcji:
  1. imageantialias($im, true);

Daję ona naprawde ładnie wyglądające, gładkie linie.

Ten post edytował Uriziel01 7.12.2011, 07:44:08
Go to the top of the page
+Quote Post
koszalek1993
post 8.06.2013, 20:03:44
Post #3





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 8.06.2013

Ostrzeżenie: (0%)
-----


Witajcie jestem nowy więc można mnie w razie czego poprawiać.
Mam skrypt, który ma rysować wykres wielomianu 3-stopnia. Wszystko fajnie, ale gdy już narysuje mi się wykres na jakimś przedziale, to rysuje się także jakaś linia z kosmosu. Nie wiem jak na to zaradzić. Proszę o pomoc

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Bez nazwy</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Language" content="pl">
<meta name="Generator" content="JTHTML 7.6.2">
</head>
<body>
<form method="post">
<table>
<tr>
<td>A: <input type=text name=A /></td>
<td>B: <input type=text name=B /></td>
<td>C: <input type=text name=C /></td>
<td>D: <input type=text name=D /></td>
</tr>
<tr>
<td>zakres X</td><td>od<input type=text name=od /></td>
<td>do<input type=text name=do /></td>
</tr>
<tr><td><input type=submit name="B1" value="Wyślij"></td></tr>
</table>
</form>
<?php


$wykres=imagecreatetruecolor(800, 600);
$czerwony=imagecolorallocate($wykres, 255, 0, 0);
$czarny=imagecolorallocate($wykres, 0, 0, 0);
$bialy=imagecolorallocate($wykres, 255, 255, 255);
imagefill($wykres, 0, 0, $bialy);





imageline($wykres, 0, 300, 800, 300, $czarny); // rysowanie osi x
imageline($wykres, 400, 0, 400, 600, $czarny); //rysowanie osi y
imagefilledpolygon($wykres, Array(800, 300, 793, 293, 793, 307), 3, $czarny); //rysowanie strzałki na osi x
imagefilledpolygon($wykres, Array(400, 0, 393, 7, 407, 7), 3, $czarny); // analogicznie jak wyżej y





if($_POST['B1'])
{

$A=$_POST['A'];
$B=$_POST['B'];
$C=$_POST['C'];
$D=$_POST['D'];
$od=$_POST['od'];
$do=$_POST['do'];






for($x=$od,$v=$y,$z=$x; $x < $do; $x+=0.1)
{
$y=($A*($x*$x*$x))+($B*($x*$x))+($C*$x)+$D;
echo $y."<br />";
imageLine($wykres, ($z)*30+400,($v)*30+300,($x)*30+400,($y)*30+300, $czerwony);
$z = $x;
$v = $y;
}
}

imagejpeg($wykres,"wykres.jpg");
imagedestroy($wykres);
?>
<img src="wykres.jpg" />


</body>
</html>
Go to the top of the page
+Quote Post
Uriziel01
post 10.06.2013, 10:07:23
Post #4





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


Nie wyobrażasz Sobie mojego szoku gdy zobaczyłem informacje o odpowiedzi w temacie.

p.s-przepraszam za offtopic Robercie.



Ten post edytował Uriziel01 10.06.2013, 10:09:32
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2025 - 08:49