Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP GD Rysowanie wykresu
Forum PHP.pl > Forum > PHP
codesign
Witam, potrzebuje abyście pomogli napisać mi skrypt php rysujący wykres taki jak tu:

Mam już kod:
Kod
<?php
    require_once('class.hlsocket.php');
    //Pobieranie danych o serwerze
    $hlsocket = new HLSocket('80.72.37.178', 27015);
header("Content-type: image/png");



$im = imagecreate (400, 200);


$black = imagecolorallocate($im, 0, 0, 0);
$w   = ImageColorAllocate ($im, 255, 255, 255);
$red = ImageColorAllocate ($im, 255, 0, 0);
$blue = ImageColorAllocate ($im, 0, 0, 255);
$green = ImageColorAllocate ($im, 0, 255, 0);

imagefilledrectangle ($im, 0, 0, 400, 200, $black);

$buf = "Proste wykresy funkcji";
imagestring ($im, 5, 1, 1, $buf, $w);




$oldy = 100;

for ($i = 0; $i < 100; $i++) {

  imageline($im, $i*$szerokosc, $dane["players"], ($i+1)*$szerokosc, $dane["players"], $red);
  $y = 100;
  $oldy = $y;
}
//$szerokosc - rozpietosc wykresu, $szerokosc*100 - szerokość pola wykresu
//$tablica musi zawierać 100 elementów (albo trzeba dać warunek sprawdzający isset)

imagepng($im);
imagedestroy($im);;
?>

Działa tylko muszę go dobrze przekształcić. Chcę aby zapisywał co 10 minut na wykresie liczbę obecnych osób.
Z gówy dziękuje za pomoc.
thek
W takim wypadku musisz modyfikowac tablicę danych, a nie skrypt rysujacy wykres smile.gif Do zapoznania się z manualem php jesli chodzi o dział ARRAY (bo to tablica wchodzi z danymi jeśli dobrze widzę). Zwłaszcza array_pop i array_unshift.
codesign
W manualu jest napisane:
Przykład #1 Przykład użycia array_pop()
CODE
<?php
$stos = array("pomarańcza", "banan", "jabłko", "malina");
$owoc = array_pop($stos);
print_r($stos);
?>

Po wykonaniu powyższego kodu $stos będzie miał tylko trzy elementy:
CODE
Array
(
[0] => pomarańcza
[1] => banan
[2] => jabłko
)

Mogę to napisać w ten sposób, że zamiast owocow dam np: 1,2,3,4,5,6... i gdy będzie np 1 to na wykresie będzie wyznaczało 1 osobę na serwerze?
thek
Ale zobacz, że jako parametr ten skrypt chce tablicę 100-elementową, zapewne z ilością userów o określonej godzinie i to do niej masz wpisywać te dane, a nie modyfikować sam skrypt. Stąd właśnie podane przeze mnie funkcje by wyrzucić ostatni i dodać coś jako pierwszy.
To co Ci dodatkowo potrzebne to określenie wielkości obrazka, bo on posłuży potem do skalowania osi. Jak? Masz tablice z ilością przykładowo: 10 o 8 , 43 o 9, 14 o 10, 32 o 11 ,51 o 12, a obraz ma być 250px na 150px. Odejmij więc na legendę i osie po 30px z lewej i 20px z dołu oraz po 10px od reszty boków.
Masz obszar roboczy 210px na 120px i wartość maksymalną 51 userów. Zaokrąglam to do pewnej wartości w górę, czyli przykładowo 55 lub 60 i wysokość dzielę przez nią. W efekcie mam 120/60=2. Czyli 1 user = 2px na osi Y wyżej. Teraz patrzę ile mam wyników - 5. Coś mało, znaczy skrypt ruszył niedawno. Zależnie od rozpiętości mogę chcieć 10, 20 albo i 100 ostatnich. Muszę więc uzupełnić tę tablicę by mi pasowało do skryptu. Ja wezmę 10, więc brakujące uzupełnię 0.
Zależnie od formy zapisu (albo nowy na końcu albo nowy układany jako pierwszy) muszę te dodatkowe ustawić w odpowiednim miejscu. Ja zrobię tak, że najbardziej po prawej wykresu jest najbardziej aktualny i w tablicy jest on zawsze jako pierwszy na szczycie.. Dlatego puste wrzucę na koniec i otrzymam: (51, 32, 14, 43, 10, 0, 0, 0, 0, 0).

Czas na szerokość 210px/(ilość_elementów - 1 czyli 9) = 24.33333px na każdą godzinę. Teraz pozostaje tylko zrobić osie i w określonych wyliczonych punktach rysować linie funkcją imageline pamiętając, że współrzędne obrazu liczone są od GÓRNEGO LEWEGO rogu obrazu. Stąd właśnie użyłem takiej konstrukcji. Zacznę idąc w górę tablicy rysować od ostatniego elementu według wzoru:
X = zaokrąglenie( 30px marginesu lewego + (elementów - 1 - indeks_elementu ) *24.3333px)
Y = zaokrąglenie( 10px margines górny + 120px wykresu - ilość userów * 2px )

Skąd ta różnica 1 dla ilości elementów osi X którą raz dodaję a raz odejmuję? To tzw. problem płotków/sztachet znany z wielu języków gdzie są tablice smile.gif Jeśli coś mam dzielone na X obszarów, to mam tak naprawdę X+1 granic. A że tu mam już z góry X punktów to mam dzielenie przez X-1 obszarów. Stąd dzielę przez 9 a nie ilość elementów, czyli 10.

Rysowanie osi i legend zostawiam już Tobie bo całą matematykę już za Ciebie odwaliłem smile.gif Jeśli jesteś inteligentny to sobie już teraz poradzisz sam z manualem GD2 przed oczami. Dane o ilości userów pobierać możesz chyba z jakiegoś pliku lub bazy.

EDIT: Tak naprawdę nie musisz liczyć za każdym razem obu punktów. Jako że to wykres liniowy, to "nowy punkt" jedynie liczysz. Drugi to "nowy punkt" z poprzedniego przebiegu pętli rysującej wykres. Wygląda to mnie więcej tak, że przed pętlą liczysz współrzędne pierwszego punktu, a w pętli liczysz współrzędne drugiego punktu, rysujesz linię łączącą i nadpisujesz wartości stare nowymi na zasadzie:
  1. $xs = obliczanie X dla pierwszego elementu tablicy;
  2. $ys = obliczanie Y dla pierwszego elementu tablicy;
  3. for($i=1; $i<rozmiar_tablicy; $i++) {
  4. $xk = obliczanie X dla nowego elementu tablicy;
  5. $yk = obliczanie Y dla nowego elementu tablicy;
  6. //rysowanie linii;
  7. $xs = $xk;
  8. $ys = $yk;
  9. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.