2.8 Grafik

^

2.8.1 Das Koordinatensystem

Alle 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, MaxY

MaxX 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:

  • Einen kompletten Überblick über die in R-BASIC verfügbaren Möglichkeiten zur Grafikausgabe finden Sie im Objekt Handbuch, Kapitel 2.2.2 (Konzepte zur Grafikausgabe).

  • Im Kapitel 2.2.1 (Objekte zur Grafikausgabe) finden Sie eine Liste aller Objekte, die als Screen arbeiten können, sowie die dazugehörigen Besonderheiten.

^

2.8.2 Farben

Computer 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-BASIC

Jeder 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 Details

Zur 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.

Farbkonstanten

Fü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.

COLOR

COLOR (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).

INK

INK (Tinte) stellt die Farben für den Vordergrund ein.
Syntax: INK v

v: neue Vordergrundfarbe


Beispiel:
INK GREEN  ' Grün, identisch mit INK 2


PAPER

PAPER (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).

RGB

Die 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:
    farbe = r + 256 * g + 65536 * b + 16777216
bzw. gleichwertig hexadezimal
    farbe = r + &h100 * g + &h10000 * b + &h1000000

RedOf, GreenOf, BlueOf

Diese 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 )


GrayOf

Diese 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 Figuren

Die folgende Tabelle gibt eine Übersicht über die in R-BASIC verfügbaren Grafikbefehle Linien, Punkten und Figuren.


CLS

CLS (Clear Screen) löscht den Bildschirm mit der aktuellen Hintergrundfarbe.
Syntax: CLS
 

LINE

Der 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


PSet

Der 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


PReset

Der 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


PGet

Die 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 )


CIRCLE

Der 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


ELLIPSE

Der Befehl ELLIPSE zeichnet eine ungefüllte Ellipse auf dem Schirm.
Syntax: ELLIPSE x0, y0, x1, y1 [, f ]
Die Koordinaten beschreiben das einschließende Rechteck

x0, y0: eine Ecke (z.B. links unten oder links oben)

x1, y1: gegenüberliegende Ecke

f: Linienfarbe (optional, Indexfarbe oder RGB-Farbe)


Beispiel:
ELLIPSE 0, 0, 200, 50, BLUE  'eine blaue, längliche Ellipse


RECTANGLE

Der 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


FillEllipse

Der Befehl FillEllipse (Fülle Ellipse) zeichnet eine gefüllte Ellipse auf dem Schirm.
Syntax: FillEllipse x0, y0, x1, y1 [, f ]
Die Koordinaten beschreiben das einschließende Rechteck

x0, y0: eine Ecke (z.B. links unten)

x1, y1: gegenüberliegende Ecke

f: Flächenfarbe (optional, Indexfarbe oder RGB-Farbe)


Beispiel:
ELLIPSE 0, 0, 200, 50, BLACK  ' eine schwarze Ellipse


FillRect

Der 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


PointList

Die 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


PolyLine

PolyLine 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>
  • Die Elemente x(0), y(0) bis x(31), y(31) enthalten die Koordinatenpaare der Ecken des Linienzugs.

  • numPoints enthält die Anzahl der gültigen Koordinatenpaare. Es werden also numPoints - 1 Linien gezeichnet.

  • Die Elemente x0 und y0 ermöglichen es, die ganze Figur an eine andere Stelle zu zeichnen, ohne alle Koordinaten einzeln ändern zu müssen. Dazu werden die Werte von x0 und y0 vor jeder Zeichenoperation zu den einzelnen Koordinaten addiert.

    "Polyline p" entspricht also der folgenden BASIC-Sequenz

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


Polygon

Polygon 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


FillPolygon

FillPolygon 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


Spline

Spline 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


ClosedSpline

ClosedSpline 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


BezierSpline

Achtung! 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:

    Kurve, control, control, Kurve, control, control, Kurve, control, control, ..... Kurve.

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:

  • BezierSpline macht genau das Gleiche wie das Spline-Werkzeug in GeoDraw.

  • Die Anweisungen Spline und ClosedSpline nutzen intern die gleiche Funktion wie BezierSpline. Sie berechnen sich ihre Kontrollpunkte jedoch selbst.

  • Sie können mit BezierSpline maximal 10 Kurvensegmente auf einmal zeichnen. Das entspricht 31 zu übergebenden Punkten.

  • Um eine Ecke an einem Punkt zu erzeugen können Sie die Koordinaten der beiden Kontrollpunkte links und rechts von diesem Punkt auf die gleichen Koordinaten wie die des Eckpunktes setzen.

  • Ein einzelnes Kurvensegment nennt man Bézierkurve. GEOS benutzt kubische Bézierkurven. Weitere Informationen zu Bézierkurven finden Sie im Internet.

  • Weitere Erläuterungen zur Struktur <pl>: Siehe PolyLine

^

Weiter...