MAL-Homepage Inhaltsverzeichnis



MAL Dokumentation: Grafik




Inhalt:

1. EINFÜHRUNG
2. KOORDINATENWERTE
2.1. 2d-Variante
2.2. 3d Variante
3. GRAPHISCHE PRIMITIVE
4. FARBVERWALTUNG
4.1. Farbverläufe
5. DARSTELLUNG VON TEXTEN
6. VORDEFINIERTE GRAPHIKEN
6.1. Zeitreihenplot
6.2. Automatische x/y-Plot
6.3. Parameterisierbarer x/y-Plot
6.4. Marken einzeichnen
6.5. Balkendiagramme
6.6. Tortendiagramme
6.7. 3d-Plots
6.8. Rahmen
7. LAYOUT
8. SYSTEMVARIABLE
8.1. Skalierung
9. GRAPHIKTREIBER
10. ENTWICKLUNG EIGENER GRAPHIKTREIBER
10.1. Pixelgraphiken
10.2. Linengraphiken


1. EINFÜHRUNG

Eine Auflistung aller zum Themenberich Graphik gehörigen Worte kann unter
graphics gefunden werden.

Die Ausgabe von Graphiken erfolgt in zwei Schritten:

  1. Zuerst wird am Stack ein Graphikeintrag (kurz: ´Graphik´) zusammengestellt. Ein Graphikeintrag ist meist ein Verbund von graphischen Primitiven, kann aber auch ein einzelnes graphisches Primitiv sein. Verbunde können beliebig geschachtelt werden.
  2. Dann wird die Graphik von einem Graphiktreiber auf das gewünschte Graphikgerät ausgegeben. Der Graphiktreiber enthält einen kleinen Interpreter, der den Graphikeintrag Komponente für Komponente abarbeitet, und die entsprechenden Ausgaben auf das Graphikgerät vornimmt.
Beispiel:

Um ein strichliertes Achsenkreuz mit Strichlänge 50 zu erzeugen wird folgender Verbund am Stack abgelegt:

[ 50 doted axes ]


Kontrollausgabe:

dup .

[
doted=50
polygon ]


Graphiktreiber für Bildschirmausgabe aufrufen:

screen


Es erscheint folgendes Ergebnis am Schirm:

Der Graphiktreiber screen arbeitet den Verbund [ doted=0 polygon ] Komponente für Komponente ab und gibt die Graphik auf den Bildschirm aus. Die erste Komponente (doted=50) schaltet den Linientyp auf ´strichliert´ um. Die zweite Komponente (polygon) zeichnet das Achsenkreuz.

MAL-Homepage Inhaltsverzeichnis


2. KOORDINATENWERTE

2.1. 2d-Variante

Jedes Graphikgerät hat ein rechteckiges Zeichenfeld, das sogenannte "Area" vordefiniert (beim Drucker ist es z.B. 16 cm breit und 10 cm hoch, etwa in der Seitenmitte). Das standardmäßige Achsenkreuz (Wort
axes) hat genau die Größe des Area-Feldes.

Koordinatenwerte sind stets in Promille der Area-Größe relativ zur linken unteren Ecke anzugeben. Also z.B.:

Größenangaben, Strichlierungslängen, Linienstärke usw. verstehen sich immer als Promille von der Länge der 'y'-Achse.

Mit dem Wort area läßt sich die Zeichenfeldgröße und -lage verstellen.

Syntax:

xunten yunten xoben yoben -> umschalter

Die Koordinatenwerte ´xunten´, ´yunten´, ´xoben´ und ´yoben´ beziehen sich auf die gerade eingestellte Zeichenfeldgröße. Als Ergebnis wird ein graphisches Primitiv am Stack übergeben, das bei der Interpretation durch den Graphiktreiber die Zeichenfeldgröße umstellt.

Beispiel: [
axes ( ursprüngliches Area)
500 500 1000 1000 area ( rechtes oberes Viertel)
axes
] screen








MAL-Homepage Inhaltsverzeichnis


2.2. 3d Variante

Im dreidimensionalen Fall erfolgt stets eine Abbildung von 3d Promille-Werten auf das zweidimensionale Zeichenfeld. Wie diese Abbildung erfolgt, wird mit dem Wort
3d_area eingestellt. Zunächst, also vor dem ersten Aufruf von 3d_area ist die Z-Komponente der Promille-Werte irrelevant, weil eine Parallelprojektion der X/Y-Ebene auf das Zeichenfeld erfolgt. Das heisst, die X- und Y-Koordinaten werden wie im 2d-Fall abgebildet.

