pat = cairo.PatternMesh()
Netzmuster sind Tensorprodukt-Patchnetze (Schattierungen vom Typ 7 im PDF). Netzmuster können auch verwendet werden, um andere Arten von Schattierungen zu erstellen, bei denen es sich um Spezialfälle von Tensorprodukt-Patchnetzen handelt, z.B. Coons-Patchnetze (Schattierung vom Typ 6 in PDF) und Gouraud-schattierte Dreiecksnetze (Schattierung vom Typ 4 und 5 in PDF).
Netzmuster bestehen aus einem oder mehreren Tensorprodukt-Patches, die vor
der Verwendung des Netzmusters definiert werden sollten. Die Verwendung eines
Netzmusters mit einem teilweise definierten Patch als Quelle oder Maske führt
dazu, dass der Kontext in einen Fehlerstatus mit dem Status
#CAIRO_STATUS_INVALID_MESH_CONSTRUCTION versetzt wird.
Ein Tensorprodukt-Patch wird durch 4 Bézier-Kurven (Seite 0, 1, 2, 3) und durch 4 zusätzliche Kontrollpunkte (P0, P1, P2, P3) definiert, die eine weitere Kontrolle über den Patch ermöglichen und die Definition des Tensorprodukt-Patches vervollständigen. Die Ecke C0 ist der erste Punkt des Patches.
Degenerierte Seiten sind zulässig, daher können gerade Linien verwendet werden. Eine Linie mit der Länge Null auf einer Seite kann zum Erstellen dreiseitiger Patches verwendet werden.
C1 Side 1 C2
+---------------+
| |
| P1 P2 |
| |
Side 0 | | Side 2
| |
| |
| P0 P3 |
| |
+---------------+
C0 Side 3 C3
|
Jeder Patch wird erstellt, indem zuerst cpattern:BeginPatch() und dann cpattern:MoveTo() aufgerufen werden, um den ersten Punkt im Patch (C0) anzugeben. Anschließend werden die Seiten mit Aufrufen von cpattern:CurveTo() und cpattern:LineTo() angegeben.
Die vier zusätzlichen Kontrollpunkte (P0, P1, P2, P3) in einem Patch können mit cpattern:SetControlPoint() angegeben werden.
An jeder Ecke des Patches (C0, C1, C2, C3) kann mit cpattern:SetCornerColorRGB() oder cpattern:SetCornerColorRGBA() eine Farbe angegeben werden. Jede Ecke, deren Farbe nicht explizit angegeben ist, wird standardmäßig auf transparentes Schwarz gesetzt.
Ein Coons-Patch ist ein Sonderfall des Tensorprodukt-Patches, bei dem die Kontrollpunkte implizit durch die Seiten des Patches definiert werden. Der Standardwert für alle nicht angegebenen Kontrollpunkte ist der implizite Wert für einen Coons-Patch. Wenn also keine Kontrollpunkte angegeben sind, handelt es sich bei dem Patch um einen Coons-Patch.
Ein Dreieck ist ein Sonderfall des Tensorprodukt-Patches, bei dem die Kontrollpunkte implizit durch die Seiten des Patches definiert werden, alle Seiten Linien sind und eine davon die Länge 0 hat, d.h. wenn der Patch mit nur 3 Linien angegeben wird, es ein Dreieck ist. Wenn die durch die 0-Längenseite verbundenen Ecken die gleiche Farbe haben, ist der Patch ein Gouraud-schattiertes Dreieck.
Patches können anders als im obigen Diagramm ausgerichtet sein. Beispielsweise könnte der erste Punkt oben links liegen. Das Diagramm zeigt nur die Beziehung zwischen den Seiten, Ecken und Kontrollpunkten. Unabhängig davon, wo sich der erste Punkt befindet, ist beim Festlegen von Farben immer Ecke 0 der erste Punkt, Ecke 1 der Punkt zwischen Seite 0 und Seite 1 usw.
Durch den Aufruf von cpattern:EndPatch() wird der aktuelle Patch abgeschlossen. Wenn weniger als 4 Seiten definiert wurden, wird die erste fehlende Seite als Linie vom aktuellen Punkt zum ersten Punkt des Patches (C0) definiert und die anderen Seiten sind degenerierte Linien von C0 bis C0. Die Ecken zwischen den hinzugefügten Seiten stimmen alle mit C0 des Patches überein und ihre Farbe wird auf die gleiche Farbe wie C0 eingestellt.
Weitere Patches können durch zusätzliche Aufrufe hinzugefügt werden cpattern:BeginPatch() / cpattern:EndPatch().
pat = cairo.PatternMesh() ; Coons-Patch hinzufügen pat:BeginPatch() pat:MoveTo(0, 0) pat:CurveTo(30, -30, 60, 30, 100, 0) pat:CurveTo(60, 30, 130, 60, 100, 100) pat:CurveTo(60, 70, 30, 130, 0, 100) pat:CurveTo(30, 70, -30, 30, 0, 0) pat:SetCornerColorRGB(0, 1, 0, 0) pat:SetCornerColorRGB(1, 0, 1, 0) pat:SetCornerColorRGB(2, 0, 0, 1) pat:SetCornerColorRGB(3, 1, 1, 0) pat:EndPatch() ; Gouraud-schattiertes Dreieck hinzufügen pat:BeginPatch() pat:MoveTo(100, 100) pat:LineTo(130, 130) pat:LineTo(130, 70) pat:SetCornerColorRGB(0, 1, 0, 0) pat:SetCornerColorRGB(1, 0, 1, 0) pat:SetCornerColorRGB(2, 0, 0, 1) pat:EndPatch() |
Wenn sich zwei Patches überlappen, wird der zuletzt hinzugefügte Patch über den ersten gezeichnet.
Wenn sich ein Patch über sich selbst faltet, werden die Punkte anhand ihrer Parameterkoordinaten innerhalb des Patches sortiert. Die v-Koordinate reicht von 0 bis 1, wenn man sich von Seite 3 zu Seite 1 bewegt; Die U-Koordinate reicht von 0 bis 1, wenn man von Seite 0 zu Seite 2 wechselt. Punkte mit höheren V-Koordinaten verbergen Punkte mit niedrigeren V-Koordinaten. Wenn zwei Punkte die gleiche v-Koordinate haben, liegt der Punkt mit der höheren u-Koordinate oben. Dies bedeutet, dass Punkte, die näher an Seite 1 liegen, über Punkten liegen, die näher an Seite 3 liegen. Wenn dies nicht ausreicht, um zu entscheiden, welcher Punkt darüber liegt (z.B. wenn beide Punkte zu Seite 1 oder Seite 3 gehören), liegen Punkte, die näher an Seite 2 liegen, über Punkten, die näher an Seite 0 liegen.
Eine vollständige Definition von Tensorprodukt-Patches finden Sie in der PDF-Spezifikation (ISO32000), in der die Parametrisierung ausführlich beschrieben wird.
Hinweis: Die Koordinaten liegen immer im Musterbereich. Für ein neues Muster ist der Musterbereich identisch mit dem Benutzerbereich, aber die Beziehung zwischen den Räumen kann mit cpattern:SetMatrix() geändert werden.
Dieser Befehl gibt bei Erfolg das neu erstellte Cairo-Muster zurück oder ein Fehlermuster, wenn kein Speicher vorhanden ist. Der Aufrufer hat das zurückgegebenen Objekt zugewiesen und sollte cpattern:Free() aufrufen, wenn er damit fertig ist.
Dieser Befehl gibt immer ein gültiges Handle zurück, aber wenn ein Fehler aufgetreten ist, wird der Musterstatus auf einen Fehler gesetzt. Um den Status eines Musters zu überprüfen, verwenden Sie cpattern:Status().