php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.02.2007, 17:04  
Erfahrener Benutzer
 
Registriert seit: 05.04.2005
Beiträge: 1.333
Freeaak ist zur Zeit noch ein unbeschriebenes Blatt
Standard Funktionsgraph-Zeichner

Hallo!
Ich habe ein Problem mit diesem Script:
PHP-Code:
class Graph
{
    
// Die Funktion __construct wird beim initialisieren eines neuen Objektes von Typ Graph ausgeführt. Hier werden die Zustandsvariablen für die Klasse Graph initialisiert.
    /*
    $this->img ist das Bild, auf das die Funktionskurve gezeichnet wird
    $this->f ist der String, der die Funktion enthält
    $this->x ist die länge der x-achse zu jeder seite
    $this->y ist die länge der y-achse nach oben und unten
    $this->schritt-x/y die anzahl der pixel zwischen den Einheiten
    Dann mehrere Farben für die Darstellung
    */
    
public function __construct($funktion$x$y)
    {
      
$this->img imagecreatetruecolor(500,500);
      
$this->$funktion;
      
$this->$x;
      
$this->$y;
      
$this->schrittx 250/$this->x;
      
$this->schritty 250/$this->y;
      
$this->black imagecolorallocate($this->img,0,0,0);
      
$this->white imagecolorallocate($this->img,255,255,255);
      
$this->grey imagecolorallocate($this->img,230,230,230);
      
$this->red imagecolorallocate($this->img,255,0,0);
      if(
file_exists("log.txt")) unlink("log.txt");
      
$this->datei fopen("log.txt","w");
    }
    
    
// Diese Funktion rechnet strings aus, indem sie sie aufsplittet und rekursiv weiter berechnet
    
public function rechne($str)
    {
      
// fwrite($this->datei,"STR: ".$str."\n");
      /* berechnen von Klammern ohne buchstaben davor
      if(preg_match("~([^a-zA-Z]+)\(~",$str))
      {
        $str = preg_replace("~(\([^()]+\)|\(.*\(.*\).*\))~Uie","'$1'.\$this->rechne('$2')",$str);
      } */
      // Ersetzen von Konstanten E und PI durch die in PHP vorgegebenen Konstanten M_E und M_PI
      
$str str_replace("pi",(double)M_PI,$str);
      
$str str_replace("e",(double)M_E,$str);
      
// Nun werden Sinusfunktionen & CO berechnet. Durch einen regulären Ausdruck wird das innere der Klammern ausgefiltert und einzeln berechnet. Dann wird die spezielle Funktion (Sinus, Logarithmus, ...) auf den Wert angewandt.
      
$str preg_replace("~sin\((.+)\)~Uie","round(sin(\$this->rechne('$1')),10)",$str);
      
$str preg_replace("~cos\((.+)\)~Uie","round(cos(\$this->rechne('$1')),10)",$str);
      
$str preg_replace("~tan\((.+)\)~Uie","round(tan(\$this->rechne('$1')),10)",$str);
      
$str preg_replace("~ln\((.+)\)~Uie","round(log(\$this->rechne('$1')),10)",$str);
      
$str preg_replace("~sqrt\((.+)\)~Uie","(\$this->rechne('$1') >= 0) ? round(sqrt(\$this->rechne('$1')),10) : 0",$str);
      
// Suchen nach einem "+"-Zeichen und Aufteilen des Strings an den passenden Stellen. Fragmente weiter rekursiv berechnen
      
if(strstr($str,"+"))
      {
        
$plus explode("+",$str);
        for(
$i 0$i count($plus); $i++)
        {
          
$plus[$i] = $this->rechne($plus[$i]);
        }
        foreach(
$plus as $temp)
        {
          
$ergebnis += $temp;
        }
      }
      
// Das gleiche mit "-". Vor Minus darf kein anderes Rechenzeichen stehen, da es sonst kein operator ist.
      
elseif(strstr($str,"-") && $str[0] != "-" && preg_match("~[^\/\*\+\^\(\-]\-~",$str))
      {
        
$minus explode("-",$str);
        for(
$i 0$i count($minus); $i++)
        {
          
$minus[$i] = $this->rechne($minus[$i]);
        }
        
$ergebnis $minus[0];
        for(
$i 1$i count($minus); $i++)
        {
          
$ergebnis -= $minus[$i];
        }
      }
      
// das gleiche mit "*" (Mal)
      
elseif(strstr($str,"*"))
      {
        
$ergebnis 1;
        
$mal explode("*",$str);
        for(
$i 0$i count($mal); $i++)
        {
          
$mal[$i] = $this->rechne($mal[$i]);
        }
        foreach(
$mal as $temp)
        {
          
$ergebnis *= $temp;
        }
      }
      
// ... und geteilt durch
      
elseif(strstr($str,"/"))
      {
        
$geteilt explode("/",$str);
        for(
$i 0$i count($geteilt); $i++)
        {
          
$geteilt[$i] = $this->rechne($geteilt[$i]);
        }
        
$ergebnis $geteilt[0];
        for(
$i 1$i count($geteilt); $i++)
        {
          
$ergebnis = ($geteilt[$i] != 0) ? $ergebnis $geteilt[$i] : "0";
        }
      }
      
// als letztes "hoch"
      
elseif(strstr($str,"^"))
      {
        
$hoch explode("^",$str);
        return 
pow($hoch[0],$hoch[1]);
      }
      
// wenn kein Rechenzeichen vorhanden ist, wird die Zahl einfach zurückgeben
      
else
      {
        
$ergebnis $str;
      }
      return 
$ergebnis;
    }
    
    
// diese Funktion zeichnet das koordinatensystem
    
public function zeichneKoord()
    {
      
imagefill($this->img,0,0,$this->white);
      
      for(
$i = -$this->x$i <= 2*$this->x$i++)
      {
        
imageline($this->img,$i*$this->schrittx,0,$i*$this->schrittx,500,$this->grey);
        
imageline($this->img,$i*$this->schrittx,248,$i*$this->schrittx,252,$this->black);
      }
      for(
$i = -$this->y$i <= 2*$this->y$i++)
      {
        
imageline($this->img,0,$i*$this->schritty,500,$i*$this->schritty,$this->grey);
        
imageline($this->img,248,$i*$this->schritty,252,$i*$this->schritty,$this->black);
      }
      
      
imageline($this->img,0,250,500,250,$this->black);
      
imageline($this->img,250,0,250,500,$this->black);
    }
    