Das Wort 3d_area hat zwei Varianten:

Variante 1:
Die einfachere Variante beschreibt, wie der Koordinaten-Ursprung und die drei Spitzen des Koordinatenkreuzes auf die Zeichenebene projiziert werden sollen. Das sind also folgende 4 Punkte im dreidimensionalen Promille-Raum:

x-promilley-promillez-promilleX-ZeichenfeldY-Zeichenfeld
000x1y1
100000x2y2
010000x3y3
001000x4y4
Das Wort 3d_area kann also mit folgenden Parametern aufgerufen werden:

            x1 y1  x2 y2  x3 y3  x4 y4   ->   graphik
wobei x1/y1 .. x4/y4 die Positionen aus obiger Tabelle sind. Die Angabe erfolgt jeweils in Promille bezogen auf das zuletzt eingestellte Area.

Beispiel:
[
axes ( zur Veranschaulichung des bestehenden Areas)
250 300 1000 200 250 1000 70 70 3d_area
public \ graphics >voc ( 3d-Achsen und Skalen zeichnen)
3d_axes scales zscale
] screen




Variante 2:
Bei der zweiten Variante des Wortes 3d_area können auch die 3d-Koordinaten der Referenzpunkte frei gewählt werden:

x-promilley-promillez-promilleX-ZeichenfeldY-Zeichenfeld
xp1yp1zp1x1y1
xp2yp2zp2x2y2
xp3yp3zp3x3y3
xp4yp4zp4x4y4


Syntax:
   [ 
   xp1 yp1 zp1 
   xp2 yp2 zp2 
   xp3 yp3 zp3 
   xp4 yp4 zp4 
   ]
   [
   x1 y1
   x2 y2
   x3 y3
   x4 y4 
   ]              ->   graphik


Weitere Möglichkeiten der 3d-Projektion:
Für den einfachsten Fall einer dreidimensionalen Darstellung kann das Wort pseudo_3d verwendet werden. Es verschiebt einfach die X/Y-Ebene um einen angebbaren Wert nach rechts oben. Der Vorteil einer derart eingestellten Projektion ist, dass die Graphiken nicht schräg wirken, wenn sie zum Beispiel in einen Fließtext eingebettet werden. Außerdem wird eine Graphik, deren Koordinatenwerte im Bereich 0..1000 liegen auch sicher auf den Bereich des ursprünglich eingestellten Areas projiziert.

Beispiel:
public \ graphics >voc
[
axes
250 pseudo_3d 3d_axes scales zscale
] screen




Mit den Worten graphic_xrotation, graphic_yrotation und graphic_zrotation kann das Achsenkreuz um die jeweilige Achse rotiert werden. Dabei bleibt dabei stets eine Parallelprojektion vom 3d in den 2d Raum erhalten, sofern man diese nicht zuvor mit 3d_area oder pseudo_3d verstellt hat.

MAL-Homepage Inhaltsverzeichnis


3. GRAPHISCHE PRIMITIVE

Alle Umschalter sind wirksam ab dem Zeitpunkt des Auftretens bis zum Ende des Verbundes, in dem sie definiert sind (oder bis zum Auftreten eines neuen Umschalters). Sie werden aber auf eingelagerte Verbunde vererbt.

Die diesem Konzept zugrunde liegende Idee ist, dass Verbunde (die ja meist Teilbilder einer Gesamtgraphik sind), bei der Einbindung in einen Mutter-Verbund (z.B.: ein Layout) entsprechend angepasst werden.

Beispiel:

[ 
"hallo" 70 size [ "hugo" 100 size "groß" ] "mittel" 
] 


hallo ... Größe 35
hugo ... Größe 70
groß ... Größe 100
mittel .. Größe 70


Das folgende Beispiel veranschaulicht die Gültigkeitsbereiche von Umschaltern bei Graphiken mit geschachtelten Verbunden:



In Graphiken können folgende Typen von Stackeinträgen enthalten sein (Befinden sich sonstige Stackeinträge in einer Graphik, so brechen die Graphiktreiber mit der Fehlermeldung ´unzul. Datentyp in Graphik´ ab.):

