Auf diese vier Zeichenflächen können Sie mit Cairo zeichnen:
Die folgenden geometrischen Formen (Linien oder Flächen oder Text) können Sie auf die Zeichenfläche zeichnen:
Um Text zu zeichnen, müssen Sie den Text, die Informationen zum Font, zur Schriftfarbe sowie den (Start-)Punkt angeben, an dem die Schrift nach dem Aufruf spezieller Methoden in die Zeichenfläche eingefügt wird.
Alle Zeichenflächen besitzen ein (virtuelles) Koordinatensystem, auf das sich alle Angaben von Koordinaten in den Eigenschaften oder in den Argumenten der Methoden der Klasse Cairo beziehen. Beachten Sie bitte diese Hinweise:
Abbildung 25.1.10.3.1: Cairo-Koordinatensystem mit verschobenem Koordinatenursprung
Um die Bezeichnungen der beiden Achsen und die Werte bei Bedarf gut ablesbar einzuzeichnen, können Sie den Koordinatenursprung des Koordinatensystem mit der Translate-Methode der Cairo-Klasse (permanent) verschieben. Diese Verschiebung ändert jedoch die Richtung der beiden Koordinatenachsen nicht!
Cairo.Begin(hImage) Cairo.Translate(40, 45) ' Verschiebung um +40.0 in x-Richtung und um +45.0 in y-Richtung ... Cairo.End
Abbildung 25.1.10.3.2: Bild einer Funktion y = f(x)
Um im Gegensatz zur → Abbildung 25.1.10.3.1 die gewohnte Sicht zu realisieren, können Sie das Koordinatensystem so skalieren, dass die positive y-Achse nach oben zeigt. Eine Parallelverschiebung des Koordinatenursprungs O(0|0), verbunden mit einer Spiegelung der y-Achse an der Abszisse, realisiert durch den Einsatz der Scale-Methode, setzen Sie so um:
Cairo.Begin(hImage) Cairo.Translate(40, 45) ' Verschiebung um +40.0 in x-Richtung und um +45.0 in y-Richtung Cairo.Scale(1, -1) ' Die -1 bewirkt eine Invertierung der Richtung der y-Achse → +y ▲ ... Cairo.End
Das Konzept zum Zeichnen geometrischer Formen mit Cairo ist ähnlich zum Zeichnen mit Paint. Unterschiede werden im Absatz → 25.1.10.7 beschrieben. Eine geometrische Form wird stets in drei Schritten auf die benutzte Zeichenfläche gezeichnet:
Beispiel: Eine Punktwolke wird auf ein Image(-Objekt) als Zeichenfläche gezeichnet:
Public Sub CairoScriptPointCloud() Dim i As Integer GenerateNewImage() SetImageBorder() Cairo.Begin(hImage) Cairo.Translate(xTranslate, yTranslate) Cairo.Scale(xScale, yScale) ' +y ▲ Cairo.AntiAlias = False DrawCoordinateSystem() For i = 1 To 50000 ' Punkte mit zufälligen Koordinaten und einer Zufallsfarbe setzen SetPoint(Rnd(10, 550 - 5), Rnd(10, 260), Color.RGB(Rnd(0, 255), Rnd(0, 255), Rnd(0, 255))) Next Cairo.AntiAlias = True Cairo.End End ' CairoScriptPointCloud()
Um sich vom Ergebnis des Zeichnens zu überzeugen, wird das Image – das sich bisher nur im Speicher befindet – in eine DrawingArea (daCanvas) gezeichnet und somit erst sichtbar:
Public Sub daCanvas_Draw() If hImage Then Paint.DrawImage(hImage, 0, 0, hImage.W, hImage.H) End ' daCanvas_Draw()
Diese flexible Art und Weise zu zeichnen hat sich bewährt. Wenn Sie das gezeichnete Bild sichern und weiterverarbeiten wollen, um es zum Beispiel in einem Text zu präsentieren, so speichern Sie das Image in einer Bild-Datei ab:
Public Sub btnSaveCurImage_Click() hImage.Save(sImagePath &/ Lower(cmbImages.Text & ".png")) End ' btnSaveCurImage_Click()
Abbildung 25.1.10.5.1: Punktwolke
Im Kapitel → 25.1.11 CairoProjekte werden Ihnen weitere Bild-Beispiele vorgestellt und ausführlich kommentiert.
Für das Zeichnen mit Cairo gibt es (Standard-)Startwerte:
sans-serif
ist. Den Font-Namen des verwendeten Standard-Fonts können Sie in Gambas nicht auslesen. Das gelingt erst dann, wenn Sie einen eigenen Font über die Eigenschaft Cairo.Font.Name als aktuellen Font zugewiesen haben.Bei einem Test ergeben sich diese Werte:
Print Cairo.LineWidth ' 2 Print Cairo.AntiAlias ' 0 Print Cairo.Font.Size ' 10
Sie sollten sich die Dokumentationen zu den Eigenschaften und Methoden der Klasse Cairo der Komponente Cairo und der Klasse Paint (gb.qt4) sehr genau ansehen, da einige Methoden zwar gleiche Namen haben, jedoch eine unterschiedliche Syntax aufweisen oder zum Beispiel gleiche Eigenschaften unterschiedliche Wertebereiche besitzen. Besondere Aufmerksamkeit ist bei folgenden Themen geboten: