Polygone und Bézierkurven

Von Jürgen Schell. | 18 Juni, 2009 - 13:02
Beschreibung:

Polygone und Bézierkurven werden in RagTime als Listen von Punkten angelegt. Jeder Punkt ist dabei wieder eine Liste. Beispiel:

-- Script 1
set punkteListe to {{50, 50}, {100, 200}, {150, 50}, {50, 50}}
tell application "RagTime 6.5"
     set neuesDokument to (make new document with properties {component types:drawing} at end)
     tell drawing 1 of neuesDokument
          make new polygon at beginning with data punkteListe with properties {color:{red:10, green:60, blue:60}}
     end tell
end tell

Das Script legt ein neues Dokument – bestehend aus einer Zeichnung – an und zeichnet ein Dreieck. Die Liste {{50, 50}, {100, 200}, {150, 50}, {50, 50}} ist die Liste der Eckpunkte des Polygons. Jeder Punkt ist wieder eine Liste von zwei Koordinaten, X und Y. Y wird dabei von oben nach unten gemessen. Die Maßeineit sind Punkt (also 1/72 Zoll). Wie bei der Eigenschaft definition rect handelt es sich um die Koordinaten ohne irgendwelche Transformationen wie Drehung. Dies wird Deutlich im folgenden Script:

-- Script 2
set punkteListe to {{50, 50}, {100, 200}, {150, 50}, {50, 50}}
tell application "RagTime 6.5"
     set neuesDokument to (make new document with properties {component types:drawing} at end)
     tell drawing 1 of neuesDokument
          set dasPolygon to (make new polygon at beginning with data {{0, 0}, {1, 1}} with properties {color:{red:10, green:60, blue:60}})
          set rotation of dasPolygon to 0.25
          change point list of dasPolygon to punkteListe
     end tell
end tell

Hier wird zunächst ein Polygon mit nur zwei Punkten angelegt und anschließend rotiert. Dann wird die Punktliste auf denselben Wert gesetzt, wie im Script 1. Das Resultat ist ein Dreieck, dessen Spitze nach links zeigt: Die Dreihung wird weiterhin auf die Koordinaten angewandt.

Sehen wir uns eine Bézierkurve an. Zuerst wird von Hand eine in RagTime gezeichnet, wie abgebildet. Während sie ausgewält ist, wird die Punktliste mit einem Script abgefragt:

tell application "RagTime 6.5"
     try
          get point list of selection of window 1
     end try
end tell

(In der Praxis ist dieses simple Testscript sehr hilfreich. In vielen Fällen ist es am einfachsten, zunächst eine ungefähre Kurve von Hand anzulegen und deren Werte abzufragen, um die Größenordnung der realistischen Werte zu bekommen.)

Das Script liefert in meinem Fall folgende Liste als Resultat:

{{34.7244, 141.0236}, {64.4882, 87.1653}, {138.8976, 95.6693}, {182.1259, 136.063}, {225.3543, 176.4566}, {287.7165, 177.1653}, {318.1889, 155.1968}}

Das sind sieben Koordinatenpaare für Punkte. Sehen wir uns die Kurve noch einmal mit ausgewählten Punkten an (Abbildung unten):

Es gibt drei Punkte auf der Kurve und vier Endpunkte von den »Anfassern«. Jede Bézierkurve in RagTime (und in anderen Programmen) ist zusammengesetzt aus einer Reihe von Segmenten, die je von vier Punkten definiert sind. Der letzte Punkt eines Segments ist immer der erste des folgenden. So eine Bézierkurve als ganzes ist also immer durch Anzahl_Segmente * 3 + 1 Punkte definiert.

Bild 1:
Polygone und Bézierkurven
Bildzuschrift 1:
Das Ergebnis von Script 1
Bild 2:
Polygone und Bézierkurven
Bildzuschrift 2:
Das Ergebnis von Script 2
Bild 3:
Polygone und Bézierkurven
Bildzuschrift 3:
Die Bézier-Beispielkurve mit ausgewählten Punkten (damit die "Anfasser" sichtbar sind)