By this class you can render your math formula:
CODE
<?php
class formel {
var $functionNames = array("WURZEL","sin","cos","pow","ARCSIN");
var $ttf;
var $ttfFile;
function formel() {
// {{{
$this->ttf = false;
$this->ttfSize = 15;
// }}}
}
function useTTF($ttfFile) {
// {{{
$this->ttf = true;
$this->ttfFile = $ttfFile;
// }}}
}
function parse($f) {
// {{{
$f = str_replace(" ","",$f);
$i = 0;
while($i<strlen($f)) {
do {
$c = substr($f,$i,1);
if($c==" ") $i++;
} while($c==" ");
//echo $c."<br>";
$functionName = "";
for($j=0;$j<count($this->functionNames);$j++) {
if(strtoupper(substr($f,$i,strlen($this->functionNames[$j]))) == strtoupper($this->functionNames[$j])) {
$i += strlen($this->functionNames[$j]);
$c = substr($f,$i,1);
$functionName = strtoupper($this->functionNames[$j]);
//echo $c."<br>";
//exit;
}
}
if($c=="+") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"+", "value"=>"+");
$nr="";
} else if($c=="-") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"-", "value"=>"-");
$nr="";
} else if($c=="=") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"=", "value"=>"=");
$nr="";
} else if($c=="*") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"*", "value"=>"*");
$nr="";
} else if($c=="/") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"/", "value"=>"/");
$nr="";
} else if($c=="^") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"^", "value"=>"^");
$nr="";
} else if($c=="(") {
$klammer = 1;
$f2 = "";
while($i<strlen($f)) {
$i++;
$c = substr($f,$i,1);
if($c=="(") $klammer++;
if($c==")") {
$klammer--;
if($klammer==0) {
//echo "<b>".$f2."</b><br>";
$D = array("type"=>"klammer");
if($functionName!="") $D["function"] = $functionName;
$D["value"] = $this->parse($f2);
$Z[] = $D;
break;
} else $f2 .= $c;
} else {
$f2 .= $c;
}
}
} else {
$nr .= $c;
}
$i++;
}
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
return($Z);
// }}}
}
function parse2($Z, $reparse=true) {
// {{{
$Z2 = array();
for($i=0;$i<count($Z);$i++) {
// {{{
$wert = $Z[$i];
if($wert["type"]=="-" || $wert["type"]=="+" || $wert["type"]=="=") {
$vorzeichen = $wert["type"];
$i++;
$wert = $Z[$i];
if($vorzeichen=="-") $wert["value"] = "-".$wert["value"];
}
if($wert["type"]=="klammer") {
$wert["value"] = $this->parse2($wert["value"]);
}
if($i+1>=count($Z)) {
$Z2[] = $wert;
break;
}
if($Z[$i+1]["type"]=="+" || $Z[$i+1]["type"]=="-" || $Z[$i+1]["type"]=="=") {
$Z2[] = $wert;
$Z2[] = $Z[$i+1];
$i++;
} else if($Z[$i+1]["type"]=="^") {
$K = array();
$K[] = $wert;
$i++;
$K[] = $Z[$i];
$i++;
$W = $Z[$i];
if($W["type"]=="klammer") {
$W["value"] = $this->parse2($W["value"]);
}
$K[] = $W;
$Z2[] = array("type"=>"klammer", "potenz"=>true, "value" => $K);
if($i+1<count($Z)) {
$i++;
$Z2[] = $Z[$i];
}
} else if($Z[$i+1]["type"]=="*" || $Z[$i+1]["type"]=="/") {
$K = array();
$K[] = $wert;
$i++;
if($Z[$i]["type"]=="/") {
// {{{
$K[] = $Z[$i];
$i++;
$W = $Z[$i];
if($W["type"]=="klammer") {
$W["value"] = $this->parse2($W["value"]);
}
$K[] = $W;
$i++;
$K2 = array("type"=>"klammer", "division"=>true, "value" => $K );
$K = array($K2);
// }}}
}
while($i<count($Z)) {
if($Z[$i]["type"]!="+" && $Z[$i]["type"]!="-" && $Z[$i]["type"]!="=") {
if($Z[$i]["type"]=="/") {
$K2 = array($K[count($K)-1]);
$K2[] = $Z[$i];
$i++;
$W = $Z[$i];
if($W["type"]=="klammer") {
$W["value"] = $this->parse2($W["value"]);
}
$K2[] = $W;
//$K2[] = $Z[$i];
$K[count($K)-1] = array("type"=>"klammer", "division"=>true, "value" => $K2 );
} else if($Z[$i]["type"]=="^") {
$K2 = array($K[count($K)-1]);
$K2[] = $Z[$i];
$i++;
$W = $Z[$i];
if($W["type"]=="klammer") {
$W["value"] = $this->parse2($W["value"]);
}
$K2[] = $W;
$K[count($K)-1] = array("type"=>"klammer", "potenz"=>true, "value" => $K2 );
} else {
$W = $Z[$i];
if($W["type"]=="klammer") {
$W["value"] = $this->parse2($W["value"]);
}
$K[] = $W;
}
} else {
//$i-=2;
break;
}
$i++;
}
//if($K2[0]["type"]=="klammer") $K2 = $this->parse2($K2);
$Z2[] = array("type"=>"klammer", "auto"=>true, "value" => $K );
if($i+1<count($Z)) $Z2[] = $Z[$i];
}
// }}}
}
return($Z2);
// }}}
}
function drawFormel($Z, $depth=0, $Zx=array(), $fontsize=-1 ) {
// {{{
if($fontsize==-1) $fontsize = $this->ttfSize;
// Im ersten Durchlauf nur die Klammern abarbeiten
for($i=0;$i<count($Z);$i++) {
// {{{
if($Z[$i]["type"]=="klammer") {
$fs = $fontsize;
if($Zx["potenz"] && $i==2) $fs *= 0.8;
$Z[$i]["img"] = $this->drawFormel($Z[$i]["value"], $depth+1, $Z[$i], $fs);
$Z[$i]["imgWidth"] = imageSx($Z[$i]["img"]);
$Z[$i]["imgHeight"] = imageSy($Z[$i]["img"]);
}
// }}}
}
// Nun die anderen Zeichen abarbeiten
for($i=0;$i<count($Z);$i++) {
// {{{
if($Z[$i]["type"]!="klammer") {
if($this->useTTF) {
$text_data = imagettfbbox( $fontsize, 0, $this->ttfFile, $Z[$i]["value"] );
$posX_font = min($text_data[0], $text_data[6]) * -1;
$posY_font = min($text_data[5], $text_data[7]) * -1;
$height = max($text_data[1], $text_data[3]) - min($text_data[5], $text_data[7])+2;
$width = max($text_data[2], $text_data[4]) - min($text_data[0], $text_data[6])+2;
$Z[$i]["img"] = imageCreate( $width, $height );
$white = imageColorAllocate($Z[$i]["img"], 255,255,255);
$col = imageColorAllocate($Z[$i]["img"], 0,0,0);
$fs = $fontsize;
if($Zx["potenz"] && $i==2) $fs *= 0.8;
imagettftext( $Z[$i]["img"], $fs, 0, $posX_font, $posY_font, $col, $this->ttfFile, $Z[$i]["value"] );
} else {
$width = strlen($Z[$i]["value"])*10;
$height = 15;
$Z[$i]["img"] = imageCreate( $width, $height );
$white = imageColorAllocate($Z[$i]["img"], 255,255,255);
$col = imageColorAllocate($Z[$i]["img"], 0,0,0);
imagestring($Z[$i]["img"], 2,2,2,$Z[$i]["value"], $col);
}
$Z[$i]["imgWidth"] = imageSx($Z[$i]["img"]);
$Z[$i]["imgHeight"] = imageSy($Z[$i]["img"]);
}
// }}}
}
if($Zx["potenz"]) {
$maxHeight = $Z[0]["imgHeight"] + ($Z[2]["imgHeight"]*0.8)+10;
$maxWidth = $Z[0]["imgWidth"] + $Z[2]["imgWidth"]+10;
$im = imageCreate($maxWidth, $maxHeight);
$white = imageColorAllocate($im, 255,255,255);
$col = imageColorAllocate($im, 0,0,0);
$x = 0;
$y = 0;
imageCopy($im, $Z[0]["img"], 2, $maxHeight-$Z[0]["imgHeight"]-2 , 0,0, $Z[0]["imgWidth"], $Z[0]["imgHeight"]);
$x += $Z[0]["imgWidth"]+5;
$y += $Z[0]["imgHeight"]+5;
imageCopy($im, $Z[2]["img"], $maxWidth-$Z[2]["imgWidth"]-2,2, 0,0, $Z[2]["imgWidth"], $Z[2]["imgHeight"]);
} else if($Zx["division"]) {
// {{{
$maxWidth=0;
for($i=0;$i<count($Z);$i++) {
if($Z[$i]["imgWidth"] > $maxWidth) $maxWidth = $Z[$i]["imgWidth"];
}
$maxWidth += 10;
$im = imageCreate($maxWidth, $Z[0]["imgHeight"] + $Z[2]["imgHeight"]+10);
$white = imageColorAllocate($im, 255,255,255);
$col = imageColorAllocate($im, 0,0,0);
$y = 0;
imageCopy($im, $Z[0]["img"], $maxWidth/2-$Z[0]["imgWidth"]/2,0 , 0,0, $Z[0]["imgWidth"], $Z[0]["imgHeight"]);
$y += $Z[0]["imgHeight"]+5;
imageCopy($im, $Z[2]["img"], $maxWidth/2-$Z[2]["imgWidth"]/2,$y , 0,0, $Z[2]["imgWidth"], $Z[2]["imgHeight"]);
imageLine($im, 2,$y-2, $maxWidth-2, $y-2, $col );
// }}}
} else {
// {{{
$maxHeight=0;
$sumWidth = 0;
for($i=0;$i<count($Z);$i++) {
$sumWidth += $Z[$i]["imgWidth"];
if($Z[$i]["imgHeight"] > $maxHeight) $maxHeight = $Z[$i]["imgHeight"];
}
$maxHeight+=6;
$x=5;
$addWidth=10;
if($Zx["function"]=="WURZEL") {
$addWidth += 10;
} else if($Zx["function"]!="") {
if($this->useTTF) {
$text_data = imagettfbbox( $this->ttfSize, 0, $this->ttfFile, $Zx["function"] );
$posX_font = min($text_data[0], $text_data[6]) * -1;
$posY_font = min($text_data[5], $text_data[7]) * -1;
$height = max($text_data[1], $text_data[3]) - min($text_data[5], $text_data[7]);
$width = max($text_data[2], $text_data[4]) - min($text_data[0], $text_data[6]) + 4;
$funcImg = imageCreate( $width, $height );
$white = imageColorAllocate($funcImg, 255,255,255);
$col = imageColorAllocate($funcImg, 0,0,0);
imagettftext( $funcImg, $this->ttfSize, 0, $posX_font, $posY_font, $col, $this->ttfFile, $Zx["function"] );
} else {
$width = strlen($Zx["function"])*10;
$height = 15;
$funcImg = imageCreate( $width, $height );
$white = imageColorAllocate($funcImg, 255,255,255);
$col = imageColorAllocate($funcImg, 0,0,0);
imagestring($funcImg, 2,2,2,$Zx["function"], $col);
}
$x=2;
$addWidth += $width;
}
$im = imageCreate($sumWidth+$addWidth, $maxHeight);
$white = imageColorAllocate($im, 255,255,255);
$col = imageColorAllocate($im, 0,0,0);
if($Zx["function"]=="WURZEL") {
$x += 10;
} else if($Zx["function"]!="") {
imageCopy($im, $funcImg, $x, $maxHeight/2-$height/2, 0,0, $width, $height);
$x += $width;
}
if( ($depth>0 || $Zx["function"]!="") && $Zx["function"]!="WURZEL" && ($Z[0]["type"]!="klammer" || count($Z[0]["value"])>1) ) imageArc($im, $x+4-5,$maxHeight/2, 8, $maxHeight-2, 90,270, $col);
for($i=0;$i<count($Z);$i++) {
// {{{
imageCopy($im, $Z[$i]["img"], $x, $maxHeight/2-$Z[$i]["imgHeight"]/2, 0,0, $Z[$i]["imgWidth"], $Z[$i]["imgHeight"]);
$x += $Z[$i]["imgWidth"];
// }}}
}
if( ($depth>0 || $Zx["function"]!="") && $Zx["function"]!="WURZEL" && ($Z[0]["type"]!="klammer" || count($Z[0]["value"])>1) ) imageArc($im, $x+1,$maxHeight/2, 8, $maxHeight-2, 270,90, $col);
if($Zx["function"]=="WURZEL") {
imageLine($im, 1, $maxHeight/3,5, $maxHeight/3, $col );
imageLine($im, 5, $maxHeight/3,8, $maxHeight-2, $col );
imageLine($im, 8, $maxHeight-2, 11, 1, $col );
imageLine($im, 11,0 , $sumWidth+$addWidth, 0, $col );
imageLine($im, $sumWidth+$addWidth-1, 0,$sumWidth+$addWidth-1, 4, $col );
}
// }}}
}
return($im);
// }}}
}
function getImage($f) {
// {{{
$Z = $this->parse($f);
$Z2 = $this->parse2($Z);
$im = $this->drawFormel($Z2);
return($im);
// }}}
}
}
?>
<html>
<body>
<?php
if($_POST["formelstring"]!="") {
$FP = new formel();
/*
// Aktivate this to use TTF-Font.
// copy a fontfile like arial.ttf in this directory.
$FP->useTTF(dirname(__FILE__)."/arial.ttf");
$FP->ttfSize=15;
*/
$im = $FP->getImage($_POST["formelstring"]);
imagePng($im, "formel.png");
echo "<script>parent.document.getElementById('image').src='formel.png?x=".time()."';</script>";
exit;
}
?>
<?php
if($_POST["formelstring"]=="") $_POST["formelstring"] = "x=WURZEL(1+2/3)/(1+2)";
?>
<h2>render formula</h2>
<form method="post" target="formelimage" name="formel">
formula: <input type="text" size=80 name="formelstring" value="<?php echo $_POST["formelstring"];?>" onKeyUp="sendFormel();">
</form>
<p>
<img src="formel.png?x=<?php echo time();?>" id="image">
</p>
<hr size=1>
Use: + - * / () and WURZEL() for square root.<br>
e.g.: 1+2-3/5 or c=WURZEL(a^2+b^2)
<hr size=1>
<script>
var sendCount=0;
function doSend() {
// {{{
if(sendCount>0) {
sendCount--;
if(sendCount==0) {
document.formel.submit();
sendCount=0;
}
}
setTimeout("doSend()", 100);
// }}}
}
setTimeout("doSend()", 100);
function sendFormel() {
// {{{
sendCount=5;
// }}}
}
</script>
<iframe src="about:blank" width=1 height=1 border=0 frameborder=0 name="formelimage"></iframe>
</body>
</html>
class formel {
var $functionNames = array("WURZEL","sin","cos","pow","ARCSIN");
var $ttf;
var $ttfFile;
function formel() {
// {{{
$this->ttf = false;
$this->ttfSize = 15;
// }}}
}
function useTTF($ttfFile) {
// {{{
$this->ttf = true;
$this->ttfFile = $ttfFile;
// }}}
}
function parse($f) {
// {{{
$f = str_replace(" ","",$f);
$i = 0;
while($i<strlen($f)) {
do {
$c = substr($f,$i,1);
if($c==" ") $i++;
} while($c==" ");
//echo $c."<br>";
$functionName = "";
for($j=0;$j<count($this->functionNames);$j++) {
if(strtoupper(substr($f,$i,strlen($this->functionNames[$j]))) == strtoupper($this->functionNames[$j])) {
$i += strlen($this->functionNames[$j]);
$c = substr($f,$i,1);
$functionName = strtoupper($this->functionNames[$j]);
//echo $c."<br>";
//exit;
}
}
if($c=="+") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"+", "value"=>"+");
$nr="";
} else if($c=="-") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"-", "value"=>"-");
$nr="";
} else if($c=="=") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"=", "value"=>"=");
$nr="";
} else if($c=="*") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"*", "value"=>"*");
$nr="";
} else if($c=="/") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"/", "value"=>"/");
$nr="";
} else if($c=="^") {
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
$Z[] = array("type"=>"^", "value"=>"^");
$nr="";
} else if($c=="(") {
$klammer = 1;
$f2 = "";
while($i<strlen($f)) {
$i++;
$c = substr($f,$i,1);
if($c=="(") $klammer++;
if($c==")") {
$klammer--;
if($klammer==0) {
//echo "<b>".$f2."</b><br>";
$D = array("type"=>"klammer");
if($functionName!="") $D["function"] = $functionName;
$D["value"] = $this->parse($f2);
$Z[] = $D;
break;
} else $f2 .= $c;
} else {
$f2 .= $c;
}
}
} else {
$nr .= $c;
}
$i++;
}
if($nr!="") $Z[] = array("type"=>"number", "value"=>$nr);
return($Z);
// }}}
}
function parse2($Z, $reparse=true) {
// {{{
$Z2 = array();
for($i=0;$i<count($Z);$i++) {
// {{{
$wert = $Z[$i];
if($wert["type"]=="-" || $wert["type"]=="+" || $wert["type"]=="=") {
$vorzeichen = $wert["type"];
$i++;
$wert = $Z[$i];
if($vorzeichen=="-") $wert["value"] = "-".$wert["value"];
}
if($wert["type"]=="klammer") {
$wert["value"] = $this->parse2($wert["value"]);
}
if($i+1>=count($Z)) {
$Z2[] = $wert;
break;
}
if($Z[$i+1]["type"]=="+" || $Z[$i+1]["type"]=="-" || $Z[$i+1]["type"]=="=") {
$Z2[] = $wert;
$Z2[] = $Z[$i+1];
$i++;
} else if($Z[$i+1]["type"]=="^") {
$K = array();
$K[] = $wert;
$i++;
$K[] = $Z[$i];
$i++;
$W = $Z[$i];
if($W["type"]=="klammer") {
$W["value"] = $this->parse2($W["value"]);
}
$K[] = $W;
$Z2[] = array("type"=>"klammer", "potenz"=>true, "value" => $K);
if($i+1<count($Z)) {
$i++;
$Z2[] = $Z[$i];
}
} else if($Z[$i+1]["type"]=="*" || $Z[$i+1]["type"]=="/") {
$K = array();
$K[] = $wert;
$i++;
if($Z[$i]["type"]=="/") {
// {{{
$K[] = $Z[$i];
$i++;
$W = $Z[$i];
if($W["type"]=="klammer") {
$W["value"] = $this->parse2($W["value"]);
}
$K[] = $W;
$i++;
$K2 = array("type"=>"klammer", "division"=>true, "value" => $K );
$K = array($K2);
// }}}
}
while($i<count($Z)) {
if($Z[$i]["type"]!="+" && $Z[$i]["type"]!="-" && $Z[$i]["type"]!="=") {
if($Z[$i]["type"]=="/") {
$K2 = array($K[count($K)-1]);
$K2[] = $Z[$i];
$i++;
$W = $Z[$i];
if($W["type"]=="klammer") {
$W["value"] = $this->parse2($W["value"]);
}
$K2[] = $W;
//$K2[] = $Z[$i];
$K[count($K)-1] = array("type"=>"klammer", "division"=>true, "value" => $K2 );
} else if($Z[$i]["type"]=="^") {
$K2 = array($K[count($K)-1]);
$K2[] = $Z[$i];
$i++;
$W = $Z[$i];
if($W["type"]=="klammer") {
$W["value"] = $this->parse2($W["value"]);
}
$K2[] = $W;
$K[count($K)-1] = array("type"=>"klammer", "potenz"=>true, "value" => $K2 );
} else {
$W = $Z[$i];
if($W["type"]=="klammer") {
$W["value"] = $this->parse2($W["value"]);
}
$K[] = $W;
}
} else {
//$i-=2;
break;
}
$i++;
}
//if($K2[0]["type"]=="klammer") $K2 = $this->parse2($K2);
$Z2[] = array("type"=>"klammer", "auto"=>true, "value" => $K );
if($i+1<count($Z)) $Z2[] = $Z[$i];
}
// }}}
}
return($Z2);
// }}}
}
function drawFormel($Z, $depth=0, $Zx=array(), $fontsize=-1 ) {
// {{{
if($fontsize==-1) $fontsize = $this->ttfSize;
// Im ersten Durchlauf nur die Klammern abarbeiten
for($i=0;$i<count($Z);$i++) {
// {{{
if($Z[$i]["type"]=="klammer") {
$fs = $fontsize;
if($Zx["potenz"] && $i==2) $fs *= 0.8;
$Z[$i]["img"] = $this->drawFormel($Z[$i]["value"], $depth+1, $Z[$i], $fs);
$Z[$i]["imgWidth"] = imageSx($Z[$i]["img"]);
$Z[$i]["imgHeight"] = imageSy($Z[$i]["img"]);
}
// }}}
}
// Nun die anderen Zeichen abarbeiten
for($i=0;$i<count($Z);$i++) {
// {{{
if($Z[$i]["type"]!="klammer") {
if($this->useTTF) {
$text_data = imagettfbbox( $fontsize, 0, $this->ttfFile, $Z[$i]["value"] );
$posX_font = min($text_data[0], $text_data[6]) * -1;
$posY_font = min($text_data[5], $text_data[7]) * -1;
$height = max($text_data[1], $text_data[3]) - min($text_data[5], $text_data[7])+2;
$width = max($text_data[2], $text_data[4]) - min($text_data[0], $text_data[6])+2;
$Z[$i]["img"] = imageCreate( $width, $height );
$white = imageColorAllocate($Z[$i]["img"], 255,255,255);
$col = imageColorAllocate($Z[$i]["img"], 0,0,0);
$fs = $fontsize;
if($Zx["potenz"] && $i==2) $fs *= 0.8;
imagettftext( $Z[$i]["img"], $fs, 0, $posX_font, $posY_font, $col, $this->ttfFile, $Z[$i]["value"] );
} else {
$width = strlen($Z[$i]["value"])*10;
$height = 15;
$Z[$i]["img"] = imageCreate( $width, $height );
$white = imageColorAllocate($Z[$i]["img"], 255,255,255);
$col = imageColorAllocate($Z[$i]["img"], 0,0,0);
imagestring($Z[$i]["img"], 2,2,2,$Z[$i]["value"], $col);
}
$Z[$i]["imgWidth"] = imageSx($Z[$i]["img"]);
$Z[$i]["imgHeight"] = imageSy($Z[$i]["img"]);
}
// }}}
}
if($Zx["potenz"]) {
$maxHeight = $Z[0]["imgHeight"] + ($Z[2]["imgHeight"]*0.8)+10;
$maxWidth = $Z[0]["imgWidth"] + $Z[2]["imgWidth"]+10;
$im = imageCreate($maxWidth, $maxHeight);
$white = imageColorAllocate($im, 255,255,255);
$col = imageColorAllocate($im, 0,0,0);
$x = 0;
$y = 0;
imageCopy($im, $Z[0]["img"], 2, $maxHeight-$Z[0]["imgHeight"]-2 , 0,0, $Z[0]["imgWidth"], $Z[0]["imgHeight"]);
$x += $Z[0]["imgWidth"]+5;
$y += $Z[0]["imgHeight"]+5;
imageCopy($im, $Z[2]["img"], $maxWidth-$Z[2]["imgWidth"]-2,2, 0,0, $Z[2]["imgWidth"], $Z[2]["imgHeight"]);
} else if($Zx["division"]) {
// {{{
$maxWidth=0;
for($i=0;$i<count($Z);$i++) {
if($Z[$i]["imgWidth"] > $maxWidth) $maxWidth = $Z[$i]["imgWidth"];
}
$maxWidth += 10;
$im = imageCreate($maxWidth, $Z[0]["imgHeight"] + $Z[2]["imgHeight"]+10);
$white = imageColorAllocate($im, 255,255,255);
$col = imageColorAllocate($im, 0,0,0);
$y = 0;
imageCopy($im, $Z[0]["img"], $maxWidth/2-$Z[0]["imgWidth"]/2,0 , 0,0, $Z[0]["imgWidth"], $Z[0]["imgHeight"]);
$y += $Z[0]["imgHeight"]+5;
imageCopy($im, $Z[2]["img"], $maxWidth/2-$Z[2]["imgWidth"]/2,$y , 0,0, $Z[2]["imgWidth"], $Z[2]["imgHeight"]);
imageLine($im, 2,$y-2, $maxWidth-2, $y-2, $col );
// }}}
} else {
// {{{
$maxHeight=0;
$sumWidth = 0;
for($i=0;$i<count($Z);$i++) {
$sumWidth += $Z[$i]["imgWidth"];
if($Z[$i]["imgHeight"] > $maxHeight) $maxHeight = $Z[$i]["imgHeight"];
}
$maxHeight+=6;
$x=5;
$addWidth=10;
if($Zx["function"]=="WURZEL") {
$addWidth += 10;
} else if($Zx["function"]!="") {
if($this->useTTF) {
$text_data = imagettfbbox( $this->ttfSize, 0, $this->ttfFile, $Zx["function"] );
$posX_font = min($text_data[0], $text_data[6]) * -1;
$posY_font = min($text_data[5], $text_data[7]) * -1;
$height = max($text_data[1], $text_data[3]) - min($text_data[5], $text_data[7]);
$width = max($text_data[2], $text_data[4]) - min($text_data[0], $text_data[6]) + 4;
$funcImg = imageCreate( $width, $height );
$white = imageColorAllocate($funcImg, 255,255,255);
$col = imageColorAllocate($funcImg, 0,0,0);
imagettftext( $funcImg, $this->ttfSize, 0, $posX_font, $posY_font, $col, $this->ttfFile, $Zx["function"] );
} else {
$width = strlen($Zx["function"])*10;
$height = 15;
$funcImg = imageCreate( $width, $height );
$white = imageColorAllocate($funcImg, 255,255,255);
$col = imageColorAllocate($funcImg, 0,0,0);
imagestring($funcImg, 2,2,2,$Zx["function"], $col);
}
$x=2;
$addWidth += $width;
}
$im = imageCreate($sumWidth+$addWidth, $maxHeight);
$white = imageColorAllocate($im, 255,255,255);
$col = imageColorAllocate($im, 0,0,0);
if($Zx["function"]=="WURZEL") {
$x += 10;
} else if($Zx["function"]!="") {
imageCopy($im, $funcImg, $x, $maxHeight/2-$height/2, 0,0, $width, $height);
$x += $width;
}
if( ($depth>0 || $Zx["function"]!="") && $Zx["function"]!="WURZEL" && ($Z[0]["type"]!="klammer" || count($Z[0]["value"])>1) ) imageArc($im, $x+4-5,$maxHeight/2, 8, $maxHeight-2, 90,270, $col);
for($i=0;$i<count($Z);$i++) {
// {{{
imageCopy($im, $Z[$i]["img"], $x, $maxHeight/2-$Z[$i]["imgHeight"]/2, 0,0, $Z[$i]["imgWidth"], $Z[$i]["imgHeight"]);
$x += $Z[$i]["imgWidth"];
// }}}
}
if( ($depth>0 || $Zx["function"]!="") && $Zx["function"]!="WURZEL" && ($Z[0]["type"]!="klammer" || count($Z[0]["value"])>1) ) imageArc($im, $x+1,$maxHeight/2, 8, $maxHeight-2, 270,90, $col);
if($Zx["function"]=="WURZEL") {
imageLine($im, 1, $maxHeight/3,5, $maxHeight/3, $col );
imageLine($im, 5, $maxHeight/3,8, $maxHeight-2, $col );
imageLine($im, 8, $maxHeight-2, 11, 1, $col );
imageLine($im, 11,0 , $sumWidth+$addWidth, 0, $col );
imageLine($im, $sumWidth+$addWidth-1, 0,$sumWidth+$addWidth-1, 4, $col );
}
// }}}
}
return($im);
// }}}
}
function getImage($f) {
// {{{
$Z = $this->parse($f);
$Z2 = $this->parse2($Z);
$im = $this->drawFormel($Z2);
return($im);
// }}}
}
}
?>
<html>
<body>
<?php
if($_POST["formelstring"]!="") {
$FP = new formel();
/*
// Aktivate this to use TTF-Font.
// copy a fontfile like arial.ttf in this directory.
$FP->useTTF(dirname(__FILE__)."/arial.ttf");
$FP->ttfSize=15;
*/
$im = $FP->getImage($_POST["formelstring"]);
imagePng($im, "formel.png");
echo "<script>parent.document.getElementById('image').src='formel.png?x=".time()."';</script>";
exit;
}
?>
<?php
if($_POST["formelstring"]=="") $_POST["formelstring"] = "x=WURZEL(1+2/3)/(1+2)";
?>
<h2>render formula</h2>
<form method="post" target="formelimage" name="formel">
formula: <input type="text" size=80 name="formelstring" value="<?php echo $_POST["formelstring"];?>" onKeyUp="sendFormel();">
</form>
<p>
<img src="formel.png?x=<?php echo time();?>" id="image">
</p>
<hr size=1>
Use: + - * / () and WURZEL() for square root.<br>
e.g.: 1+2-3/5 or c=WURZEL(a^2+b^2)
<hr size=1>
<script>
var sendCount=0;
function doSend() {
// {{{
if(sendCount>0) {
sendCount--;
if(sendCount==0) {
document.formel.submit();
sendCount=0;
}
}
setTimeout("doSend()", 100);
// }}}
}
setTimeout("doSend()", 100);
function sendFormel() {
// {{{
sendCount=5;
// }}}
}
</script>
<iframe src="about:blank" width=1 height=1 border=0 frameborder=0 name="formelimage"></iframe>
</body>
</html>

