Toon posts:

[PHP] GD Grafiekscherm Bug

Pagina: 1
Acties:
  • 38 views sinds 30-01-2008

Verwijderd

Topicstarter
Hallo,

Ik ben als onderdeel van een rekenmachine een grafisch plaatje aan het maken in GD dat de lijn van een formule tekent.

Zie: http://213.84.125.206/ashramjp/pws/grafiek/grafiek.php

Het werkt al aardig, er is alleen 1 probleem:

Het lijkt wel alsof de lijn verkeerd om getekent wordt ofzo, de formule is namelijk: 2X

Dat zou natuurlijk een stijgende lijn moeten zijn, en niet een dalende zoals in het plaatje. Kan iemand mij vertellen waar de fout zit?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
 
<?php 
   header("Content-type: image/png");   // We maken een GIF/PNG image... 

function evalsum($sum) 
{ 
// Sum may only contain the following characters: 
$check = strtr($sum, "0123456789+-*/()", "                "); 

if(trim($check) == "" ) 
{ 
  $to_eval="\$evalled=" . $sum . ";"; 
  eval($to_eval); 
} 

else 
{ 
  $evalled = "Evaluation error"; 
} 

return $evalled; 
} 

   
   /* Start Variables */ 
   $pFont = "/var/www/html/ashramjp/pws/grafiek/ariblk.ttf"; 
   $formule[0] = "2*X - 2"; 
   $formule[1] = "5"; 
     
   $xMin = -10; 
   $xMax = 10; 
   $yMin = -10; 
   $yMax = 10; 
   $xStap = 2; 
    
   $pLengteX = 500; // Lengte van het plaatje op de X as 
   $pLengteY = 500; // Lengte van het plaatje op de Y as 
     
   /* De grafiek bouwen */ 
    
   // Maakt het plaatje 
   $grafiek = ImageCreate($pLengteX, $pLengteY); 

   // De eerste ImageColorAllocate is automatisch de achtergrondkleur 
   $kAchtergrond1 = ImageColorAllocate($grafiek, 255, 255, 255); 
   $kAchtergrond2 = ImageColorAllocate($grafiek, 255, 255, 153); 
   $kAchtergrond3 = ImageColorAllocate($grafiek, 255, 255, 201); 

   // Grafiek achtergrond 
   ImageFilledRectangle($grafiek, 0, 0, $pLengteX, $pLengteY, $kAchtergrond2); 
    
   // Lichtere achtergrond 
   ImageFilledRectangle($grafiek, 0 + 3, 0, $pLengteX, $pLengteY - 3, $kAchtergrond3); 
   
   /* Kleuren */ 
   $kOranjeDonker   = ImageColorAllocate($grafiek, 195, 133, 24); 
   $kOranje           = ImageColorAllocate($grafiek, 226, 182, 36); 
   $kZwart          = ImageColorAllocate($grafiek, 0, 0, 0); 
      
   /* Tekenen */ 
        if($xMin < 0 AND $xMax < 0) $gBreedte = ($xMin * -1) + ($xMax * -1); 
        if($xMin < 0 AND $xMax > 0) $gBreedte = ($xMin * -1) + $xMax; 
        if($xMin > 0 AND $xMax > 0) $gBreedte = $xMin + $xMax; 
        if($yMin < 0 AND $yMax < 0) $gHoogte = ($yMin * -1) + ($yMax * -1); 
        if($yMin < 0 AND $yMax > 0) $gHoogte = ($yMin * -1) + $yMax; 
        if($yMin > 0 AND $yMax > 0) $gHoogte = $yMin + $yMax; 
         
   /* Middenlijn Horizontaal */ 
   if($xMin > 0 AND $xMax > 0 OR $xMin < 0 AND $xMax < 0) 
   { 
       // Geen horizontale middenlijn 
   } 
   else 
   { 
           $mHplaats = ($xMin * -1) / $gBreedte * $pLengteX; 
   } 

   /* Middenlijn Verticaal */ 
   if($yMin > 0 AND $yMax > 0 OR $yMin < 0 AND $yMax < 0) 
   { 
       // Geen verticale middenlijn 
   } 
   else 
   { 
           $mVplaats = ($yMin * -1) / $gHoogte * $pLengteY; 
   }   

    
   /* Grafieklijnen */ 
   for($i = 0; $i < count($formule); $i++) 
   { 
        $oudPosY = 0; 
         
           for($posX = $xMin; $posX <= $pLengteX; $posX = $posX + $xStap)           
           {               
               // Vult de nieuwe X in 
               $formTemp = $formule[$i]; 
               $posY = round(evalsum(str_replace("X", $posX, $formTemp)),0); 

               $posX2 = ($posX / $gBreedte) * $pLengteX;                
               $posY2 = ($posY / $gHoogte) * $pLengteY; 
                
               if($posY2 > 0) $posY3 = $mHplaats - $posY2; 
               if($posY2 < 0) $posY3 = $mHplaats + ($posY2 * -1); 
               if($posY2 == 0) $posY3 = $mHplaats; 

               if($posX2 > 0) $posX3 = $mVplaats - $posX2; 
               if($posX2 < 0) $posX3 = $mVplaats + ($posX2 * -1); 
               if($posX2 == 0) $posX3 = $mVplaats; 
                               
               // Zet een streep 
               if($oudPosY) 
               { 
                   ImageLine($grafiek, $oudPosX, $oudPosY, $posX3, $posY3, $kZwart);     
                   ImageTTFText($grafiek, 6, 0, $oudPosX, $oudPosY, $kZwart, "$pFont", "$posX3:$posY3");    
                } 
                          
               $oudPosX = $posX3;                
               $oudPosY = $posY3; 
           } 
   } 
    
      
   // Middenlijnen        
   ImageLine($grafiek, $mHplaats, 0, $mHplaats, $pLengteY, $kOranje);     
     ImageLine($grafiek, 0, $mVplaats, $pLengteX, $mVplaats, $kOranje);     
      
   ImagePNG($grafiek);     // Sla het op als PNG 
   ImageDestroy($grafiek); // Verwijder de resten   
?> 


Alvast bedankt!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:57

gorgi_19

Kruimeltjes zijn weer op :9

Als eerste welkom op GoT :)

Om te beginnen een kleine quote uit de handleiding op www.php.net
imageline() draws a line from x1, y1 to x2, y2 (top left is 0, 0) in image image of color color.
Oftewel: gerelateerd aan de linkerbovenhoek. Het punt (0, 100) ligt dus lager dan (0,0)
Zie ook: http://nl.php.net/function.ImageLine

Verder is dit een debug topic; kijk welke waarden je waar hebt en op welke regel het fout gaat. Hierdoor kan je het probleem isoleren en kijken waar het precies fout gaat.
Daar hebben we geen 130 regels code voor nodig; dit schrikt alleen maar af om op een post te gaan reageren. :)

Veel plezier nog op GoT :)

[ Voor 27% gewijzigd door gorgi_19 op 21-05-2004 11:07 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Dit topic is gesloten.