buker
6.12.2011, 23:35:46
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
<?php
require('/var/www/https/config.php');
$x = 288; // szerokoć grafiki
$y = 100; // wysokoć grafiki
header("Content-type: image/png"); $im = imagecreate($x, $y);
imagecolorallocate($im, 255, 255, 255);
$czarny = imagecolorallocate($im, 0, 0, 0);
$czerwony = imagecolorallocate($im, 255, 0, 0);
imagerectangle($im, 0, 0, $x-1, $y-1, $czarny);
$n=0;
$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"); for($i=0; $i<mysql_num_rows($sql);$i++)
{
$j=$i*10;
$wartosci[] = "".$n++.",".$row[cpu]."";
}
$popx = $akt[0];
$popy = $akt[1];
for ($i=1;$i<count($wartosci);$i++)
{
$akt = explode(",", $wartosci[$i]); $punkt1 = $akt[0];
$punkt2 = $y-$akt[1];
$linia = imageline($im,$popx,$y-$popy,$akt[0],$y-$akt[1],$czarny);
$popx = $akt[0]; $popy = $akt[1];
}
$czerwony = imagecolorallocate($im, 255, 0, 0);
imagestring($im, 3, 5, 5, "Wykres", $czerwony);
imagepng($im);
?>
Chciał bym żeby linia była bardziej widoczna. Może chodzi o skalowanie. Proszę o pomoc.
Uriziel01
7.12.2011, 07:43:27
1)Zmień kod:
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:
$wartosci_size = count($wartosci); for ($i=1;$i< $wartosci_size;$i++)
2)Przenieś linię:
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:
imageantialias($im, true);
Daję ona naprawde ładnie wyglądające, gładkie linie.
koszalek1993
8.06.2013, 20:03:44
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>
Uriziel01
10.06.2013, 10:07:23
Nie wyobrażasz Sobie mojego szoku gdy zobaczyłem informacje o odpowiedzi w temacie.
p.s-przepraszam za offtopic Robercie.