Polygone
Polygone sind eigene Typen von Stackeinträgen. Folgende Worte erzeugen ein Polygon:

Mit polygon können Linien auch außerhalb des Areas gezeichnet werden, während cpolygon mit Clipping arbeitet.

Die Worte posit und 3d_posit dienen zum Positionieren von Strings. Die Graphiktreiber führen intern eine Cursorposition. Strings werden so positioniert, das das Zentrum des ersten Zeichens an der Cursorposition steht. Nach der Ausgabe des Strings wird die Cursorposition entsprechend weitergesetzt.

3d Polygone
Dreidimensionale Polygone werden mit dem Wort
3d_polygon erzeugt.

Syntax:

          x   y   z    ->  graphik
wobei x, y und z Realzahlen oder Verbunde von Realzahlen sein können. Wenn keine Verbunde sondern nur Einzelzahlen verwendet werden, so wird nichts gezeichnet. Das kann aber für die Positionierung von Texten erforderlich sein.

Strings und Zahlen
Strings oder Zahlen werden direkt in die Graphik geschrieben. Die Position ergibt sich durch die Endposition nach Darstellung des Vorgänger-Stackeintrages. Üblicherweise nimmt man das Wort 'posit' Zuhilfe. Die Schriftgröße ist mit 35 vorbesetzt und kann mit dem Wort
size verändert werden.

Strings können auch Backspace-Zeichen beinhalten. Die Worte center und rightbound nutzen diese Eigenschaft.

Beispiel:

[ axes
0 1000 posit " Y-Achse"
500 1100 posit 50 size "Kopfzeile" center ]
screen

Kreise
Kreise haben eher untergeordnete Bedeutung. Sie werden nur für Fußabdruck-Graphiken (EMED-Bilder) verwendet. Sie werden zum Beispiel durch das Wort
emed_spots erzeugt und enthalten die Parameter Mittelpunkt-x, Mittelpunkt-y und Radius. Ein negativer Radiuswert bewirkt die Darstellung als leerer Kreis.

Will man Kreise oder Ellipsen in einer Graphik dartellen, so verwendet man das Wort ellipse.

Farbumschalter
Farbumschalter werden mit den Worten
color, fillcolor oder text_fillcolor erstellt. color stellt die Farbe der Linien und Schriftkonturen ein, fillcolor die Füllfarbe für geschlossene Polygone und text_fillcolor die Füllfarbe von füllbaren Schriftzeichen (z.B. dem Zeichensatz avalon_font). Weiter Details siehe Kapitel Farbverwaltung.

Linienattribute
Das Wort
thickness dient zum Einstellen der Linienstärke. Die Angabe erfolgt jeweils in Promille der Höhe des Plot-Areas.

Beispiel:

[ axes
20 thickness [ 0 1000 ] [ 0 1000 ] polygon
50 thickness [ 0 1000 ] [ 1000 0 ] polygon
] screen



Weil bei der Bildschirmausgabe nur Linienstärken in Vielfachen der Pixelgröße möglich sind, kann es aufgrund der Rundungsungenauigkeiten zu Abweichungen von der eingestellten Linienstärke kommen.

Das Wort doted stellt den Strichlierungsmodus ein. Als Parameter ist die Länge der Strichlierung in Promille von der Länge der Y-Achse anzugeben. Ein Wert von Null stellt die Strichlierung aus (Beispiel siehe Einführung).

Zeichenfeldgröße-Umschalter
Das Wort
area stellt die Größe des Zeichenfeldes (des Plot-Areas) ein. Die Angabe bezieht sich immer auf die Größe des aktuell eingestellten Zeichenfeldes und verliert ihre Gültigkeit bei verlassen des Verbundes.

Auf diese Weise ist es möglich die Position und Größe von fertig berechneten Graphiken im Nachhinein zu verstellen, was für das Layout von Graphiken von Bedeutung ist.

Beispiel:

1000 ramp 50 / sin draw >> bild
[
[ 0 600 1000 1000 area bild ]
[ 500 0 1000 500 area bild 500 500 1000 1000 area bild ]
] screen





MAL-Homepage Inhaltsverzeichnis


4. FARBVERWALTUNG

