QUICK Ecke 33 von Harald Schönfeld Noch mehr Moirees Im lezten Teil wurde ein kleines Programm vorgestellt, das Moireemuster auf den Bildschirm zeichnet. Wie angekündigt wird dieses Programm nun erweitert, um etwas komplexere Muster zu erzeugen. Ränder sind nicht das Ende Während im alten Programm einfach die Linien wieder auf Startposition gesetzt wurden wenn sie den Rand erreicht haben, werden wir nun etwas anderes tun. Wenn ein Punkt (Anfang oder Ende) den Rand erreicht, so wird die zugehörige Geschwindigkeit des Punktes umgedreht. Erreicht also z.B. der Anfangspunkt den oberen oder unteren Rand, so wird dessen YV1 geschwindgkeit negiert, d.h. deren Vorzeichen getauscht. Vorzeichen? Naja, wir sind ja im UNSIGN Modus, also hat die Variable ja kein echtes Vorzeichen, aber wie immer kann man schon mit negativen Werten rechnen, man kann nur nicht negative Werte vergleichen. D.h. der Befehl SUB(0,YV1,YV1) dreht das 'Vorzeichen' der Variable um. Die Vergleiche Da wir nun müssen wissen ob und wenn ja welcher Rand überquert wurde (um den Punkt sofort auf den zugehörigen Rand zu setzen), müssen wir nun also getrennt nach oben , unten, links, rechts abfragen. Die Abfrage auf <0 (also oben oder links) wird so erledigt, daß wir auf >250 abfragen, denn das bedeutet ja im Endeffekt daß der Wert dann zwischen -4 und 0 liegt. Danach wird dann auf >159 und >191 abgefragt, was bedeutet, daß der Wert den rechten oder unteren Rand erreicht hat. Wie man sieht ist das etwas ungewöhnlich aber gar nicht so kompliziert. Es gibt aber einen Sonderfall zu beachten: Wenn einer der beiden Linien Endpunkte sch gar nicht bewegt, dann darf man nicht einfach den anderen umdrehen, sonst wird die Sache etwas langweilig, weil der andere ja immer noch steht. Deshalb wird, falls ein Punkt steht die Linie am Rand neu initialisiert. Außerdem wird auch so nach einigen Zyklen der Bilschirm gelöscht, die Linien neu gesetzt und auch die Farben werden immer wieder mal geändert. Erweiterungen Man könnte das Programm nun noch erweitern, indem man z.B. Tasten abfragt mit denen man dann Einfluß auf die Richtung der Linien nehmen kann. Dann sind der Phantasie keine Grenzen gesetzt. BYTE +( * Anfangspos., Geschwindigkeit X1,Y1,XV1,YV1 * Endpos., Geschwindigkeit X2,Y2,XV2,YV2 * temporaere Pos. X,Y * Farben C1 * Zufallszahlenregister RND=53770 +) MAIN * Grafik 15ohne Textfenster oeffnen CLOSE(6) OPEN(6,12,15,"S:") * Neue Farben SETCOL(0,8,6) SETCOL(1,14,14) SETCOL(2,3,8) * Variablen init .INIT REPEAT * Linie 1 zeichnen COLOR(C1) PLOT(X1,Y1) DRAW(X2,Y2) * vertikal gespiegelt SUB(159,X1,X) PLOT(X,Y1) SUB(159,X2,X) DRAW(X,Y2) * horizontal gespiegelt SUB(191,Y1,Y) PLOT(X1,Y) SUB(191,Y2,Y) DRAW(X2,Y) * hor + vert gespiegelt SUB(159,X1,X) SUB(191,Y1,Y) PLOT(X,Y) SUB(159,X2,X) SUB(191,Y2,Y) DRAW(X,Y) * Neue Positionen berechnen ADD(X1,XV1,X1) ADD(X2,XV2,X2) ADD(Y1,YV1,Y1) ADD(Y2,YV2,Y2) * Linker Rand? X-Geschw. umdrehen IF X1>250 .NEWCOL X1=0 SUB(0,XV1,XV1) IF X2=0 IF Y2=0 .INIT ENDIF ENDIF ENDIF * Linker Rand? X-Geschw. umdrehen IF X2>250 .NEWCOL X2=0 SUB(0,XV2,XV2) IF X1=0 IF Y1=0 .INIT ENDIF ENDIF ENDIF * rechter Rand? X-Geschw. umdrehen IF X1>159 .NEWCOL X1=159 SUB(0,XV1,XV1) IF X2=0 IF Y2=0 .INIT ENDIF ENDIF ENDIF * rechter Rand? X-Geschw. umdrehen IF X2>159 .NEWCOL X2=159 SUB(0,XV2,XV2) IF X1=0 IF Y1=0 .INIT ENDIF ENDIF ENDIF * Oberer Rand? Y-Geschw. umdrehen IF Y1>250 .NEWCOL Y1=0 SUB(0,YV1,YV1) IF X2=0 IF Y2=0 .INIT ENDIF ENDIF ENDIF * Oberer Rand? Y-Geschw. umdrehen IF Y2>250 .NEWCOL Y2=0 SUB(0,YV2,YV2) IF X1=0 IF Y1=0 .INIT ENDIF ENDIF ENDIF * Unterer Rand? Y-Geschw. umdrehen IF Y1>159 .NEWCOL Y1=159 SUB(0,YV1,YV1) IF X2=0 IF Y2=0 .INIT ENDIF ENDIF ENDIF * Unterer Rand? Y-Geschw. umdrehen IF Y2>159 .NEWCOL Y2=159 SUB(0,YV2,YV2) IF X1=0 IF Y1=0 .INIT ENDIF ENDIF ENDIF UNTIL 1=0 ENDMAIN PROC INIT BEGIN * Anfags- und Endpos der Linie X1=0 Y1=0 X2=79 Y2=0 * Zufaellge Geschwindigkeit der * Endpunkte AND(RND,3,XV1) AND(RND,3,YV1) AND(RND,3,XV2) AND(RND,3,YV2) * Nicht alle Geschwindigkeiten duerfen * Null sein IF XV1=0 IF XV2=0 XV1=1 ENDIF ENDIF IF YV1=0 IF YV2=0 YV1=1 ENDIF ENDIF .NEWCOL ENDPROC PROC NEWCOL BEGIN * Farbe bestimmen, aber nicht 0 AND(RND,3,C1) IF C1=0 C1=1 ENDIF * Hin und wieder Bildschirm loeschen * und neu beginnen IF RND<25 COLOR(125) PLOT(0,0) .INIT ENDIF ENDPROC