PAINT (BASIC 3.5)
PAINT (BASIC 3.5) | |
Syntax: | PAINT [<Farbquelle>], <Ausgangskoordinaten> [,<Modus>] |
Parameter | |
<Farbquelle>: numerischer Ausdruck im Wertebereich von 0 bis 1 (Hires-Grafik) bzw. 0 bis 3 (Multicolor-Grafik) | |
<Ausgangskoordinaten>: [+|-]<X>,[+|-]<Y> | <Strecke>;<Winkel> | |
<Modus>: numerischer Ausdruck im Wertebereich 0 bis 1 | |
Einordnung | |
Typ: | Anweisung |
Kontext: | Grafik-Anweisung |
Aufgabe: | Ausmalen von Bildschirmbereichen |
Abkürzung: | pA |
Token: | $df (223) |
Verwandte Befehle | |
BOX, CIRCLE, DRAW |
Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl PAINT ab Commodore BASIC V3.5 oder höher.
Die Anweisung PAINT (engl.: anmalen) dient zum Ausmalen von Bildschirmbereichen in einem der Grafikmodi für hochauflösende oder Multicolor-Grafiken.
PAINT hat folgende Parameter:
- Farbquelle: Definiert die Farbe, in der ausgemalt wird. Die möglichen Werte sind abhängig vom Grafikmodus (vgl. COLOR). Die Angabe ist optional, Standard ist die Vordergrundfarbe (=1), ein Wert von 0 entspricht der Hintergrundfarbe, was einem Löschen entspricht. Ein Komma muss zwingend vor einer folgenden Positionsangabe gesetzt werden.
- Ausgangskoordinaten: Die Koordinaten, bei denen mit dem Ausmalen begonnen wird. Kartesische Koordinaten werden in der Form X,Y angegeben, Vektor-Parameter dagegen in der Form Streckenlänge;Winkel. Die Winkelangabe erfolgt in Grad im Uhrzeigersinn, wobei 0 Grad senkrecht nach oben gerichtet ist. Für relative Positionsangaben mit Variablen müssen diese in Klammern geschrieben werden. Kartesische Koordinaten und die Streckenlänge dürfen im Bereich von -65535 bis +65535 liegen, eine Winkelangabe muss im Bereich von 0 bis +65535 liegen. Andere Werte verursachen die Fehlermeldung ?ILLEGAL QUANTITY ERROR. Der Parameter ist optional, ohne Angabe wird die Position des Pixelcursors verwendet.
- Modus: Ein optionaler Parameter, der festlegt, wann PAINT stoppt: Bei 0 (Vorgabe) stoppt PAINT, wenn ein Rand mit der Ausmalfarbe erreicht wird, bei 1 wird jede Farbquelle ungleich 0 als Rand interpretiert. Andere Werte lösen einen ?ILLEGAL QUANTITY ERROR aus.
Sind die notwendigen Parameter nicht vorhanden oder zu viele angegeben, wird mit der Meldung ?SYNTAX ERROR abgebrochen.
Anmerkungen:
- PAINT kann durch Drücken von RUN/STOP unterbrochen werden.
- Nach vollendeter Ausführung von PAINT befindet sich der Pixelcursor an der Position der Ausgangs-Koordinaten. Wird PAINT hingegen durch RUN/STOP abgebrochen, befindet sich der Pixelcursor an der Position des zuletzt gesetzten Pixels.
Implementierungsdetails[Bearbeiten | Quelltext bearbeiten]
Der PAINT-Algorithmus ist so gestaltet, dass auch komplexe Formen ausgefüllt werden, was zu einer Teilung des Füllweges führen kann (z.B. wenn es vertikal und gleichzeitig horizontal weiter gehen könnte). Positionen, die bedingt durch diese Teilung erst später beschritten werden, legt PAINT im freien Variablenbereich ab (eine Position verbraucht dabei 4 Bytes). Dieser Pixelpositionenstapel wächst in Richtung steigende Adressen, auf den nach "unten" wachsenden String-Heap zu. Um so möglichst günstige Platzverhältnisse zu schaffen, wird zu Beginn auch automatisch die Garbage Collection aufgerufen. Falls dennoch kein Platz mehr für das Ablegen einer neuen Pixelposition vorhanden sein sollte, bricht PAINT mit ?OUT OF MEMORY ERROR ab. Siehe Kamm-Beispiel.
Beispiele[Bearbeiten | Quelltext bearbeiten]
Kreisbeispiel[Bearbeiten | Quelltext bearbeiten]
10 GRAPHIC 3,1 20 CIRCLE 1,79,99,20 30 PAINT 2,79,99,1
Zeichnet im Multicolormodus in der Bildschirmmitte einen Kreis in der Vordergrundfarbe und füllt ihn mit der Multicolorfarbe 1 aus. Wichtig ist der Ausmalmodus 1, im Standardmodus 0 würde der komplette Bildschirm ausgemalt.
Simons' Basic Beispiel[Bearbeiten | Quelltext bearbeiten]
10 GRAPHIC 1,1 20 FOR I=1 TO 70 30 X=290*RND(1):Y=180*RND(1) 40 BOX 1,X,Y,X+29,Y+19 50 BOX 0,X+1,Y+1,X+28,Y+18,,1 60 NEXT 70 PAINT 1,0,0
Dieses Beispiel wurde aus dem Artikel zum Simons Basic-Befehl PAINT übernommen und an BASIC 3.5 angepasst.
Kammbeispiel[Bearbeiten | Quelltext bearbeiten]
100 TRAP 200 110 GRAPHIC 1,1 120 DIM A(12700) : REM VARIABLENPLATZ KUENSTLICH VERKLEINERN 130 FOR X=10 TO 60 STEP 15 : REM 4 KAEMME ... 140 FOR Y=0 TO 199 STEP 2 : REM EINEN KAMM ZEICHNEN 150 DRAW 1, X,Y TO X+10,Y 160 NEXT 170 DRAW 1, X+10,0 TO X+10,198 : REM DAZU DEN KAMMRUECKEN ... 180 NEXT 190 PAINT 1,0,0 : REM AUSMALEN 200 GETKEY K$: REM FEHLERROUTINE UND ENDE 210 GRAPHIC 0 220 PRINT ER, ERR$(ER)
Erst werden 4 vertikale Kämme gezeichnet (der Start kann etwas dauern, da erst ein riesiges Array angelegt wird, was seine Zeit braucht). Da der PAINT-Algorithmus vertikal arbeitet (bevorzugte Ausbreitungsrichtung), werden alle seitlichen Ausbreitungswege auf den Pixelpositionenstapel gelegt.
Am Ende bzw. beim Fehler geht es weiter mit einer beliebigen Taste, wobei wieder in den Textmodus zurück geschaltet wird. Dort ersichtlich wird die Ursache
16 OUT OF MEMORY |
AUTO | BACKUP | BOX | CHAR | CIRCLE | COLLECT | COLOR | COPY | DEC | DELETE | DIRECTORY | DLOAD | DO | DRAW | DS | DS$ | DSAVE | EL | ELSE | ER | ERR$ | EXIT | GETKEY | GRAPHIC | GSHAPE | HEADER | HELP | HEX$ | INSTR | JOY | KEY | LOCATE | LOOP | MONITOR | PAINT | PRINT USING | PUDEF | RCLR | RDOT | RENAME | RENUMBER | RESUME | RGR | RLUM | SCALE | SCNCLR | SCRATCH | SOUND | SSHAPE | TRAP | TROFF | TRON | UNTIL | VOL | WHILE