Das Wort
color schaltet die Farbe für nachfolgende Linien und Schriftzeichen um. Sollen Schriftzeichen mit einer anderen Farbe gefüllt werden als der mit color eingestellten, so muss danach das Wort text_fillcolor aufgerufen werden.

Das Wort fillcolor stellt die Füllfarbe für alle nachfolgenden geschlossenen Polygone ein. Ein Polygon gilt als geschlossen, wenn die Koordinaten des Endpunktes gleich jenen des Startpunktes sind.

Farben können in Form einer Farbnummer (= Index in der Farbtabelle), als RGB-Werte (= Verbund mit drei Realzahlen 0..1) oder in Form von Farbverläufen angegeben werden. Für Graphikgeräte, die keine RGB-Farben kennen ist die Angabe von RGB-Werten bzw. Farbverläufen wirkungslos.

Eine negative Farbnummer bewirkt, dass nichts gezeichnet bzw. gefüllt wird.

Die Farbtabelle ist für die Farbnummern 0..15 mit den Farben der ursprünglichen VGA-Graphik und im Nummernbereich 16..31 mit stufenweise heller werdenden Grauwerten vorbesetzt.

Vorbesetzung der Farbtabelle:
: farbe_ausgeben >> nr
nr color nr >string " " & ;


[ 60 size
-200 800 posit 16 ramp each farbe_ausgeben
-200 600 posit 16 ramp 16 + each farbe_ausgeben
] screen


Mit dem Wort colortable kann die Farbtabelle mit beliebigen RGB-Farbe überladen werden (auch diese Funktion ist nur bei RGB-tauglichen Graphikgeräten implementiert). colortable erwartet einen Realverbund mit 3*n Farbkomponenten (Bereich 0..1) in der Form:
  [ r1 g1 b1  r2 g2 b2 ...   ]

MAL-Homepage Inhaltsverzeichnis


4.1. Farbverläufe

Anstelle von Farbnummern oder RGB-Farben können bei den Worten
color, fillcolor und text_fillcolor auch Farbverläufe angegeben werden. Ein Farbverlauf wird als Verbund von zwei oder mehr Bildpositionen mit jeweils zugeordneter RGB-Farbe definiert:

[
[ x1 y1 rot1 gruen1 blau1 ]
[ x2 y2 rot2 gruen2 blau2 ]
.
.
]
Die Angabe der Bildpositionen (x und y) erfolgt in Promille vom Plot-Area. Bei diesen Positionen wird die jeweils angegebene Farbe dargestellt. Dazwischen wird interpoliert, wodurch verlaufende Farben entstehen.

Beispiel:
[ ( -- Rechteck mit zwei Farben --)
  [
  [ 200 200 1 0 0 ] ( Rot)
  [ 400 200 0 1 0 ] ( Gruen)
  ] fillcolor

  [ 200 400 400 200 200 ]
  [ 200 200 400 400 200 ] polygon
  
  ( -- Dreieck mit drei Farben --)
  [
  [ 500 200 1 0 0 ] ( Rot)
  [ 700 200 0 1 0 ] ( Gruen)
  [ 600 400 0 0 1 ] ( Blau)
  ] fillcolor

  [ 500 700 600 500 ]
  [ 200 200 400 200 ] polygon
] screen


MAL-Homepage Inhaltsverzeichnis


5. DARSTELLUNG VON TEXTEN

Folgende Attribute lassen sich vor der Ausgabe von Texten einstellen:



Beispiel:

Der dazugehörige Code sieht folgendermaßen aus:

[
0 1000 posit "Text mit Standardeinstellung"
[
0 900 posit 70 size "Schriftgröße 70"
"public \ graphics \ avalon_font" select_font
0 800 posit "Avalon-Font"
12 text_fillcolor
0 650 posit "Mit 12 text_fillcolor"
]
[ 0 550 posit 200 italic "200 italic" ]
[ 0 500 posit 2 text_stretching "2 text_stretching" ]
[ 0 450 posit 1200 character_spacing "1200 character_spacing" ]
[ 0 350 posit "Voreingestelltes$0ALine-Spacing" ]
[ 0 200 posit 1000 line_spacing "1000 line_spacing$0Aist sehr eng." ]
[ 0 100 posit 10 thickness "mit 10 thickness" ]
-100 150 posit pi 2 / text_rotation "Um 90 Grad gedreht"
] screen

MAL-Homepage Inhaltsverzeichnis


