4) ){
$runden=2;
}
} else {
$runden=2;
}
# Parameter ...
if(isset($_GET['p0'])) {
$p0deg=$_GET['p0'];
if (($p0deg < -32767.9999)OR($p0deg > 32767.9999) ){
$p0deg=mt_rand(-720,720);
}
} else {
$p0deg=mt_rand(-720,720);
}
$p0=$p0deg*M_PI/180;
if(isset($_GET['p1'])) {
$p1deg=$_GET['p1'];
if (($p1deg < -32767.9999)OR($p1deg > 32767.9999) ){
$p1deg=mt_rand(-720,720)+$p0deg;
}
} else {
$p1deg=mt_rand(-720,720)+$p0deg;
}
$p1=$p1deg*M_PI/180;
if(isset($_GET['p2'])) {
$p2deg=$_GET['p2'];
if (($p2deg < -32767.9999)OR($p2deg > 32767.9999) ){
$p2deg=mt_rand(-720,720)+$p1deg;
}
} else {
$p2deg=mt_rand(-720,720)+$p1deg;
}
$p2=$p2deg*M_PI/180;
if(isset($_GET['p3'])) {
$p3deg=$_GET['p3'];
if (($p3deg < -32767.9999)OR($p3deg > 32767.9999) ){
$p3deg=mt_rand(-720,720)+$p3deg;
}
} else {
$p3deg=mt_rand(-720,720)+$p2deg;
}
$p3=$p3deg*M_PI/180;
if(isset($_GET['r0'])) {
$r0=$_GET['r0'];
if (($r0 < -32767.9999)OR($r0 > 32767.9999) ){
$r0=mt_rand(-100,100);
}
} else {
$r0=mt_rand(-100,100);
}
if(isset($_GET['r1'])) {
$r1=$_GET['r1'];
if (($r1 < -32767.9999)OR($r1 > 32767.9999) ){
$r1=mt_rand(-100,100)+$r0;
}
} else {
$r1=mt_rand(-100,100)+$r0;
}
if(isset($_GET['r2'])) {
$r2=$_GET['r2'];
if (($r2 < -32767.9999)OR($r2 > 32767.9999) ){
$r2=mt_rand(-100,100)+$r1;
}
} else {
$r2=mt_rand(-100,100)+$r1;
}
if(isset($_GET['r3'])) {
$r3=$_GET['r3'];
if (($r3 < -32767.9999)OR($r3 > 32767.9999) ){
$r3=mt_rand(-100,100)+$r2;
}
} else {
$r3=mt_rand(-100,100)+$r2;
}
$pdeg=abs($p0deg-$p1deg)+abs($p1deg-$p2deg)+abs($p2deg-$p3deg);
# Anzahl der Interpolationspunkte eingeben:
# (GET number of interpolation points)
if(isset($_GET['anz'])) {
$anz=$_GET['anz'];
if (($anz < 2)OR($anz > 1000) ){
$anz=max(10,ceil(abs($pdeg)/30));
}
} else {
$anz=max(10,ceil(abs($pdeg)/30));
}
$anzv=2*$anz;
if(isset($_GET['cx'])) {
$cx=$_GET['cx'];
if (($cx < -32767.9999)OR($cx > 32767.9999) ){
$cx=mt_rand(-600,600);
}
} else {
$cx=mt_rand(-600,600);
}
if(isset($_GET['cy'])) {
$cy=$_GET['cy'];
if (($cy < -32767.9999)OR($cy > 32767.9999) ){
$cy=mt_rand(-600,600);
}
} else {
$cy=mt_rand(-600,600);
}
# Auswertung beginnen:
# (start evaluation)
# viewBox berechnen / calculate viewBox
$rr=max(1,max(abs($r0),abs($r1),abs($r2),abs($r3)));
$rs=$rr;
$vv=4*ceil(0.6*$rs);
$vh=1.5*$vv;
$vy=round($cy-$vv/1.85);
$vx=round($cx-$vh/2);
$viewBox="$vx $vy $vh $vv";
$sw=ceil($vv/100);
$swr=$sw/4;
#################################
# Vergleich, doppelte Punktzahl / comparison, doubled number of points
# Datensatz erzeugen / Interpolation
for ($j = 0; $j <= $anzv; $j++) {
$u=$j/$anzv;
$ur=(1-$u);
$x1=$ur*$ur*$ur*$p0+3*$u*$ur*$ur*$p1 +3*$u*$u*$ur*$p2+ $u*$u*$u*$p3;
$y1=$ur*$ur*$ur*$r0+ 3*$u*$ur*$ur*$r1 + 3*$u*$u*$ur*$r2+ $u*$u*$u*$r3;
# Ableitungen / derivatives ...
$dphi=($ur*$ur*3*($p1-$p0) + $u*$ur*6*($p2-$p1) +$u*$u*3*($p3-$p2))/$anzv;
$dr=($ur*$ur*3*($r1-$r0) + $u*$ur*6*($r2-$r1) +$u*$u*3*($r3-$r2))/$anzv;
$cpi=cos($x1);
$spi=sin($x1);
$ri=$y1;
# Punkte / points
$xx=$ri*$cpi;
$yy=$ri*$spi;
# Ableitungen / derivatives ...
$dx=$dr*$cpi -$dphi*$ri*$spi;
$dy=$dr*$spi +$dphi*$ri*$cpi;
# Daten speichern / save data
$data[$j][0]=$xx+$cx;
$data[$j][1]=$yy+$cy;
$data[$j][2]=$dx;
$data[$j][3]=$dy;
}
# Aus den Ableitungen die Kontrollpunkte berechnen
# (generate control points from derivatives)
$cp[0][0]=round($data[0][0]+$data[0][2]/3,$runden);
$cp[0][1]=round($data[0][1]+$data[0][3]/3,$runden);
for ($j = 0; $j <= $anzv; $j++) {
$cq[$j][0]=round($data[$j][0]-$data[$j][2]/3,$runden);
$cq[$j][1]=round($data[$j][1]-$data[$j][3]/3,$runden);
# und nun erst Punkte runden / and now round points
$data[$j][0]=round($data[$j][0],$runden);
$data[$j][1]=round($data[$j][1],$runden);
}
# Daraus Pfad bestimmen und malen der Punkte vorbereiten
# (generate path data and prepare for painting)
$pfadv='M'.$data[0][0].' '.$data[0][1].' C'.$cp[0][0].' '.$cp[0][1].' '.$cq[1][0].' '.$cq[1][1].' '.$data[1][0].' '.$data[1][1]." S\n";
for ($j = 2; $j <=$anzv; $j++) {
$pfadv.=$cq[$j][0].' '.$cq[$j][1].' '.$data[$j][0].' '.$data[$j][1]."\n";
}
###################################
# Datensatz erzeugen / Interpolation
for ($j = 0; $j <= $anz; $j++) {
$u=$j/$anz;
$ur=(1-$u);
$x1=$ur*$ur*$ur*$p0+3*$u*$ur*$ur*$p1 +3*$u*$u*$ur*$p2+ $u*$u*$u*$p3;
$y1=$ur*$ur*$ur*$r0+ 3*$u*$ur*$ur*$r1 + 3*$u*$u*$ur*$r2+ $u*$u*$u*$r3;
# Ableitungen / derivatives ...
$dphi=($ur*$ur*3*($p1-$p0) + $u*$ur*6*($p2-$p1) +$u*$u*3*($p3-$p2))/$anz;
$dr=($ur*$ur*3*($r1-$r0) + $u*$ur*6*($r2-$r1) +$u*$u*3*($r3-$r2))/$anz;
$cpi=cos($x1);
$spi=sin($x1);
$ri=$y1;
# Punkte / points
$xx=$ri*$cpi;
$yy=$ri*$spi;
# Ableitungen / derivatives ...
$dx=$dr*$cpi -$dphi*$ri*$spi;
$dy=$dr*$spi +$dphi*$ri*$cpi;
# Daten speichern / save data
$data[$j][0]=$xx+$cx;
$data[$j][1]=$yy+$cy;
$data[$j][2]=$dx;
$data[$j][3]=$dy;
}
# Aus den Ableitungen die Kontrollpunkte berechnen
# (generate control points from derivatives)
for ($j = 0; $j <= $anz; $j++) {
$cp[$j][0]=round($data[$j][0]+$data[$j][2]/3,$runden);
$cp[$j][1]=round($data[$j][1]+$data[$j][3]/3,$runden);
$cq[$j][0]=round($data[$j][0]-$data[$j][2]/3,$runden);
$cq[$j][1]=round($data[$j][1]-$data[$j][3]/3,$runden);
# und nun erst Punkte runden / and now round points
$data[$j][0]=round($data[$j][0],$runden);
$data[$j][1]=round($data[$j][1],$runden);
}
# Fehler abschätzen / estimate error
$fehl=0;
$fmax=0;
$fanz=0;
for ($j = 0; $j <= $anz; $j++) {
$jj=$j+1;
if ($j != $anz) {
for ($i = 0; $i < 30; $i++) {
$u=($j+$i/30)/$anz;
$ur=(1-$u);
$phi=$ur*$ur*$ur*$p0+3*$u*$ur*$ur*$p1 +3*$u*$u*$ur*$p2+ $u*$u*$u*$p3;
$ri=$ur*$ur*$ur*$r0+ 3*$u*$ur*$ur*$r1 + 3*$u*$u*$ur*$r2+ $u*$u*$u*$r3;
$cpi=cos($phi);
$spi=sin($phi);
# Punkte / points
$xx=$ri*$cpi+$cx;
$yy=$ri*$spi+$cy;
$u=$i/30;
$ur=(1-$u);
$x1=$ur*$ur*$ur*$data[$j][0]+3*$u*$ur*$ur*$cp[$j][0] +3*$u*$u*$ur*$cq[$jj][0]+ $u*$u*$u*$data[$jj][0];
$y1=$ur*$ur*$ur*$data[$j][1]+ 3*$u*$ur*$ur*$cp[$j][1] + 3*$u*$u*$ur*$cq[$jj][1]+ $u*$u*$u*$data[$jj][1];
$dxx=$x1-$xx;
$dyy=$y1-$yy;
$fdd=sqrt($dxx*$dxx+$dyy*$dyy);
$fehl=$fehl+$fdd;
if ($fdd > $fmax) {
$fmax=$fdd;
$fx=$xx;
$fy=$yy;
}
$fanz=$fanz+1;
}
}
}
$fehl=$fehl/$fanz;
# Daraus Pfad bestimmen und malen der Punkte vorbereiten
# (generate path data and prepare for painting)
$pfada='M'.$data[0][0].' '.$data[0][1].' C'.$cp[0][0].' '.$cp[0][1].' '.$cq[1][0].' '.$cq[1][1].' '.$data[1][0].' '.$data[1][1]." S\n";
$pl=' \n";
for ($j = 2; $j <=$anz; $j++) {
$pfada.=$cq[$j][0].' '.$cq[$j][1].' '.$data[$j][0].' '.$data[$j][1]."\n";
$pl.='\n";
}
###################################
$aus="
Zentrum / centre
maximaler Fehler / maximal error
Pfadvergleich doppelte Punktanzahl / path comparsion, twice the number of points
Approximierter Pfad / approximated path
Punkte / points
$pl
";
# Text skalieren und formatieren:
# (scale and format text)
$fs=ceil($vv/40);
$lh=ceil(1.2*$vv/40);
$textx=$vx +$fs;
$texty=$vy +$fs+$lh;
$texty1=$vy +$fs+2*$lh;
$texty2=$vy +$fs+3*$lh;
$break="\n";
$textpfad=wordwrap($pfada,80,$break, false);
$textpfad="$textpfad";
$aus.="
?cx=$cx&cy=$cy&p0=$p0deg&p1=$p1deg&p2=$p2deg&p3=$p3deg&r0=$r0&r1=$r1&r2=$r2&r3=$r3&anz=$anz&rnd=$runden
Aktuelle Werte / Current Values
$fmax | $fehl
Fehler maximal, mittel / Error maximum, average
$textpfad
Kubische Näherung / Cubic Approximation
";
# svg-header senden:
$content="Content-type: image/svg+xml; charset=iso-8859-1";
header($content);
# xml-Zeile ausgeben
echo "";
# und jetzt das Dokument
?>