10000) ){ $bereich=400; } } else { $bereich=400; } # kubische Kurve, Wurzel aus dem Quadrat der Ableitungen function kubisch ($u,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3) { $u1=1-$u; $u2=$u1*$u1; $u3=$u1*$u2; $u4=$u*$u; $u5=$u4*$u; $u6=$u2*3*$u; $u7=$u4*3*$u1; # x- und y-Komponenten der Ableitungen $cx=-3*$u2*$x0+3*(1-4*$u+3*$u4)*$x1+3*(2*$u-3*$u4)*$x2+3*$u4*$x3; $cy=-3*$u2*$y0+3*(1-4*$u+3*$u4)*$y1+3*(2*$u-3*$u4)*$y2+3*$u4*$y3; $cc=sqrt($cx*$cx+$cy*$cy); return $cc; } # Integral berechnen - man beachte, wenn # x0 und y0 auf 0 gesetzt werden, kann auch # ein Integral fuer relative Kommandos c bestimmt werden. function integral ($n,$f,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3) { if ($f>1) { $f=1; } if ($f<=0) { return 0; } else { # Randpunkte aufsummieren $rand=kubisch (0,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3) + kubisch ($f,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3); # gucken, dass Anfangsstuetzstellenzahl nicht zu klein ist: $n=max(10,$n); # schlecht geschaetzte Weglaenge: $sumse=0; do { # Schrittweite $s=$f/(2*$n); # Summe gerade und ungerade Stuetzstellen $sg=0; $su=0; for ($i = 1; $i < $n; $i++) { $ug=$i*$f/$n; $sg=kubisch ($ug,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3)+$sg; } for ($i = 1; $i <= $n; $i++) { $uu=(2*$i-1)*$s; $su=kubisch ($uu,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3)+$su; } # Integral ausrechnen $sum= ($rand+4*$su+2*$sg)*$s/3; # Differenz zur vorherigen Schaetzung $sumd=abs($sumse-$sum); $sumse=$sum; # Wenn klein genug, dann aussteigen, sonst weiter mit verdoppelter Stuetzstellenzahl $n=$n*2; } while ($sumd<1e-10); return $sum; } } # kubischen Pfad zufaellig waehlen $x0=mt_rand(-$bereich,$bereich); $y0=mt_rand(-$bereich,$bereich); $x1=mt_rand(-$bereich,$bereich); $y1=mt_rand(-$bereich,$bereich); $x2=mt_rand(-$bereich,$bereich); $y2=mt_rand(-$bereich,$bereich); $x3=mt_rand(-$bereich,$bereich); $y3=mt_rand(-$bereich,$bereich); # grosse viewBox automatisch bestimmen $maxx=max($x0,$x1,$x2,$x3); $minx=min($x0,$x1,$x2,$x3); $maxy=max($y0,$y1,$y2,$y3); $miny=min($y0,$y1,$y2,$y3); $vbx=$minx-15; $vby=$miny-15; $vbw=$maxx-$minx+30; $vbh=$maxy-$miny+30; # Integral ueber gesamte Weglaenge: $int= integral (10,1,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3); $intc= ceil(1000*$int)/1000; # So sieht der Pfad aus $pfad="M$x0,$y0 C$x1,$y1,$x2,$y2,$x3,$y3"; # cx(u) und cy(u) fuer den Punkt u berechnen $u1=1-$u; $u2=$u1*$u1; $u3=$u1*$u2; $u4=$u*$u; $u5=$u4*$u; $u6=$u2*3*$u; $u7=$u4*3*$u1; $cx=$u3*$x0+$u6*$x1+$u7*$x2+$u5*$x3; $cy=$u3*$y0+$u6*$y1+$u7*$y2+$u5*$y3; # und nun geht es los... # header senden: $content="Content-type: image/svg+xml"; header($content); echo ''; ?> " xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="tiny" xmlns:xlink="http://www.w3.org/1999/xlink"> Kubische Kurve malen Eine kubische Kurve wird vorwärts und rückwärts gemalt. Der GET-Parameter 'bereich' bestimmt den Bereich, in dem die Kurve zufällig gewählt wird. Die zu untersuchende Kurve. Kurvenlänge: Kontrollpunkt 1 Kontrollpunkt 2 " pathLength=""> Gemalter Kurventeil, Animation von stroke-dasharray " fill="freeze" calcMode="spline" keySplines="0.5 0 0 0.5" /> " stroke-dashoffset="" pathLength=""> Gemalter Kurventeil, Animation von stroke-dasharray " fill="freeze" calcMode="spline" keySplines="0.5 0 0 0.5" /> " stroke-dashoffset="" pathLength=""> Gemalter Kurventeil, Animation von stroke-dashoffset " fill="freeze" calcMode="spline" keySplines="0.5 0 0 0.5" /> " stroke-dashoffset="0" pathLength=""> Gemalter Kurventeil, Animation von stroke-dashoffset " fill="freeze" calcMode="spline" keySplines="0.5 0 0 0.5" /> Kurvenanfangspunkt Kurvenendpunkt