1000) ){ $anz=mt_rand(10,20); } } else { $anz=mt_rand(10,20); } $anz=$anz-1; if(isset($_GET['g'])) { $g=$_GET['g']; } else { $g=1; } # Datensatz erzeugen - offene Kurve $cop1=""; $kk=0; $runden=1.75; for ($j = 0; $j <= $anz; $j++) { $ww=($j/$anz+$kk*mt_rand(-1000,1000)/100000)*$runden*2*M_PI; $rr=55.0-$j/$anz*50.0+$kk*mt_rand(-1000,1000)/1000; $xx=$rr*cos($ww)+$kk*mt_rand(-1000,1000)/1000; $yy=$rr*sin($ww)+$kk*mt_rand(-1000,1000)/1000; $data[$j][0]=round($xx,2); $data[$j][1]=round($yy,2); $cop1 .=''; } $cop0=""; for ($j = 0; $j <= 10*$anz; $j++) { $ww=($j/$anz/10+$kk*mt_rand(-1000,1000)/100000)*$runden*2*M_PI; $rr=55.0-$j/$anz/10*50.0+$kk*mt_rand(-1000,1000)/1000; $xx=$rr*cos($ww)+$kk*mt_rand(-1000,1000)/1000; $yy=$rr*sin($ww)+$kk*mt_rand(-1000,1000)/1000; $datax=round($xx,2); $datay=round($yy,2); $cop0 .=''; } # Alternative Schaetzung der Ableitungen mit besserer Genauigkeit, # falls diese bei dem Datensatz nicht gegeben sind. $diff[0][0]=round($data[0][0]+$g*(-3*$data[0][0]+4*$data[1][0]-$data[2][0])/6,2); $diff[0][1]=round($data[0][1]+$g*(-3*$data[0][1]+4*$data[1][1]-$data[2][1])/6,2); $diff[0][2]=round($data[0][0]-$g*(-3*$data[0][0]+4*$data[1][0]-$data[2][0])/6,2); $diff[0][3]=round($data[0][1]-$g*(-3*$data[0][1]+4*$data[1][1]-$data[2][1])/6,2); $diff[$anz][2]=round($data[$anz][0]+$g*(-3*$data[$anz][0]+4*$data[$anz-1][0]-$data[$anz-2][0])/6,2); $diff[$anz][3]=round($data[$anz][1]+$g*(-3*$data[$anz][1]+4*$data[$anz-1][1]-$data[$anz-2][1])/6,2); for ($j = 1; $j <= ($anz-1); $j++) { $jm1=$j-1; $jp1=$j+1; $diff[$j][2]=round($data[$j][0]-$g*($data[$jp1][0]-$data[$jm1][0])/6,2); $diff[$j][3]=round($data[$j][1]-$g*($data[$jp1][1]-$data[$jm1][1])/6,2); } # Daraus Pfad bestimmen $cop2=''; $cop2.=''; $pfadb='M'.$data[0][0].' '.$data[0][1].'C'.$diff[0][0].' '.$diff[0][1].' '.$diff[1][2].' '.$diff[1][3].' '.$data[1][0].' '.$data[1][1]."S\n"; for ($j = 2; $j <=$anz; $j++) { $pfadb.=$diff[$j][2].' '.$diff[$j][3].' '.$data[$j][0].' '.$data[$j][1]."\n"; $cop2 .=''; } # svg-header senden: $content="Content-type: image/svg+xml"; header($content); echo ""; ?> Interpolation Interpolation einer Spirale als Beispiel für eine offene Kurve. Um die Ableitungen/Kontrollpunkte zu berechnen, werden nur die benachbarten Punkte berücksichtigt. Ausnahme sind die Randpunkte, dort wird der Punkt selbst, der nächste und übernächste Punkt verwendet. Verfügbare Parameter: anz: Anzahl der Punkte g: Krümmungsfaktor, 1 entspricht automatischer Bestimmung wie in SVG. Rot sind einige Vergleichspunkte angegeben, blau ist der kubische Spline. Kleine Kreise geben jeweils die vorgegebenen Punkte an (grüngelb), beziehungsweise die Kontrollpunkte (cyan). Vergleichspunkte Kubischer Spline aus geschätzten Ableitungen Gegebene Punkte Kontrollpunkte