6. VORDEFINIERTE GRAPHIKEN

6.1. Zeitreihenplot

Die vermutlich mit Abstand am häufigsten benötigte vordefinierte Graphik ist
draw. Dieses Wort dient zum Darstellen von ein oder mehreren Zeitreihen.

Syntax:

zr -> graphik

oder

[ zr1 zr2 ... ] -> graphik

Beispiel:

1000 ramp 50 / sin draw screen

MAL-Homepage Inhaltsverzeichnis


6.2. Automatische x/y-Plot

Die Basis für das Wort draw ist das Wort
aplot. Es ermöglicht die Darstellung von Kurven, die durch Paare von X- und Y-Koordinaten beschrieben sind.

Syntax:

[ x1 y1 x2 y2 ... ] -> graphik

´xI´ ... Realverbund mit X-Koordinaten für die I-te Kurve.
´yI´ ... Realverbund mit Y-Koordinaten für die I-te Kurve.


Die erste Kurve wird also durch die Verbunde ´x1´ und ´y1´ beschrieben, wobei die ersten Komponenten den ersten Punkt der Kurve, die zweiten den zweiten Punkt usw. definieren.

Beispiele:

[ [ 1 8 3 5 ] [ 2 1 6 9 ] ] aplot screen

[
1000 ramp 20 / sin ( Kurve)
1000 ramp 37 / cos
[ -1.2 1.2 1.2 -1.2 -1.2 ] ( Rechteck)
[ -1.2 -1.2 1.2 1.2 -1.2 ]
] aplot screen

MAL-Homepage Inhaltsverzeichnis


6.3. Parameterisierbarer x/y-Plot

Während das Wort aplot eher wenig Gestaltungsmöglichkeiten läßt, ist das Wort
plot nicht so stark automatisiert (´aplot´=automatisches ´plot´).

plot führt keine automatische Skalierung durch und zeichnet weder Achsenkreuz noch Skalen. Diese müssen im Bedarfsfall mit axes und scales eingezeichnet werden.

Syntax:

[ x1 y1 .. ] [ f1 .. ] [ s1 .. ] -> graphik

´fI´ ... Realzahl mit Farbnummer für die I-te Kurve.
´sI´ ... Realzahl mit Strichlierungswert für die I-te Kurve.


Falls die Verbunde ´[ f1 ..]´ oder ´[s1.. ]´ leer sind, werden keine Farb- oder Strichlierungswerte vergeben.

aplot läßt sich mit Hilfe von plot folgendermaßen definieren:

