PAINT (BASIC 3.5)

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Begriffsklärung Der Titel dieses Artikels ist mehrdeutig. PAINT (Begriffsklärung).
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