Wellenlinie rekursiv definiert

Vorbemerkung

Vor diesem Abschnitt sollten Sie zuerst die Einführung in die Rekursion lesen.

Ergebnis der swf-Datei

Die Funktion wird rekursiv definiert und bei jedem rekusiven Aufruf ändert sich die Linienfarbe und -stärke.

Das Prinzip der Rekusion

Wenn man zu den Eingabeparametern für die Gesamtkurve auch die Linienfarbe und -stärke dazunimmt, kann man bei jedem rekursiven Aufruf auch die Farbe und Strichstärke neu definieren und so für die Gesamtkurve den Effekt erreichen, der im einleitenden Ergebnis der swf-Datei zu sehen ist.

Der Programmcode ohne Erklärungen

Codeabschnitte, die sich nicht vom vorigen Arbeitsschritt unterscheiden, werden grau geschrieben.

// BÜHNENRECHTECK MIT FARBE FÜLLEN UND KONTURIEREN
fillStage(1, 0xFF0000, 0xCCCCFF);
//
// ZEICHNEN EINER WELLENLINIE
//
var point = new Array();
point.x = 0;
point.y = Stage.height/2;
curve(point, 45, 200, 1, 0xFF0000);
/*
DEKLARATION DER FUNKTIONEN
curve(), baseCurve() UND fillStage()
*/
function curve(pt:Array, a:Number, b:Number, lineWidth:Number, lineColor:Number):Void {
   this.lineStyle(lineWidth, lineColor);
   this.moveTo(pt.x, pt.y);
   pt = baseCurve(pt, a, b);
   if (0<=pt.x && pt.x<Stage.width && 0<=pt.y && pt.y<Stage.height) {
      curve(pt, a, b, lineWidth+0.5, lineColor+0x000F00);
   }
}
function baseCurve(pt:Array, a:Number, b:Number):Array {
   this.curveTo(pt.x+a/4, pt.y-b/2, pt.x+a/2, pt.y);
   this.curveTo(pt.x+3*a/4, pt.y+b/2, pt.x+a, pt.y);
   pt.x = pt.x+a;
   return pt;
}
function fillStage(lineWidth:Number, lineColor:Number, fillColor:Number):Void {
   this.lineStyle(lineWidth, lineColor);
   this.beginFill(fillColor);
   this.moveTo(0, 0);
   this.lineTo(Stage.width-1, 0);
   this.lineTo(Stage.width-1, Stage.height-1);
   this.lineTo(0, Stage.height-1);
   this.lineTo(0, 0);
   this.endFill();
}

 

Der Programmcode mit Erklärungen

Rekursive Deklaration der Funktion curve

function curve(pt:Array, a:Number, b:Number, lineWidth:Number, lineColor:Number):Void {
   this.lineStyle(lineWidth, lineColor);
   this.moveTo(pt.x, pt.y);
   pt = baseCurve(pt, a, b);
   if (0<=pt.x && pt.x<Stage.width && 0<=pt.y && pt.y<Stage.height) {
      curve(pt, a, b, lineWidth+0.5, lineColor+0x000F00);
   }
}

Eingabeparamter von der Funktion curve sind der Ausgangspunkt pt, Breite a und Höhe b der Basiskurve, sowie die Anfangsstrichstärke lineWidth und -farbe lineColor.

Zuerst wird der Linienstil festgelegt und der Zeichenstift beim Ausgangspunkt positioniert.
Anschließend wird durch den Aufruf der Funktion baseCurve die Basiskurve mit Breite a und Höhe b gezeichnet. Die Funktion gibt den Endpunkt zurück, der wieder unter pt abgespeichert wird.

Wenn der Endpunkt der Basiskurve innerhalb der Bühne liegt, wird rekursiv die Funktion curve mit neuen Eingabewerten aufgerufen:

  • Neuer Ausgangspunkt pt ist der Endpunkt der vorhergehenden Basiskurve.
  • Die Breite a und Höhe b der nächsten Basiskurve bleiben unverändert.
  • Mit lineWidth+0.5 wird die Linienstärke um 0.5 Pixel erhöht. D.h. bei jedem zweiten rekursiven Aufruf wird die Linie um ein Pixel dicker.
  • Mit lineColor+0x000F00 wird der Grünanteil schrittweise erhöht und damit die Linienfarbe von Rot in Richtung Gelb verändert.
    Die mittleren Hexadezimalziffern 0F in 0x000F00 beschreiben den Grünanteil der RGB-Farbe.

Variationen des rekursiven Aufrufs

Durch die Form des rekursiven Aufrufs lassen sich sehr elegant die Kurven variieren.
Man könnte z.B. durch Vergrößern von a die Wellenlinie schrittweise dehnen und durch Verkleinern von b die Amplitude schrittweise dämpfen.

Man muss allerdings darauf achten, keine unendliche Rekursion wie in dem nachfolgenden Beispiel zu produzieren :

Hier wird die Breite a der Basiskurve in jedem rekursiven Aufruf um 10% verkleinert. Das führt dazu, dass die Basiskurven immer enger werden und die Bühne nie verlassen. Dadurch wird das Abbruchskriterium (außerhalb der Bühne zu liegen) nie erfüllt und es kommt zu einer unendlichen Rekursion. Man müsste in diesem Fall einen unteren Grenzwert für a als zusätzliches Abbruchskriterium einführen.

Wie die obige Fehlermeldung zeigt, erlaubt Flash nur 256 Rekursionsstufen und bricht das Programm ab.