Wiederholung der Basiskurve mit einer do-while-Schleife

Ergebnis der swf-Datei

Die Wiederholungen der Basiskurve werden über eine do-while-Schleife gesteuert.

Wiederholung der Basiskurve

Im letzten Arbeitsschritt wurde die Basiskurve mittels einer for-Schleife sechsmal aneinandergereiht.

for (var i:Number = 0; i<6; i++) {
   point = baseCurve(pt, w, h);
}

Im letzten Arbeitsschritt endet die Gesamtkurve auf Grund der gewählten Parameterwerte innerhalb der Bühne.
Unser Ziel ist es jedoch, die Kurve über die ganze Bühnenbreite zu zeichnen.

In einer for-(Zähl-)Schleife sind in der Regel das Wiederholungskriterium und damit die Anzahl der Wiederholungen bereits vor Beginn der Abarbeitung der Schleife fixiert.
Wenn man die Breite der Basiskurve parametrisiert, müsste man daher bei einer for-Schleife die Anzahl der Wiederholungen relativ zum Breitenparameter vorher ausrechnen und diesen Wert in das Wiederholungskriterium einfügen:
w ist im nachfolgenden Codeabschnitt die Breite der Basiskurve und count die Anzahl der Wiederholungen.
Die Funktion Math.ceil(x) berechnet die größte ganze Zahl größer oder gleich x .

var count:Number = Math.ceil(Stage.width/w);
for (var i:Number = 0; i<count; i++) {
   point = baseCurve(point, w, h);
}

Eleganter ist es jedoch, nicht die Anzahl der Wiederholungen vorher zu berechnen, sondern den Abbruch der Schleife durch das eigentliche Wiederholungskriterium zu beschreiben:
Der Anweisungsblock der Schleife wird wiederholt, wenn der Endpunkt der zuletzt gezeichneten Basiskurve innerhalb der Bühne liegt. Das lässt sich mit einer do-while-Schleife realisieren.

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
*/
this.lineStyle(2, 0xFF0000);
var m:Number = Stage.height/2;
var point = new Array();
point.x = 0;
point.y = m;
this.moveTo(point.x, point.y);
var w:Number =
70;
var h:Number =
400;
do {
   point = baseCurve(point, w, h);
} while (0<=point.x && point.x<Stage.width && 0<=point.y && point.y<Stage.height);
/*
DEKLARATION DER FUNKTIONEN baseCurve() UND fillStage()
*/
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

Wiederholungskriterium und logisches UND

Der Endpunkt der zuletzt gezeichneten Basiskurve, der gleichzeitig der Startpunkt der nächsten Basiskurve ist, muss innerhalb der Bühne liegen.
Innerhalb der Bühne liegen heißt, daß

die x-Koordinate des Punktes größer oder gleich 0 UND kleiner als die Bühnenbreite ist UND
die y-Koordinate des Punktes größer oder gleich 0 UND kleiner als die Bühnenhöhe ist .

Es müssen also vier Bedingungen gleichzeitig erfüllt sein, damit der Punkt, dessen x- und y-Koordinaten im Array point abgespeichert werden, innerhalb der Bühne liegt.
D.h. die Einzelbedingungen werden über das logische UND && verknüpft: Die Gesamtbedingung ist wahr, wenn alle Teilbedingungen erfüllt sind.

0<=point.x && point.x<Stage.width && 0<=point.y && point.y<Stage.height

do-while-Schleife

do {
   point = baseCurve(point, w, h);
} while (0<=point.x && point.x<Stage.width && 0<=point.y && point.y<Stage.height);

Das Zeichnen der Basiskurve wird wiederholt, solange das Wiederholungskriterium erfüllt ist.

Man erkennt, dass die Kurve nicht mehr fortgesetzt wird, sobald der Endpunkt außerhalb der Bühne liegt.

while-Schleife

Im Fall der do-while-Schleife wird die Basiskurve auf jeden Fall einmal gezeichnet, auch wenn der Startpunkt außerhalb der Bühne liegt.
Wenn man das nicht möchte, muß man eine while-Schleife verwenden:

while (0<=point.x && point.x<Stage.width && 0<=point.y && point.y<Stage.height){
   point = baseCurve(point, w, h);
}