    public function 
zeichneGraph()
    
// Diese funktion ersetzt x in der funktion ($this->f) für jeden wert, der angezeigt werden soll.
    
{
      for(
$j = -250$j <= 250$j $j 0.1)
      {
        
imagesetpixel($this->img,250 $j/($this->x/$this->y), 250 $this->rechne(str_replace("x",$j/(250/$this->y),$this->f))*(250/$this->y),$this->red);
      }
    }

    public function 
rdyGraph()
    
// Hier wird alles ausgeführt.
    
{
      
$this->zeichneKoord();
      
$this->zeichneGraph();
      
imagegif($this->img);
    }

Es zeichnet Graphen aus mathematischen Funktionen. Vieles funktioniert bereits. Die Funktion "-x^2" wird beispielsweise falsch dargestellt... ich suche den Fehler schon länger, aber habe nun nur noch wenig zeit um das Script fertigzustellen. Deshalb frage ich hier ob vielleicht jemand, der ganz distanziert auf den Code schaut, den Fehler findet.

Gruß Freeaak
__________________
"Wenn du nicht weißt, was du tust: Machs mit Eleganz!"

(Murphy's Gesetze)
Freeaak ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 19.02.2007, 18:04  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

dann setz doch einfach bei -x^2 an. welche zweige werden durchlaufen? strstr ist auch eher unglücklich, wenn dann verwende wenigstens if (false !== strstr (...))
nikosch ist offline  
Alt 19.02.2007, 23:19  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 2.079
Der_Gerhard ist zur Zeit noch ein unbeschriebenes Blatt
Der_Gerhard eine Nachricht über ICQ schicken
Standard

Das da sieht zweifelhaft aus:
PHP-Code:
<?
      
// Das gleiche mit "-". Vor Minus darf kein anderes Rechenzeichen stehen, da es sonst kein operator ist.
      
elseif(strstr($str,"-") && $str[0] != "-" && preg_match("~[^\/\*\+\^\(\-]\-~",$str))
 
?>
Bei -x^2 scheiterst Du ja an der Regel, dass das erste Zeichen kein - sein darf. Und preg_match muss doch 0 liefern, damit Deine Bedingung aus dem Kommentar zutrifft.

Ich würde eher sowas hier versuchen:
PHP-Code:
<?
      
// Das gleiche mit "-". Vor Minus darf kein anderes Rechenzeichen stehen, da es sonst kein operator ist.
      
elseif(strstr($str,"-") && $str[0] == "-" && !preg_match("~[^\/\*\+\^\(\-]\-~",$str))
 
?>
Ein unäres Minus verarbeitest Du damit auch nicht korrekt.
__________________
**********************************
Nein, ich bin nicht die Signatur.
Ich putze hier nur.
**********************************
Der_Gerhard ist offline  
Alt 20.02.2007, 17:33  
Erfahrener Benutzer
 
Registriert seit: 05.04.2005
Beiträge: 1.333
Freeaak ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Der_Gerhard
Das da sieht zweifelhaft aus:
PHP-Code:
<?
      
// Das gleiche mit "-". Vor Minus darf kein anderes Rechenzeichen stehen, da es sonst kein operator ist.
      
elseif(strstr($str,"-") && $str[0] != "-" && preg_match("~[^\/\*\+\^\(\-]\-~",$str))
 
?>
Bei -x^2 scheiterst Du ja an der Regel, dass das erste Zeichen kein - sein darf. Und preg_match muss doch 0 liefern, damit Deine Bedingung aus dem Kommentar zutrifft.

Ich würde eher sowas hier versuchen:
PHP-Code:
<?
      
// Das gleiche mit "-". Vor Minus darf kein anderes Rechenzeichen stehen, da es sonst kein operator ist.
      
elseif(strstr($str,"-") && $str[0] == "-" && !preg_match("~[^\/\*\+\^\(\-]\-~",$str))
 
?>
Ein unäres Minus verarbeitest Du damit auch nicht korrekt.
jop danke, bin auch gerade drauf gekommen. das hatte ich auch mal so gehabt, nur hatte irgendwas geändert....
__________________
"Wenn du nicht weißt, was du tust: Machs mit Eleganz!"

(Murphy's Gesetze)
Freeaak ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sinuskurven zeichner, sinusfunktion zeichner, sinuskurve zeichner, funktionskurven zeichner, php preg_replace u i e, funktionsgraphzeichner, funktionsgraph php, preg match alle rechenzeichen, php funktionskurve, php funktionsgraph, funtionszeichner, funktionskurve zeichner, funktionsgraph zeichner, php imageline, graphen und geraden zeichner, funtions zeichner

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:45 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.