200)){ $kanz=20; } } else { $kanz=20; } # Maß für Breite if(isset($_GET['d'])) { $delta=$_GET['d']; if (($delta <= 0)OR($delta > 5)){ $delta=mt_rand(20,100)/100; } } else { $delta=mt_rand(20,100)/100; } if ($delta<1) { $kanz=round($kanz/$delta); } # Wieviele Runden (bei Dämpfung nicht 1) if(isset($_GET['z'])) { $runden=$_GET['z']; if (($runden <= 0)OR($runden > 100)){ $runden=1; } } else { $runden=10; } $typ='Saite'; if ($typ=='Saite') { $x[1]=-1000; $y[1]=2000; $x[2]=2000; $y[2]=2000; $x[3]=4000; $y[3]=2000; $x[4]=5000; $y[4]=2000; # Wellenzahl - bezogen auf die Länge des Stabes if ($wz=='un') { $wz=(2*mt_rand(0,1)-1)*mt_rand(1,1000)/100; } } # Gewicht Interpolation $g=1; #maximale Amplitude $am=-2000*$delta; # Kurvensegmente des Pfades in Ruhelage for ($k = 0; $k <=$kanz; $k++) { $u=$k/$kanz; #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; } } # Anzahl der Animationsschritte, Zeitablauf $janz=30*$runden; $pf=''; $dd=1; for ($j = 0; $j <=$janz; $j++) { #Zeitabhängigkeit $b=$j/$janz*10; $pf.=''; $dd=$delta*$delta; $del=$b/$dd/100; for ($k = 0; $k <=$kanz; $k++) { # Ortsabhängigkeit $win=$k/$kanz*10; # Wellenpaket $h1=($win-$b); $pa=$am/$delta/sqrt(1+$del*$del)*exp(-0.5*$h1*$h1/(1+$del*$del)/$dd); $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.='; '; } } $rd=''; $dur=$runden; # svg-header senden: $content="Content-type: image/svg+xml; charset=UTF-8"; header($content); # xml-Zeile ausgeben echo ""; # und jetzt das Dokument ?> Wellenpaket Wellenpaket in Gaußform in harmonischer Näherung. Parameter: Zeit z: in Sekunden, größer als 0, maximal 100 (große Datei!) Anfangsbreite des Paketes (zerfließt mit der Zeit): d größer als 0, maximal 5 Das Zerfließen ist gut für d kleiner 0.3 erkennbar; bei kleinem d gibt es aber auch eine große Datei, weil dies eine gute Ortsauflösung erfordert. Anzahl Stützpunkte s: mindestens 5, maximal 100 (große Datei!), Vorgabe 20 Bei d kleiner als 1 erfolgt eine automatische Korrektur. Bei wenigen Stützstellen gibt es Artefakte, das Wellenpaket besteht auf zuwenig Frequenzen. Ein roter Balken zeigt die Animationsdauer. fill="freeze" values=""/>