100)){
$kanz=10;
}
} else {
$kanz=10;
}
# Dämpfung
if(isset($_GET['d'])) {
$daem=$_GET['d'];
if (($daem <= 0)OR($daem > 1)){
$daem=1;
}
} else {
$daem=0.997;
}
# Wieviele Runden (bei Dämpfung nicht 1)
if(isset($_GET['r'])) {
$runden=$_GET['r'];
if (($runden <= 0)OR($runden > 100)){
$runden=1;
}
} else {
$runden=40;
}
if ($daem==1) {
$runden=1;
}
# Typ: Saite, Angel, Bogen, Welle, Schlaufe
if(isset($_GET['t'])) {
$typ=$_GET['t'];
if (($typ !='Angel')AND($typ !='Bogen')AND($typ !='Welle')AND($typ !='Schlaufe')){
$typ='Saite';
}
} else {
$typ='Saite';
}
# Wellenzahl/Bogenlänge
if(isset($_GET['w'])) {
$wz=$_GET['w'];
if (($wz < -$kanz/2)OR($wz > $kanz/2)){
$wz='un';
}
} else {
$wz='un';
}
if ($typ=='Angel') {
$x[1]=0;
$y[1]=900;
$x[2]=100;
$y[2]=400;
$x[3]=400;
$y[3]=0;
$x[4]=1200;
$y[4]=100;
# Amplitude
$au[0]=0;
$au[1]=10;
$au[2]=30;
$au[3]=60;
# Wellenzahl - bezogen auf die Länge des Stabes
if ($wz=='un') {
$wz=0.75;
}
} elseif ($typ=='Saite') {
$x[1]=0;
$y[1]=500;
$x[2]=400;
$y[2]=500;
$x[3]=800;
$y[3]=500;
$x[4]=1200;
$y[4]=500;
# Amplitude
$au[0]=400;
$au[1]=0;
$au[2]=0;
$au[3]=0;
# Wellenzahl - bezogen auf die Länge des Stabes
if ($wz=='un') {
$wz=1.25;
}
} elseif ($typ=='Bogen') {
$x[1]=0;
$y[1]=50;
$x[2]=270;
$y[2]=800;
$x[3]=930;
$y[3]=800;
$x[4]=1200;
$y[4]=50;
# Amplitude
$au[0]=300;
$au[1]=0;
$au[2]=0;
$au[3]=0;
# Wellenzahl - bezogen auf die Länge des Stabes
if ($wz=='un') {
$wz=0.5;
}
} elseif ($typ=='Welle') {
$x[1]=0;
$y[1]=50;
$x[2]=0;
$y[2]=1800;
$x[3]=1200;
$y[3]=-800;
$x[4]=1200;
$y[4]=950;
# Amplitude
$au[0]=100;
$au[1]=0;
$au[2]=0;
$au[3]=0;
# Wellenzahl - bezogen auf die Länge des Stabes
if ($wz=='un') {
$wz=1;
}
} elseif ($typ=='Schlaufe') {
$x[1]=0;
$y[1]=100;
$x[2]=2800;
$y[2]=1100;
$x[3]=-1600;
$y[3]=1100;
$x[4]=1200;
$y[4]=100;
# Amplitude
$au[0]=100;
$au[1]=0;
$au[2]=0;
$au[3]=0;
# Wellenzahl - bezogen auf die Länge des Stabes
if ($wz=='un') {
$wz=0.5;
}
}
# Gewicht Interpolation
$g=1;
# Phase
$phase=mt_rand(0,1000)/500*M_PI;
# Punkte Bogen, Kettenlinie
$kl='
';
# Kurvensegmente des Pfades in Ruhelage
for ($k = 0; $k <=$kanz; $k++) {
$u=$k/$kanz;
# Kurve
$ku=-1+2*$u;
$kx=round($u*1200);
$ky=round((1-(10**$ku+10**(-$ku))/10.1)*700+50);
$kl.="
";
#Ruhelage
$p[$k]=(1 - $u)**3*$x[1] + 3*$u*(1-$u)**2*$x[2] + 3*$u**2*(1-$u)*$x[3] + $u**3*$x[4];
$q[$k]=(1 - $u)**3*$y[1] + 3*$u*(1-$u)**2*$y[2] + 3*$u**2*(1-$u)*$y[3] + $u**3*$y[4];
# Ableitung, daraus senkrechte Richtung
$ax[$k] = (1 - $u)**2 *(3*$x[2] - 3*$x[1]) + 2*$u*(1-$u)*(3*$x[3] - 3*$x[2]) + $u**2*(3*$x[4] - 3*$x[3]);
$ay[$k] = (1 - $u)**2 *(3*$y[2] - 3*$y[1]) + 2*$u*(1-$u)*(3*$y[3] - 3*$y[2]) + $u**2*(3*$y[4] - 3*$y[3]);
$al=sqrt($ax[$k]*$ax[$k]+$ay[$k]*$ay[$k]);
if ($al==0) {
$ax[$k]=0;
$ay[$k]=0;
} else {
$ax[$k]=$ax[$k]/$al;
$ay[$k]=$ay[$k]/$al;
}
#Amplitude
$a[$k]=$au[0]+(1 - $u)*$au[1]+$u*$au[2]+$u*$u*$au[3];
}
$kl.='';
if ($typ!='Bogen') {
$kl='';
}
# Anzahl der Animationsschritte, Zeitablauf
$janz=60*$runden;
$pf='';
$dd=1;
for ($j = 0; $j <=$janz; $j++) {
#Zeitabhängigkeit
$b=$j/$janz*2*M_PI*$runden;
$pf.='';
$dd=$dd*$daem;
for ($k = 0; $k <=$kanz; $k++) {
# Ortsabhängigkeit
$win=$k/$kanz*$wz*2*M_PI;
# Welle
$pa=$dd*$a[$k]*sin($win-$b+$phase);
$px=$p[$k]-$pa*$ay[$k];
$py=$q[$k]+$pa*$ax[$k];
# Daten für die Interpolation
$data[$k][0]=round($px,1);
$data[$k][1]=round($py,1);
}
# Schätzung der Ableitung, erst Randpunkte, danach die in der Mitte
$diff[0][0]=round($data[0][0]+$g*(-3*$data[0][0]+4*$data[1][0]-$data[2][0])/6,1);
$diff[0][1]=round($data[0][1]+$g*(-3*$data[0][1]+4*$data[1][1]-$data[2][1])/6,1);
$diff[0][2]=round($data[0][0]-$g*(-3*$data[0][0]+4*$data[1][0]-$data[2][0])/6,1);
$diff[0][3]=round($data[0][1]-$g*(-3*$data[0][1]+4*$data[1][1]-$data[2][1])/6,1);
$diff[1][2]=round($data[1][0]-$g*(-3*$data[0][0]-10*$data[1][0]+18*$data[2][0]-6*$data[3][0]+$data[4][0])/36,1);
$diff[1][3]=round($data[1][1]-$g*(-3*$data[0][1]-10*$data[1][1]+18*$data[2][1]-6*$data[3][1]+$data[4][1])/36,1);
$diff[$kanz][2]=round($data[$kanz][0]+$g*(-3*$data[$kanz][0]+4*$data[$kanz-1][0]-$data[$kanz-2][0])/6,1);
$diff[$kanz][3]=round($data[$kanz][1]+$g*(-3*$data[$kanz][1]+4*$data[$kanz-1][1]-$data[$kanz-2][1])/6,1);
$diff[$kanz-1][2]=round($data[$kanz-1][0]+$g*(-3*$data[$kanz][0]-10*$data[$kanz-1][0]+18*$data[$kanz-2][0]-6*$data[$kanz-3][0]+$data[$kanz-4][0])/36,1);
$diff[$kanz-1][3]=round($data[$kanz-1][1]+$g*(-3*$data[$kanz][1]-10*$data[$kanz-1][1]+18*$data[$kanz-2][1]-6*$data[$kanz-3][1]+$data[$kanz-4][1])/36,1);
for ($k = 2; $k <= ($kanz-2); $k++) {
$km1=$k-1;
$km2=$k-2;
$kp1=$k+1;
$kp2=$k+2;
$diff[$k][2]=round($data[$k][0]-$g*($data[$km2][0]-$data[$kp2][0]+8*$data[$kp1][0]-8*$data[$km1][0])/36,1);
$diff[$k][3]=round($data[$k][1]-$g*($data[$km2][1]-$data[$kp2][1]+8*$data[$kp1][1]-8*$data[$km1][1])/36,1);
}
# Daraus Pfad bestimmen
$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 ($k = 2; $k <=$kanz; $k++) {
$pfadb.=$diff[$k][2].' '.$diff[$k][3].' '.$data[$k][0].' '.$data[$k][1]."\n";
}
# Pfad eintragen
$pf.=$pfadb;
# Anfangspfad für Attribut d
if ($j==0) {
$pin=$pf;
}
# Fall noch Einträge für values folgen, Semikolon setzen
if ($j!=$janz) {
$pf.=';
';
}
}
# Wenn keine Dämpfung vorliegt, können wir endlos weiterwackeln
if ($daem==1) {
$rd='repeatDur="indefinite"';
$dur=10;
} else {
$rd='';
$dur=10*$runden;
}
# svg-header senden:
$content="Content-type: image/svg+xml; charset=UTF-8";
header($content);
# xml-Zeile ausgeben
echo "";
# und jetzt das Dokument
?>