Punktdefinitionen für fortgeschrittene Aufgaben

Es ist jedoch nicht nötig, jede einzelne Punkteposition durch einen neuen \special-Befehl festzulegen, vielmehr ist das Kommando setpoint selbst in der Lage, Punktpositionen durch Angabe von Koordinaten zu definieren. Das obige Bild hätte auch so erzeugt werden können:

\setunitlength{1cm}
\centerline{\picture(5,2){\special{gr setpoint 0 1[4,2];
  poly 0,1}}}

Dieses Beispiel soll zeigen, daß es möglich ist, beliebig viele Punktpositionen durch ein einziges setpoint-Kommando festzulegen. Zum anderen sieht man, daß es möglich ist, zur Punktenummer zusätzlich eine x- und eine y-Koordinate anzugeben. Die Maßeinheit dieser Koordinatenangaben wird durch das Kommando setunitlength festgelegt, falls die Angaben Gleitpunktwerte sind. Wahlweise könnte auch eine andere gültige TEX-Längenangabe wie 0.3 true cm benutzt werden. In diesem Fall wurden die Offsets durch das TEX-Macro \setunitlength festgelegt.

Eine weitere Möglichkeit, das obige Bild zu erzeugen, ist:

\setunitlength{1cm}
\centerline{\picture(5,2){\special{gr setpoint 0, [4,2];
  poly 0,1}}}

Wie man sieht, ist die Punktenummer des zweiten gesetzten Punktes weggelassen, allerdings steht nun ein Komma zwischen beiden Angaben, da dies sonst wie 0[4,2] gelesen würde. Werden Punktenummern nicht angegeben, so numerieren DVI und DVILW die Punkte automatisch in aufsteigender Reihenfolge. Dies ermöglicht auch folgende Eingabe:

\setunitlength{1cm}
\centerline{\picture(5,2){
  \special{gr setpoint [0,0] [4,2]; poly @2}}}

Hier sind überhaupt keine Punktenummern mehr angegeben. Natürlich ist diesem Zusammenhang nicht mehr unbedingt klar, welche Punktenummern der Treiber verwendet hat, denn dies hängt ja davon ab, welche Punktenummern in vorangegangenen Bildern verwendet wurden. Deshalb wurde im poly-Kommando anstatt einer Liste von Punkten der Ausdruck @2 verwendet, der besagt, daß die Punkteliste aus den beiden zuletzt gesetzten Punkten besteht. Auch der Ausdruck @-2 wäre an dieser Stelle möglich gewesen. In diesem Fall wäre der interne Punktezähler des Treibers wieder um den Wert 2 zurückgesetzt worden.

Die 1cm
\begin{picture}(3,3)
\special{gr setpoint 0, [3,3], [0,3]; poly 0,1; poly [0,1]1/2, 2;}
\end{picture}
nächste Aufgabe besteht darin, Punkte auf einer Linie als Ausgangspunkte anderer Linien zu verwenden, wie links im Bild zu sehen ist.

Der Code, der dieses Bild erzeugte, hat folgendes Aussehen:

\setunitlength{1cm}
\centerline{\picture(3,3){
  \special{gr setpoint 0, [3,3], [0,3];
    poly 0,1; poly [0,1]1/2, 2;}}}

Setzt man statt einer Punktnummer den Ausdruck [p, q]λ ein, so wird damit der Punkt p(1 - λ) + spezifiziert. [0,1]1/2 ist also der Punkt genau in der Mitte zwischen den Punkten 0 und 1. Für λ 1cm
\begin{picture}(3,3)
\special{gr setpoint 0[0,2] [1,2] [1,3] [0,3]
[2,0] [3,0] [3,1] [2,1]; closedpoly 0-3; closedpoly 4-7}
\end{picture}
kann übrigens ein beliebiger AusdruckA.1stehen, der z.B. aus reellen Zahlen, den vier Grundrechenarten und runden Klammern gebildet wird. Anstatt der Punktenummern p und q kann auch wieder ein Ausdruck der Form [p', q']λ' stehen.

Jetzt soll folgendes Problem gelöst werden: Zwei Quadrate sind wie in der Abbildung links gegeben, die übrigens folgendermaßen erzeugt wurde:

\setunitlength{1cm}
\centerline{\picture(3,3){
  \special{gr setpoint 0[0,2] [1,2] [1,3] [0,3]
                        [2,0] [3,0] [3,1] [2,1];
              closedpoly 0-3; closedpoly 4-7}}}

1cm
\begin{picture}(3,3)
\special{gr setpoint 0[0,2] [1,2] [1,3] [0,3]
[2,0] [3,0] [...
...linecap round arrow; poly [0,1]1/2, ([0,1]1/2,[4,7]1/2), [4,7]1/2}
\end{picture}
Das linke obere Quadrat hat die Eckpunkte 0,1,2,3 das rechte untere die Eckpunkte 4,5,6,7. Nun soll ein Pfeil von der Mitte der Unterkante des linken Quadrats zur Mitte der linken Kante des rechten Quadrats gezeichnet werden. Dies geschieht durch folgenden zusätzlichen Befehl im \special-Kommando mit dem Ergebnis, das links zu sehen ist.

setlinecap round arrow;
poly [0,1]1/2, ([0,1]1/2,[4,7]1/2), [4,7]1/2

Die Schreibweise (p, q) spezifiziert einen Punkt, der die x-Koordinate von p und die y-Koordinate von q besitzt. Selbstverständlich kann auch diese Schreibweise wieder beliebig geschachtelt werden. Das Kommando setlinecap round arrow dient lediglich der Darstellung von Pfeilspitzen am hinteren Ende einer Linie. Die verschiedenen Möglichkeiten, Linienenden zu gestalten, werden später gesondert besprochen. Eine andere Möglichkeit, den Pfeil zu erhalten, stellt folgendes DVI/DVILW-Kommando dar:

poly [0,1]1/2, (@,[4,7]1/2), (4,@)

Das Symbol @ steht bei einem Linienkommando wie poly für den in der Punkteliste zuletzt spezifizierten Punkt, im ersten Fall also für den Punkt [0,1]1/2 und im zweiten Fall für den Punkt ([0,1]1/2,[4,7]1/2).