Geschrieben von phattek am 01.04.2005, 17:06

Mit diesem Script kann man sich Funktionsbilder Ausgeben lassen. Folgende Parameter muessen
uebergeben wereden: width (Breite), height (Hoehe), bereich_w oder bereich_h (Anzegebereich
horizontal (x-Werte) bzw. vertikal (y-Werte)) und f (Funktion). Die Anzeigebereiche
koenen leicht verfaescht sein, um die Funktionen genauer darstellen zu koennen.
Die Funktion koente z.B. so aussehen: f=3*sin(x-5). Die Funktion kann gueltige PHP-Befehle,
wie z.B. sin(), tan(), ... und die Variable x enthalten.

Hier das Script mit Kommentaren.

<?php
# Hier werden alle Bestandteile der möglichen Terme zur Definition der Funktion angegeben
$regex_array = array(
'[0-9]',
'\.',
',',
'\+',
'\*',
'-',
'\/',
'\(',
'\)',
'x',
'acos\(',
'asin\(',
'atan\(',
'exp\(',
'log\(',
'log10\(',
'max\(',
'min\(',
'pi\(',
'pow\(',
'rad2deg\(',
'deg2rad\(',
'sqrt\(',
'sin\(',
'cos\(',
'tan\(',
'abs\(',
);
# ... und schließlich zu einem regulären Ausdruck zusammengefügt
$regex_term = '/\A('.join('|',$regex_array).')+\Z/';

$f = urldecode(stripslashes($f)); # Die als Get-Parameter uebergebene Funktionsgleichung wird von escapten Zeichen "befreit".
# Wenn Parameter Fehlen wird ein Bild mit Fehlermeldung erzeugt
function fehler($f) {
$image = imagecreate("310","50"); # Das Bild wird erstellt 310*50 Pixel
$farbe_body = imagecolorallocate($image,240,240,240); # Es eine Farbe "erstellt"
$achsen = imagecolorallocate($image,0,0,0); # Es eine Farbe "erstellt" (fuer die Beschriftung)
imagestring($image,5,15,17,$f,$achsen); # Die Fehlermeldung wird auf das Bild geschrieben
header("Content-Type: image/gif"); # Es wird ein Header gesendet, der angibt das ein Bild folgt
imagegif($image); # Das Bild mit der Fehlermeldung wird ausgegeben
exit(); # Das Script wird nach Ausgabe der Fehlermeldung beendet
}

# Funktion zum berechen DER Funktion
function rechne($x) {
global $funktion2; # Die Variable $funktion2 wird auch in der Funktion rechne() gueltig gemacht.
@eval("\$wert = ".$funktion2.";"); # Es wird versucht der Variable $wert den Wert von $funktion2 zuzuweisen. Hier werden auch Rechenbefehle und Funktionen wie sin() ausgefuehrt.
return $wert; # Der berechnete Wert wird zurückgegeben
}

# Hier werden die benoetigten Parameter ueberprueft. Wenn ein Parameter fehlt wird die Funktion fehler() aufgerufen.
if (intval($width) == 0) fehler("Der Parameter 'width' fehlt!");
if (intval($height) == 0) fehler("Der Parameter 'height' fehlt!");
if (intval($bereich_h) == 0 && intval($bereich_w) == 0) fehler("Der Parameter 'bereich_?' fehlt!");
if (trim($f) == "") fehler("Der Parameter 'f' fehlt!");
if (!preg_match($regex_term,$f)) fehler("Der Parameter 'f' ist ungültig!"); # Falls die Funktion nicht dem regulären Muster entspricht

# Hier wird der Faktor berechnet, der nötig ist um alles im gewünschten Anzeigebereich auszugeben
# Wenn der Faktor z.B. 10 ist bedeutet das, dass 10 Pixel ein Schritt auf der x- bzw. y-Achse ist.
if (intval($bereich_h) != 0) {
$factor=floor(($height-42)/$bereich_h);
}
else {
$factor=floor(($width-40)/$bereich_w);
}

# Allgemeine Operationen
$funktion2 = str_replace('x','$x',stripslashes($f)); # In der Funktionsgleichung wird das x durch $x ersetzt, damit in der funktion rechne mit der Variable $x gerechnet wird.
$image = imagecreate($width,$height); # Das Bild wird mit der gewünschten Hoehe und Breite erzeugt.
$farbe_body=imagecolorallocate($image,240,240,240); # Es eine Farbe "erstellt" (Hintergrund)
$farbe_b = imagecolorallocate($image,255,0,0); # Es eine Farbe "erstellt" (hab ich vergessen)
$achsen = imagecolorallocate($image,0,0,0); # Es eine Farbe "erstellt" (Achsen)
$gitter = imagecolorallocate($image,180,180,180); # Es eine Farbe "erstellt" (Gitter)
$rahmen=20; # Legt die Rahmenbreite fest (darf nicht veraendert werden)

# Gitter x -> Hier werden die vertikalen Gitterlinien eingetragen.
# Dazu wird eine For-Schleife benutzt.
for($x = $width/2-floor(($width/2-$rahmen)/$factor)*$factor; $x <= $width-$rahmen; $x){
imageline($image,$x,$rahmen,$x,$height-$rahmen,$gitter); # Hier wird jeweils eine Gitterlinie eingetragen.
$x = $x + $factor; # Die naechste Linie wird um $factor Pixel weiter rechts eingetragen.
}

