Transformationen von Grafikobjekten

Von Jürgen Schell. | 18 Juni, 2009 - 14:12
Beschreibung:

Alle Transformationen in RagTime wirken auf das Zeichnungsobjekt einschließlich seiner Linienstärken und ggf. auch auf die Darstellung seines Inhalts. Schreibt man in einem gespiegelten Rahmen, erscheint auch der Text spiegelverkehrt. Ebenso erscheint Text in einem gescherten Rahmen selbst geschert.

Skalieren eines Objekts:

tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          set Rechteck to (make new rectangle at beginning with data {200, 250, 300, 400})
          set vertical scaling of Rechteck to 3
          set horizontal scaling of Rechteck to 3
     end tell
end tell

Vertikale und horizontale Skalierung werden einzeln gesetzt. Die Zahl ist einfach der Faktor der Skalierung. Ein Skalierungsfaktor -1 spiegelt das Objekt.

Rotieren eines Objekts:

tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          set Rechteck to (make new rectangle at beginning with data {200, 250, 300, 400})
          set rotation of Rechteck to 45 / 360
     end tell
end tell

Das Script legt ein Rechteck an und dreht es um 45° im Uhrzeigersinn. Beachten Sie den Ausdruck »45 / 360«. RagTime behandelt 1 als vollständige 360°-Drehung. 0.5 dreht also um 180°, 0.25 um 90° usw.

Scheren eines Objekts

tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          set X to 15 / 360
          set Rechteck to (make new rectangle at beginning with data {200, 250, 300, 400})
          set horizontal skewing of Rechteck to X
     end tell
end tell

Das Script legt ein Rechteck an und schert es um 15°. Die maximale Scherung, die RagTime akzeptiert ist ± 63,4° (± 0,1762). Wieder sind 360° auf 1 normiert, deshalb der Ausdruck »15 / 360«.

Lassen Sie sich nicht davon verwirren, dass nach den Setzen einer Transformation die anschließende Abfrage bisweilen etwas anderes liefert. Die Transformation eines Objekts ist letztlich eine 2*2 Matrix. Und mehrere Einzeloperationen führen zur selben Matrix. Wenn RagTime dann wieder rückwärts rechnet, können die Einzeltransformationen anders aussehen:

tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          set X to 30 / 360
          set Rechteck to (make new rectangle at beginning with data {200, 250, 300, 400})
          set vertical skewing of Rechteck to X
          
          vertical skewing of Rechteck
          --> 0.0
          horizontal skewing of Rechteck
          --> 0.0833
          vertical scaling of Rechteck
          --> 0.866
          horizontal scaling of Rechteck
          --> 1.1547
          rotation of Rechteck
          --> 0.0833
          transformation matrix of Rechteck
          --> {1.0, 0.5773, 0.0, 1.0}
     end tell
end tell

Das Rechteck wird ursprünglich um 30° vertikal geschert. Fragt man anschließend die Eigenschaften ab, ist die vertikale Skalierung zu 0 geworden, alle anderen Eigenschaften sind allerdings anders. Die Kombination von Scherung, Skalierung und Drehung, die das Script zurück meldet, ist tatsächlich äquivalent zu einer 30° vertikalen Scherung. Die Matrix wird im Script im letzten Schritt abgefragt. Sollen mehrere Objekte mit gleichen Transformationen erzeugt werden, ist es oft am einfachsten, ein Objekt mit den vertrauten Techniken (drehen, skalieren) anzulegen, dann dessen Matrix abzufragen und anschließend die weiteren Objekte mit dieser Matrix zu erzeugen.

Sollen Objekte gleich mit einer Transformation erzeugt werden (schneller, weniger Bildschirm-Updates), sieht die Syntax wie folgt aus:

tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          set X to {1.0, 0.5773, 0.0, 1.0}
          set Rechteck to (make new rectangle at beginning with data {200, 250, 300, 400} with properties {transformation matrix:X})
     end tell
end tell