MAL-Homepage
Inhaltsverzeichnis
MAL Dokumentation: Grafik
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:
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-promille | y-promille | z-promille | X-Zeichenfeld | Y-Zeichenfeld |
0 | 0 | 0 | x1 | y1 |
1000 | 0 | 0 | x2 | y2 |
0 | 1000 | 0 | x3 | y3 |
0 | 0 | 1000 | x4 | y4 |
x1 y1 x2 y2 x3 y3 x4 y4 -> graphikwobei x1/y1 .. x4/y4 die Positionen aus obiger Tabelle sind. Die Angabe erfolgt jeweils in Promille bezogen auf das zuletzt eingestellte Area.
x-promille | y-promille | z-promille | X-Zeichenfeld | Y-Zeichenfeld |
xp1 | yp1 | zp1 | x1 | y1 |
xp2 | yp2 | zp2 | x2 | y2 |
xp3 | yp3 | zp3 | x3 | y3 |
xp4 | yp4 | zp4 | x4 | y4 |
[ xp1 yp1 zp1 xp2 yp2 zp2 xp3 yp3 zp3 xp4 yp4 zp4 ] [ x1 y1 x2 y2 x3 y3 x4 y4 ] -> graphik
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" ]
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 -> graphikwobei 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
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
[ 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.
MAL-Homepage Inhaltsverzeichnis
5. DARSTELLUNG VON TEXTEN
Folgende Attribute lassen sich vor der Ausgabe von Texten
einstellen:
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
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
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 ... ] -> graphikwobei wertI jeweils eine Realzahl ist und mit dem Namen des Balkens versehen ist.
[ rname1=reihe1 rname2=reihe2 ... ] -> graphikwobei reiheJ jeweils den gleichen Aufbau wie der Gesamtdatensatz beim Wort bars hat.
MAL-Homepage Inhaltsverzeichnis
6.6. Tortendiagramme
Mit dem Wort
3d_pie_chart
können Tortendiagramme erstellt werden.
Syntax:
[ name1=wert1 name2=wert2 ... ] -> graphikBeispiel:
MAL-Homepage Inhaltsverzeichnis
6.7. 3d-Plots
Mit dem Wort
landscape_plot
können Funktionen der Form
y = f(x,z)graphisch veranschaulicht werden.
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
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
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
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):
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).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().
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(); }
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