# Gitter x -> Hier werden die horizontalen Gitterlinien und die Beschriftung der y-Achse mit Werten eingetragen.
# Dazu wird wieder eine For-Schleife benutzt.
for($y = $height/2-floor(($height/2-$rahmen)/$factor)*$factor; $y <= $height-$rahmen; $y){
imageline($image,$rahmen,$y,$width-$rahmen,$y,$gitter); # Hier wird jeweils eine Gitterlinie eingetragen.
# beschriftung mit Zahlen, je nachdem ob die Zahl einstellig oder mind. zweistellig ist wird sie weiter rechts eingetragen.
if (-($y/$factor-$height/2/$factor) < 0) imagestring($image,1,7,$y-3,round(-($y/$factor-$height/2/$factor)),$achsen);
else imagestring($image,1,11,$y-3,round(-($y/$factor-$height/2/$factor)),$achsen);
$y = $y + $factor; # die naechste Linie wird um $factor Pixel weiter nach unten eingetragen.
}

# Achsen (x & y) -> Hier wird die x- und die y-Achse mit Pfeil eingetragen.
imageline($image,$rahmen,$height/2,$width-$rahmen,$height/2,$achsen); # x-Achse
imageline($image,$width/2,$rahmen,$width/2,$height-$rahmen,$achsen); # y-Achse
imagefilledpolygon($image,array($width/2,$rahmen,$width/2+4,$rahmen+9,$width/2-4,$rahmen+9),3,$achsen); # Pfeil an der y-Achse
imagefilledpolygon($image,array($width-$rahmen,$height/2,$width-$rahmen-9,$height/2+4,$width-$rahmen-9,$height/2-4),3,$achsen); # Pfeil an der x-Achse

# Hier wird das Funktionsbild eintragen
# Dazu wird wieder eine For-Schleife benutzt.
for($x = -$width/2/$factor+$rahmen/$factor; $x <= $width/2/$factor-$rahmen/$factor; $x){
$x1 = $x*$factor; # Es wird ein erster x-Wert ermittelt
$y1 = ((rechne($x))*$factor); # Es wird ein erster y-Wert ermittelt. Dabei wird der y-Wert mit dem gegebenen x-Wert durch die Funktion rechne ausgerechnet. Dadurch koennen auch Funktionen wie sin() genutzt werden.

$x = $x + (1/$factor); # Wir gehen auf der x-Achse einen Pixel weiter nach rechts.

$x2 = $x*$factor; # Es wird ein zweiter x-Wert ermittelt
$y2 = ((rechne($x))*$factor); # Es wird ein wie oben ein zweiter y-Wert ermittelt.

imageline($image, $x1+($width/2), -($y1-($height/2)),$x2+($width/2), -($y2-($height/2)), $farbe_b); # jetzt wird zwischen den beiden Punkten (x1;y1) und (x2;y2) eine Linie gezogen.
}

# Funktionsbild oben und unten 'uebermalen'
imagefilledrectangle($image,0,0,$width,$rahmen,$farbe_body); # Wenn das Funktionsbild oben uebersteht wird es uebermalt.
imagefilledrectangle($image,0,$height-$rahmen,$width,$height,$farbe_body); # Wenn das Funktionsbild unten uebersteht wird es uebermalt.

# Dieverse Beschriftungen ('x' & 'y'), etc.
imagestring($image,5,$width/2-4,2,"y",$achsen); # An die y-Achse wird das 'y' geschrieben
imagestring($image,5,$width-15,$height/2-9,"x",$achsen); # An die x-Achse wird das 'x' geschrieben
imagestring($image,1,$width-79,$height-7,"(c) Phattek 2005",$achsen); # In die Ecke unten rechts wird '(c) Phattek 2005' geschrieben.

# Hier wird die x-Achse mit Werten beschriftet.
for($x = $width/2-floor(($width/2-$rahmen)/$factor)*$factor; $x <= $width-$rahmen; $x){
# Je, nachdem ob die Zahl einstellig oder mind. zweistellig ist weiter rechts.
if ($x/$factor-$width/2/$factor < 0) imagestring($image,1,$x-5,$height-17,round($x/$factor-$width/2/$factor),$achsen);
else imagestring($image,1,$x-2,$height-17,round($x/$factor-$width/2/$factor),$achsen);
$x = $x + $factor; # Die naechste Beschriftung um $factor Pixel weiter rechts.
}

# Tietel einfuegen
imagestring($image,2,5,2,"f(x)=y=$f",$achsen); # Oben links wird die Funktionsgleichung hingeschrieben (f(x)=y=...).

# Bild als Gif ausgeben
header("Content-Type: image/gif"); # Es wird ein Header gesendet, der angibt das ein Bild folgt
imagegif($image); # Das Bild wird als Gif ausgegeben.
?>

Z.B. mit diesem Formular koennte man das Script im <img>-Tag aufrufen.
<html>
</head>
<title>Funktionsbilder</title>
</head>
<body bgcolor="#cccccc" text="#000000">
<center>
<h1>Funktionsbilder</h1>
<form action="<?php echo $PHP_SELF;?>" method="get">
<pre>
Breite: <input type="text" name="width" value="<?php echo $width;?>">
Bereich*: <input type="text" name="bereich_w" value="<?php echo $bereich_w;?>">
Höhe: <input type="text" name="height" value="<?php echo $height;?>">
Bereich*: <input type="text" name="bereich_h" value="<?php echo $bereich_h;?>">
Funktionsgleichung: <input type="text" name="f" value="<?php echo $f;?>">

<input type="submit" name="zeigen" value="anzeigen">

* nur eins ausfüllen
</pre>
</form>
<?php
if (isset($zeigen)) {
$f = str_replace("+",urlencode("+"),$f);
$f = urlencode($f);
echo "<img src=\"funktionsbilder.php?width=$width&height=$height&bereich_w=$bereich_w&bereich_h=$bereich_h&f=$f\">";
}
?>
</center>
</body>
</html>

Bewertung Anzahl
6
60,0 %
3 Bewertungen
4
20,0 %
1 Bewertungen
1
20,0 %
1 Bewertungen