: aplot >> koordinaten
koordinaten xauto
koordinaten yauto
[ koordinaten [ ] [ ] plot axes scales ;
Die hier verwendeten Worte xauto und yauto dienen zur Skalierung.

MAL-Homepage Inhaltsverzeichnis


6.4. Marken einzeichnen

Das Wort
marker dient zum Platzieren von Buchstaben-Marken am Zeichenfeld. Es ist speziell für das Einzeichnen von Marken in Kurven, die mit plot oder aplot gezeichnet wurden, ausgelegt.

Syntax:

[ x1 y1 x2 y2 ..] [ abst1 abst2 ...] buchst -> graphik



Beispiel:

[ 100 ramp dup 10 / sin ] >> koordinaten


[
koordinaten aplot
40 size koordinaten 10 "O" marker
] screen

MAL-Homepage Inhaltsverzeichnis


6.5. Balkendiagramme

Im Folder 'graphics_folder' im Public-Pool (Aufruf mit
unser) befindet sich das Wort '3d_bars'. Es kann für ein- und mehrreihige Balkendiagramme versendet werden. Das Wort bars im Startup-Folder kann für einreihige Balkendiagramme verwendet werden und ruft seinerseits intern 3d_bars auf.

Die Syntax vom Wort bars ist:

        [ name1=wert1 name2=wert2 ... ]  ->  graphik
wobei wertI jeweils eine Realzahl ist und mit dem Namen des Balkens versehen ist.

Beispiel:
[
23 "Vorgestern" >name
27 "Gestern" >name
33 "Heute" >name
45 "Morgen" >name
] bars screen



Das Wort 3d_bars hat folgende Syntax:
   [ rname1=reihe1 rname2=reihe2 ... ]    -> graphik
wobei reiheJ jeweils den gleichen Aufbau wie der Gesamtdatensatz beim Wort bars hat.

Beispiel:
public \ graphics >voc
[
[ 23 "Vorgestern" >name 27 "Gestern" >name 33 "Heute" >name 45 "Morgen" >name ]
"Vormittag" >name
[ 25 "Vorgestern" >name 21 "Gestern" >name 37 "Heute" >name 40 "Morgen" >name ]
"Nachmittag" >name
] 3d_bars screen



Die Beschriftung der Spalten ist nur für die vorderste oder die längste Reihe erforderlich.

Man kann aber auch statt einzelner Realzahlen bei den Werten ganze Stichproben, also Realverbunde übergeben. Dann wird zusätzlich noch der Streubereich eingezeichnet.



Beispiel:
public \ graphics >voc
[
[ 5 random "Vorgestern" >name 17 random "Gestern" >name
  2 random "Heute" >name 26 random "Morgen" >name ] "Vormittag" >name
[ 7 random 12 random 3 random 1 random ] "Nachmittag" >name
] 3d_bars screen

Die Beschriftung der Balken mit den Werten und der Stichprobengröße erfolgt jeweils nur bei der vordersten Reihe und auch nur dann, wenn genug Platz vorhanden ist.

MAL-Homepage Inhaltsverzeichnis


6.6. Tortendiagramme

Mit dem Wort
3d_pie_chart können Tortendiagramme erstellt werden.

Syntax:

     [ name1=wert1 name2=wert2 ... ]   ->  graphik
Beispiel:
public \ graphics >voc
[
5 "Erster Teil" >name
3 "Zeiter Teil" >name
6 "Letzter Teil" >name
7 "Rest" >name
] 3d_pie_chart screen

MAL-Homepage Inhaltsverzeichnis


6.7. 3d-Plots

Mit dem Wort
landscape_plot können Funktionen der Form

   y = f(x,z)
graphisch veranschaulicht werden.

Beispiel:
Berechnung der Funktion y = f(x,z) = sin(x)*cos(y).

  : f(x,z) >> z >> x
  x sin z cos * ;
  : reihe_berechnen >> z
  x z f(x,z) ;


public \ graphics >voc
30 ramp 6 / >> x
30 ramp 6 / >> z


[
300 pseudo_3d
[ z each reihe_berechnen ] x z landscape_plot
] screen

Die Anzahl der dargestellten Dreiecke berechnet sich als
  a = 2 * (xanzahl-1) * (yanzahl-1)
und sollte nicht viel größer als 10000 sein, um die Laufzeit in Grenzen zu halten.

MAL-Homepage Inhaltsverzeichnis


6.8. Rahmen

Das Wort frame zeichnet einen Rahmen mit einer Kopfzeile.

Syntax:

kopftext -> graphik

Beispiel:

[ 100 ramp draw "hello" frame ] screen



Unter
unser im Folder "graphics_folder" befindet sich das Wort 3d_frame, das einen plastisch wirkenden farbigen Rahmen zeichnet, syntaktisch aber mit dem Wort frame ident ist.

Beispiel: public \ graphics >voc
[ "Titelzeile" 3d_frame 10 ramp draw ] screen




MAL-Homepage Inhaltsverzeichnis


7. LAYOUT

Die Justierung von Graphiken auf der Zeichenfläche und das Zusammenstellen von mehreren Graphiken, kann durch Anwendung des Wortes
area und Zusammenstellen von Verbunden vorgenommen werden.

Das Wort view bietet für einen häufig benötigten Standardfall (das Zusammenstellen mehrerer Graphiken auf einer Seite) eine einfache Lösung. Die Syntax von view sieht folgendermaßen aus:

[ graphik1 graphik2 ... ] -> gesamtgraphik

Es übernimmt eine automatische Platzeinteilung, wobei immer getrachtet wird, die Bilder auf gleich viele Zeilen und Spalten aufzuteilen.

Beispiel

[
100 ramp draw
10 ramp sin draw
axes
] view screen

Ähnlich funktioniert das Wort longview. Es hat die gleiche Syntax wie view, nur werden die Graphiken eine unter der anderen im Langformat dargestellt.

MAL-Homepage Inhaltsverzeichnis


8. SYSTEMVARIABLE

Besonders im Bereich der Graphik wird die Parameterübergabe zwischen verschiedenen Worten manchmal mit sogenannten Systemvariablen statt per Stackeintrag durchgeführt. Das macht die Handhabung einfacher.

Systemvariable unscheiden sich nicht von anderen Variablen. Es sind nur gewisse Namen für Systemzwecke reserviert. Worte, die Systemvariable benötigen, suchen diese im Vokabular oder nehmen, falls sie diese nicht finden, einen Vorbesetzungswert.

Manche Worte erzeugen auch Systemvariable (z.B. xauto, yauto). Sie legen also ein neues Wort an. Um nicht unnötig viele gleichlautende Variablen zu erzeugen, wird gegebenenfalls der Wert einer bereits exisierenden überschrieben.

MAL-Homepage Inhaltsverzeichnis


8.1. Skalierung

Die Worte
xauto, yauto, xscaling , yscaling und zscaling dienen zum Einstellen der Skalierung, wobei xauto und yauto mit einem Datenverbund in jener Form, wie er auch für das Wort aplot benötigt wird zu versorgen sind, und xscaling , yscaling bzw. zscaling jeweils mit dem minimal und maximal darzustellenden Wert.

Beispiele:

100 ramp 10 / >> x
x sin >> y
[ x y ] >> plotdaten
plotdaten xauto
plotdaten yauto
[ plotdaten [ ] [ ] plot axes scales ] screen

-1 0 yscaling
[ plotdaten [ ] [ ] plot axes scales ] screen



Die oben angeführten Worte erzeugen jeweils zwei Systemvariablen, die Codestrings für die Umrechnung zwischen Rohwerten und Zeichenkoordinaten enthalten. Will man spezielle Koordinatenumrechnungen (z.B. logarithmische), so kann man diese Codevariablen selbst gestalten. Sie werden in den Worten plot, marker, emed_spots, scales, xscale, yscale und zscale benötigt.

Die Sytemvariablen xparts, yparts und zparts enthalten die Anzahl der Teilstriche der Skalen. Sie werden in den Worten xauto, yauto, xscaling, yscaling, zscaling sowie xscale, yscale, zscale und scales benötigt. Vorbesetzung ist 5.

MAL-Homepage Inhaltsverzeichnis


9. GRAPHIKTREIBER

Die Graphiktreiber
screen und printer sind in jedem MAL-System Standard. Daher sind MAL-Programme, die sich ausschließlich auf diese beschränken, sicher portierbar.

Das Wort printer ist eine Doppelpunktdefinition, die in der Datei "auto.cpu" definiert ist. Bei Windows Systemen ist sie üblicher Weise mit

: printer winprinter ;

definiert. Falls der Standarddrucker nicht farbtauglich ist sollte statt winprinter bw_winprinter verwendet werden.

Liste der Graphiktreiber:

postscript
Das Wort
postscript dient zum Anlegen einer Postscript Datei. Es erwartet zusätzlich zur Graphik noch zwei Strings am Stack, die in die Zieldatei als Header und Footer übernommen werden.

winprinter
Das Wort
winprinter existiert nur bei Windows-Systemen und nutzt den vom Borland Compiler zur Verfügung gestellten Printertreiber.

graphic>jpeg
Das Wort
graphic>jpeg gibt die Graphik auf eine Datei im JPEG-Format aus. Als Parameter sind die Bildbreite und die Bildhöhe in Pixel anzugeben.

graphic>frame
Das Wort
graphic>frame konvertiert die Graphik in einen Stackeintrag vom Typ 'frametyp' (siehe Kapitel Bildverarbeitung).

MAL-Homepage Inhaltsverzeichnis


10. ENTWICKLUNG EIGENER GRAPHIKTREIBER

Die Superklasse, in der alle für Treiber von Graphikgeräten erforderlichen Funktionen definiert sind, ist die Klasse pixel_graphic_class. Ihr Interface ist in der Datei 'graphint.h' und die dazugehörigen Codes sind in 'graphik.C' (bzw. 'graphik.cpp') definiert. Sie unterstützt aber nicht nur Pixelgraphiken, sondern auch Liniengraphiken (heute sind Liniengraphiken hauptsächlich für Postscript-Exporte von Bedeutung).

Folgende Schritte sind für die Entwicklung eines Graphiktreibers durchzuführen (angenommen es existiert bereits eine ins MAL-System eingebundene C++-Sourcedatei, in die der Code eingetragen werden soll):

  1. Soferne nicht schon erledigt, muss die Datei 'graphint.h' inkludiert werden (#include "graphint.h")
  2. Es muss eine Klasse, die von pixel_graphic_class abgeleitet wird definiert werden, in der die erforderlichen gerätespezifischen virtuellen Funktionen implementiert werden (Details siehe unten).
  3. Es muss ein neues MAL-Wort definiert werden (siehe Kaptiel Erweiterung).
  4. In der C++-Prozedur dieses Wortes muss eine Instanz der neu definierten Graphik-Klasse angelegt werden. Dann müssen von dieser die Funktionen set_pen() zur Voreinstellung der Farbe, set_area() zur Einstellung der physikalischen Koordinaten des Areas und die Funktion set_thickness() zur Voreinstellung der Linienstärke aufgerufen werden. Schließlich wird mit der Funktion interpreter() die MAL-Graphik am Top-Of-Stack abgearbeitet und gelöscht. Die Funktion interpreter() hat einen Parameter (wait), der bestimmt, ob nach der Anzeige der Graphik auf einen Tastendruck gewartet werden soll oder nicht.

MAL-Homepage Inhaltsverzeichnis


10.1. Pixelgraphiken

RGB-taugliche Pixelgraphiken sind der einfachste Fall. Im Prinzip genügt es die virtuelle Funktion setpixel(x,y) in der von pixel_graphik_class abgeleiteten Klasse zu definieren.

Eventuell muss noch die Funktion change_color() definiert werden, wenn das Gerät eine spezielle Aktion beim Farbwechsel erfordert. Normalerweise kann aber setpixel() die aktuelle Farbe direkt aus der Variablen rgb_color lesen.

Für die Initialisierung bzw. Deinitialisierung des Gerätes sollten die Funktionen init_graphic() und close_graphic() überschrieben werden. Man kann die Geräte auch explizit initialisieren und schließen, allerdings gibt es manche Bildschirm-Graphikmodi, bei denen die mit printf() abgesetzten Fehlermeldungen nicht am Schirm erscheinen. Der Graphikinterpreter ruft daher vor dem Absetzen einer Fehlermeldung zunächst close_graphic() auf.

Das folgende Codebeispiel zeigt den Graphiktreiber
bw_winprinter:

/*............................................................
bw_winprinter bw_winprinter
graphics
Holzreiter S.
Graphiktreiber fuer Schwarz/Weissdrucker unter MS-Windows (Borland-Builder).




graphik ->

'graphik' ... Graphikeintrag. ...........................................................*/

//------ Klasse fuer S/W-Drucker ------- class win_printer_class : public pixel_graphic_class { public:

win_printer_class() { prn=Printer(); prn->Orientation=poLandscape; width=prn->PageWidth; height=prn->PageHeight; set_area(width*0.242,width*0.7984,height*0.81514,height*0.323); set_thickness(0.1); prn->BeginDoc(); }

virtual void setpixel(int x,int y) { if (x<0 || y<0 || x>=width || y>=height) return; prn->Canvas->Pixels[x][y]=clBlack; }

TPrinter *prn; int width,height;

};

void bw_winprinter() { win_printer_class graphic; graphic.set_pen(0); graphic.interpreter(0); graphic.prn->EndDoc(); }
Manche der Voreinstellungen werden im Konstruktor der Klasse win_printer_class vorgenommen (set_area() und set_thickness()). Der Zugriff zum physikalischen Drucker ist über die Variable prn definiert, die eine Instanz der Borland-Klasse TPrinter ist. Die Initialisierung des Druckers erfolgt ebenfalls im Konstruktor von win_printer_class, das Ausdrucken der fertigen Seite jedoch am Ende der Procedure bw_winprinter().

Man beachte, dass in setpixel() zuerst die Zulässigkeit der Koordinatenwerte geprüft wird, bevor das Pixel am Drucker gesetzt wird.

MAL-Homepage Inhaltsverzeichnis


10.2. Linengraphiken

Liniengraphiken wurden ursprünglich für den Betrieb von Plottern entwickelt, habe aber heute praktisch nurmehr für den Postscript-Export bedeutung. Folgende Funktionen von pixel_graphic_class müssen für Postscript-Treiber überladen werden:

MAL-Homepage Inhaltsverzeichnis