2.8 Grafik
2.8.3 Linien, Punkte und Figuren 2.8.4 Die Systemvariable "graphic": Mixmodes und mehr ^2.8.1 Das KoordinatensystemAlle Grafikausgaben erfolgen in R-BASIC auf das aktuell eingestellte Screen-Objekt. R-BASIC verwendet das originale PC/GEOS Koordinatensystem zur Grafikausgabe. Dabei hat der Punkt links oben die Koordinaten ( 0; 0 ).
MaxX, MaxYMaxX und MaxY sind globale Variablen, welche die größte verfügbare x- bzw. y-Koordinate des aktuellen Screen-Objekts enthalten. Wenn Sie zum Beispiel ein BitmapContent-Objekt der Größe 640x400 Pixel als aktuellen Screen haben, so gilt MaxX = 639 und MaxY = 399.Beispiel: |
Rectangle 0, 0, MaxX, MaxY |
|
Die Werte für MaxX und MaxY vom aktuell eingestellten Screen-Objekt ab. Eventuelle Besonderheiten sind bei den entsprechenden Objekten beschrieben.
Sie haben die Möglichkeit das Koordinatensystem Ihren Wünschen anzupassen. Dazu gehört zum Beispiel, dass Sie die Lage des Koordinatenursprungs und die Skalierung der Achsen ändern können (Befehle ScreenSetTranslation und ScreenSetScale). Eine komplette Liste der Möglichkeiten finden Sie im Objekthandbuch im Kapitel 2.3.4 (Anpassen des Koordinatensystems) und für Fortgeschrittene im Kapitel 2.3.5 (Komplexe Manipulation des Koordinatensystems). Weitere Hinweise:
^2.8.2 FarbenComputer beschreiben Farben durch eine Zahl. Häufig wird dabei der Rot-, der Grün- und der Blauanteil einer Farbe durch jeweils eine Zahl im Bereich von 0 (Anteil nicht vorhanden) bis 255 (Anteil mit maximaler Intensität vorhanden) beschrieben. Für diese sogenannten RGB-Farben werden 3 Byte benötigt und es ergeben sich 256 * 256 * 256 = 16.777.216 möglich Farben.Ein anderer häufiger Fall ist, dass nur 1 Byte verwenden will, um eine Farbe zu beschreiben. Dann wird eine sogenannte Palette verwendet. Die Palette ist eine Liste von bis zu 256 Einträgen zu je drei Byte - jeweils eins für Rot, Grün und Blau. Der "Farbwert" entspricht dann der Nummer (dem sogenannten Index) des Eintrag in der Liste. Deshalb werden diese Farben auch als Index-Farben bezeichnet. Die Zählung beginnt dabei immer mit Null. Wenn keine eigene Palette vereinbart verwendet GEOS eine Standard-Palette. R-BASIC unterstützt beide Möglichkeiten, die Verwendung von Indexfarben und die Verwendung von RGB-Farben. Die folgende Tabelle gibt einen Überblick über die Befehle zur Farbverwaltung
(1) Eine weitergehende Kontrolle über die verwendeten Farben, Füllmuster, Linienstile usw. haben Sie, wenn Sie die Systemvariable graphic, die im Kapitel 2.8.4 beschrieben ist, direkt verändern Beschreibung von Farben in R-BASICJeder Farbwert wird durch einen 32 Bit (dword) Wert beschrieben. Das kann entweder ein Farb-Index aus der GEOS-System-Palette sein (Wertebereich 0 bis 255) oder es ist ein RGB-Wert. Der numerischer Wert liegt dann oberhalb von 16.777.215 (hexadezimal größer als &hFFFFFF). Diese Werte sind so gewählt, dass die Farbbefehle selbständig entscheiden können, ob es sich um eine Indexfarbe, eine RGB-Farbe oder einen Spezialfall handelt. Verwenden Sie die unten beschriebene Funktion RGB(), um einen RGB-Farbwert zu konstruieren.Interne DetailsZur Unterscheidung zwischen RGB- oder Index-Wert wird das höherwertige Byte des dword benutzt. Erlaubte Werte sind 0 oder 1, andere Werte können zu unerwarteten Ergebnissen führen. Um Texte oder Blockgrafikzeichen mit transparentem Hintergrund auszugeben wird für die Hintergrundfarbe der Spezialwert BG_TRANSPARENT (=4096) eingestellt.
FarbkonstantenFür die ersten 16 Werte der GEOS-Farbpalette existieren symbolische Namen. In vielen Fällen kann dadurch die Lesbarkeit des Programms verbessert werden. Es handelt sich einfach um die englischen Bezeichnungen der Farben.
Info: Die hellen Farbwerte ergeben sich, indem man zum dunkleren Farbwert 8 addiert.
COLORCOLOR (Farbe) stellt die Farben für Vordergrund und Hintergrund ein. Die Vordergrundfarbe wird für Texte, Linien, Punkte und Flächen verwendet.Syntax: COLOR v, h v: neue Vordergrundfarbe h: neue Hintergrundfarbe Beispiele: |
COLOR 7,0 ' Hellgrau auf Schwarz COLOR LIGHT_GRAY,BLACK ' Hellgrau auf Schwarz COLOR 192, 204 |
Hinweis: Um Texte oder Blockgrafik-Zeichen transparent auszugeben (d.h. der Hintergrund wird nicht gelöscht) verwenden Sie als Hintergrundfarbe den Wert BG_TRANSPARENT (=4096).
INKINK (Tinte) stellt die Farben für den Vordergrund ein.Syntax: INK v v: neue Vordergrundfarbe Beispiel: |
INK GREEN ' Grün, identisch mit INK 2 |
PAPERPAPER (Papier) stellt die Farbe für den Hintergrund ein.Syntax: PAPER h h: neue Hintergrundfarbe Beispiel: |
PAPER 4 ' rot |
Hinweis: Um Texte oder Blockgrafik-Zeichen transparent auszugeben (d.h. der Hintergrund wird nicht gelöscht) verwenden Sie als Hintergrundfarbe den Wert BG_TRANSPARENT (=4096).
RGBDie Funktion RGB() wandelt die Farbanteile rot, grün und blau in einen R-BASIC Farbwert um.Syntax: <numVar> = RGB( r, g, b) r: Rotanteil, 0 .. 255 g: Grünanteil, 0 .. 255 b: Blauanteil, 0 .. 255 Beispiele: |
PAPER RGB ( 50, 50, 255 ) LINE 200, 300, 180, 70, RGB ( 50, 50, 255 ) |
' Belegung eines Feldes der graphic-System-Variablen graphic.textColor = RGB ( 200, 100, 100 ) |
Anmerkung: Die Funktion RGB() verwendet folgende Formel um den Farbwert zu berechnen:
RedOf, GreenOf, BlueOfDiese Funktionen berechnen den Rot-, Grün- bzw. Blau-Anteil eines R-BASIC Farbwertes. Der Farbwert kann ein RGB-Wert oder ein Index-Wert sein.Syntax: r = RedOf( farbe ) g = GreenOf( farbe ) b = BlueOf( farbe ) farbe: Farbwert (RGB-Wert oder Index) r, g, b: numerische Variablen, die den entsprechenden Wert aufnehmen Beispiele: Die Systemvariable graphic ist im Kapitel 2.8.4 beschrieben. |
r = RedOf( graphic.lineColor ) g = GreenOf( graphic.areaColor ) b = BlueOf( C_YELLOW ) |
GrayOfDiese Funktion berechnet den Grauwert (d.h. die Helligkeit) zu einer Farbe. Das unterschiedliche Helligkeitsempfinden des Auges für den Rot-, Grün- und Blau-Anteil wird berücksichtigt. Der Farbwert kann ein RGB-Wert oder ein Index-Wert sein.Syntax: <numVar> = GrayOf( farbe ) farbe: Farbwert (RGB-Wert oder Index) Beispiele: |
h = GrayOf( graphic.textColor ) h = GrayOf( PGet ( x, y) ) h = GrayOf( C_YELLOW ) |
^2.8.3 Linien, Punkte und FigurenDie folgende Tabelle gibt eine Übersicht über die in R-BASIC verfügbaren Grafikbefehle Linien, Punkten und Figuren.
CLSCLS (Clear Screen) löscht den Bildschirm mit der aktuellen Hintergrundfarbe.Syntax: CLS LINEDer Befehl LINE (Linie) zeichnet eine Line auf dem Schirm. Standardmäßig wird die aktuelle Vordergrundfarbe verwendet. Wird der Parameter f angegeben, so wird diese Farbe verwendet.Syntax: LINE x0, y0, x1, y1 [, f ] x0, y0: Startpunkt der Linie x1, y1: Endpunkt der Linie f: Linienfarbe (optional, Indexfarbe oder RGB-Farbe) Beispiel: |
LINE 0, 0, 100, 200, 15 ' zeichnet eine weiße Linie |
PSetDer Befehl PSet (Point Set = Punkt Setzen) setzt einen Punkt auf dem Schirm. Standardmäßig wird die aktuelle Vordergrundfarbe verwendet. Wird der Parameter f angegeben, so wird diese Farbe verwendet.Syntax: PSet x, y [, f ] x, y: Koordinaten des Punktes f: Punktfarbe (optional, Indexfarbe oder RGB-Farbe) Beispiel: |
PSet 19, 200, 12 ' setzt einen roten Punkt |
PResetDer Befehl PReset (Point Reset = Punkt Zurücksetzen) löscht einen Punkt auf dem Schirm, d.h. der Punkt wird mit der Hintergrundfarbe belegt.Syntax: PReset x, y x, y: Koordinaten des Punktes Beispiel: |
PReset 19, 200 |
PGetDie Funktion PGet (Point Get = Punkt holen) liefert den Farbcode des Bildpunktes an den gegebenen Koordinaten.Syntax: <numVar> = PGet ( x, y ) x, y: Koordinaten des Punktes Beispiel: |
DIM f f = PGet ( 20, 100 ) |
CIRCLEDer Befehl CIRCLE (Kreis) zeichnet einen ungefüllten Kreis auf dem Schirm. Für einen gefüllten Kreis verwenden Sie den Befehl FillEllipse.Syntax: CIRCLE x0, y0, r [, f ] x0, y0: Koordinaten des Mittelpunkts r: Radius des Kreises f: Linienfarbe (optional, Indexfarbe oder RGB-Farbe) Beispiel: |
CIRCLE 100, 200, 50 |
ELLIPSEDer Befehl ELLIPSE zeichnet eine ungefüllte Ellipse auf dem Schirm.
Beispiel: |
ELLIPSE 0, 0, 200, 50, BLUE 'eine blaue, längliche Ellipse |
RECTANGLEDer Befehl RECTANGLE (Rechteck) zeichnet ein ungefülltes Rechteck auf dem Schirm.Syntax: RECTANGLE x0, y0, x1, y1 [, f ] x0, y0: eine Ecke (z.B. links unten) x1, y1: gegenüberliegende Ecke f: Linienfarbe (optional, Indexfarbe oder RGB-Farbe) Beispiel:
|
RECTANGLE 100, 100, 200, 200, WHITE ' ein weißes Quadrat |
FillEllipseDer Befehl FillEllipse (Fülle Ellipse) zeichnet eine gefüllte Ellipse auf dem Schirm.
Beispiel: |
ELLIPSE 0, 0, 200, 50, BLACK ' eine schwarze Ellipse |
FillRectDer Befehl FillRect (Fülle Rechteck) zeichnet ein gefülltes Rechteck auf dem Schirm.Syntax: FillRect x0, y0, x1, y1 [, f ] x0, y0: eine Ecke (z.B. links unten) x1, y1: gegenüberliegende Ecke f: Flächenfarbe (optional, Indexfarbe oder RGB-Farbe) Beispiel: |
FillRect 100, 100, 200, 200, YELLOW ' ein gelbes Quadrat |
PointListDie Struktur PointList enthält eine Liste von Punkten um Polygone verbundene Linien und Splines und zu zeichnen. |
STRUCT PointList numPoints as INTEGER xOffset, yOffset as INTEGER x(31) as INTEGER y(31) as INTEGER End Struct |
|
PolyLinePolyLine zeichnet einen offenen Linienzug aus mehreren Geraden in der aktuellen Vordergrundfarbe.Syntax: PolyLine <pl> <pl>: Variable oder Ausdruck vom Typ PointList Erläuterungen zur Struktur <pl>
|
LINE p.x(0)+x0, p.y(0)+y0, p.x(1)+x0, p.y(1)+y0 LINE p.x(1)+x0, p.y(1)+y0, p.x(2)+x0, p.y(2)+y0 LINE p.x(2)+x0, p.y(2)+y0, p.x(3)+x0, p.y(3)+y0 ... usw |
| Das folgende Beispiel zeichnet eine PolyLine mit 3 Punkten. |
Dim p as PointList p.x(0) = 10 : p.y(0) = 10 p.x(1) = 100 : p.y(1) = 20 p.x(0) = 30 : p.y(0) = 50 p.numPoints = 3 PolyLine p |
|
Dieser sehr einfache Fall entspricht den folgenden BASIC Befehlen: |
LINE 10, 10, 100, 20 LINE 100, 20, 30, 50 |
Ein weiteres Beispiel finden Sie in der Datei: R-BASIC\Beispiele\Grafik\Polygon Demo
PolygonPolygon zeichnet einen geschlossenen Linienzug aus mehreren Geraden in der aktuellen Vordergrundfarbe.Syntax: Polygon <pl> <pl>: Variable oder Ausdruck vom Typ PointList Erläuterungen zur Struktur <pl>: Siehe PolyLine. Für ein Beispiel siehe Datei: R-BASIC\Beispiele\Grafik\Polygon Demo FillPolygonFillPolygon zeichnet einen gefüllten, geschlossenen Linienzug aus mehreren Geraden in der aktuellen Vordergrundfarbe.Syntax: FillPolygon <pl> <pl>:Variable oder Ausdruck vom Typ PointList Erläuterungen zur Struktur <pl>: Siehe PolyLine Für ein Beispiel siehe Datei: R-BASIC\Beispiele\Grafik\Polygon Demo SplineSpline zeichnet einen glatten Linienzug durch die gegebenen Punkte in der aktuellen Vordergrundfarbe.Syntax: Spline <pl> <pl>: Variable oder Ausdruck vom Typ PointList Erläuterungen zur Struktur <pl>: Siehe PolyLine Für ein Beispiel siehe Datei: R-BASIC\Beispiele\Grafik\Polygon Demo ClosedSplineClosedSpline zeichnet einen geschlossenen glatten Linienzug durch die gegebenen Punkte in der aktuellen Vordergrundfarbe.Syntax: ClosedSpline <pl> <pl>: Variable oder Ausdruck vom Typ PointList Erläuterungen zur Struktur <pl>: Siehe PolyLine Für ein Beispiel siehe Datei: R-BASIC\Beispiele\Grafik\Polygon Demo BezierSplineAchtung! BezierSpline ist eine Anweisung für fortgeschrittene Programmierer!Syntax: BezierSpline <pl> <pl>: Variable oder Ausdruck vom Typ PointList BezierSpline zeichnet einen Linienzug durch die gegebenen Punkte in der aktuellen Vordergrundfarbe, wobei die einzelnen Segmente durch ihren Anfangs- und Endpunkt sowie durch 2 Kontrollpunkte beschrieben werden. In den folgenden Bildern sind die Kurvenpunkte durch Vierecke, die Kontrollpunkte durch graue Kreise markiert. Beide dienen der Illustration, sie werden nicht mit gezeichnet. Ein einzelnes Kurvensegment, bestehend aus 2 Kurvenpunkten und 2 Kontrollpunkten. Für diese Figur müssen 4 Punkt an BezierSpline übergeben werden.
Zwei Kurvensegmente und die dazugehörigen Kontrollpunkte. Für diese Figur müssen 7 Punkte an BezierSpline übergeben werden. Die an BezierSpline übergebende PointList Struktur muss die Koordinaten der Punkte in folgender Reihenfolge enthalten:
Das Feld numPoints enthält die Gesamtzahl der übergebenen Punkte. Diese Zahl muss der Beziehung 3*n+1 entsprechen, wobei n die Anzahl der Kurvensegmente ist. Die Anzahl der Punkte auf der Kurve ist damit n+1. Hinweise:
^ |