1\subsection{Ganzzahlige Koordinatenwerte}
2Für die Speicherung von Koordinaten werden ganzzahlige Werte verwendet.
3Da für den Export und einige Berechnungen aber eine Wandlung in
4Gleitkommazahlen erfolgen muss, können nur 32"=Bit"=Werte verwendet
5werden, da diese verlustfrei zum Datentyp double konvertiert werden können.
6Für 64"=Bit"=Werte ist dies nicht der Fall, da double"=Zahlen nur 51 Bits
7für das Mantissenfeld verwenden, also 52 Bit darstellen können.
8
9\subsection{Gitter und Auflösung}
10\subsubsection{Anforderungen an die Auflösung}
11\label{sec:aufloesung}
12Die Auflösung (Anzahl der wxd"=Einheiten pro Zoll bzw. pro Zentimeter)
13ist ein Kompromiss zwischen zwei verschiedenen Anforderungen:
14\begin{itemize}
15\item	Eine hohe Auflösung erlaubt feines Zeichnen.
16\item	Da aber für Koordinaten nur ein Zahlenbereich
17\(-2^{31}\ldots(2^{31}-1)\) zur Verfügung steht, erlaubt eine
18niedrige Auflösung eine größere Ausdehnung der Zeichnung.
19\end{itemize}
20Das Zeichenprogramm soll sowohl Positionierung im metrischen System
21(Zentimeter, Millimeter) als auch im Zollsystem ermöglichen.
22Um das Gitter dynamisch an den Zoom"=Faktor anpassen zu können -- und dies
23sowohl für cm"= als auch für Zoll"=Gitter und sowohl für Zehnerpotenz"=
24als auch für Zweierpotenzteilung -- muss die Anzahl der wxd"=Einheiten
25pro Zentimeter und pro Zoll durch mehrere Zehner"= und Zweierpotenzen
26teilbar sein.
27
28\subsubsection{Herleitung der Auflösung}
29Um sowohl mit cm als auch mit Zoll arbeiten zu können, wird die
30Basislänge \(b=\tfrac{1}{5}\,\text{mm}\) benutzt.
31Bei dieser Basislänge handelt es
32sich um den größten gemeinsamen Teiler von 1\,cm und 1\,Zoll.
33
34Ein Zentimeter ergibt sich aus 50\,\(b\), ein Zoll aus 127\,\(b\).
35
36Die Auflösung (wxdkdraw"=Einheiten pro Zoll) muss somit den Faktor
37\begin{align*}
38f_{\text{Zoll/cm}}=127
39\end{align*}
40enthalten, damit sich bei der Multiplikation mit
41\(\tfrac{50}{127}\)
42wieder ein ganzzahliger Wert für die Anzahl der wxdkdraw"=Einheiten
43pro Zentimeter ergibt.
44
45Bei einem Zoomfaktor von 1 (100\,\%) wird ein Zoll zur Bildung des
46Magnetgitters wahlweise in
478 (\(2^3\)) oder 10 (\(2\cdot{}5\)) Schritte unterteilt.
48Ein Zentimeter wird wahlweise in 4 (\(2^2\)) oder 5 (\(5^1\)) Schritte
49unterteilt, um das Magnetgitter zu bilden.\\
50Da nur eine der 4 Möglichkeiten eintreten kann, genügt es, das kleinste
51gemeinsame Vielfache der vier Werte als Faktor in der Auflösung zu
52verwenden:
53\begin{align*}
54f_{\text{Gitter,Zoll,8}}&=2^3\\
55f_{\text{Gitter,Zoll,10}}&=2\cdot{}5\\
56f_{\text{Gitter,cm,4}}&=2^2\\
57f_{\text{Gitter,cm,5}}&=5\\
58f_{\text{Gitter}}&=\text{kgV}(f_{\text{Gitter,Zoll,8}},f_{\text{Gitter,Zoll,10}},f_{\text{Gitter,cm,4}},f_{\text{Gitter,cm,5}})\\
59&=2^3\cdot{}5
60\end{align*}
61
62Mit 14 Zoomstufen beim Hineinzoomen wird der Zoomfaktor von \(1\) bis
63auf \(2^7=128\) erhöht. Das Magnetgitter folgt dem Zoom,
64der Magnetgitterschritt
65wird dabei um den Faktor \(\tfrac{1}{2^7}=\tfrac{1}{128}\) kleiner.
66Damit sich auch dabei
67noch eine ganze Zahl ergibt, muss unser Wert für die Auflösung den Faktor
68\begin{align*}
69f_{\text{Zoom,dual}}&=2^7
70\end{align*}
71enthalten.
72
73Soll der Zoomfaktor dezimal auf \(100\) erhöht werden, wird der
74Magnetgitterschritt durch 100 dividiert. Um dabei ein ganzzahliges
75Ergebnis zu erzeugen, muss die Auflösung den Faktor
76\begin{align*}
77f_{\text{Zoom,dezimal}}&=2^2\cdot{}5^2
78\end{align*}
79enthalten.
80
81Da entweder im Dualsystem oder im Zehnersystem gezoomt wird, ergibt sich
82der für den Zoom erforderliche Faktor wiederum als kleinstes gemeinsames
83Vielfaches der beiden vorangegangenen Werte zu
84\begin{align*}
85f_{\text{Zoom}}&=\text{kgV}(f_{\text{Zoom,dual}},f_{\text{Zoom,dezimal}})\\
86&=2^7\cdot{}5^2
87\end{align*}
88
89Der Gesamtwert für die Auflösung ergibt sich zu
90\begin{align*}
91r&=f_{\text{Zoll/cm}}\cdot{}f_{\text{Gitter}}\cdot{}f_{\text{Zoom}}\\
92&=2^{10}\cdot{}5^3\cdot{}127\\
93&=16256000
94\end{align*}
95\clearpage
96\textbf{Probe:}\\*
97Die nachfolgende Tabelle zeigt, dass sich für alle Kombinationen aus
98Gittereinstellung (Zoll oder Zentimeter), Gitterunterteilung (4 oder 5)
99bei den maximalen Zoomfaktoren 128 und 100 noch ganzzahlige Werte für
100den Magnetgitterabstand ergeben.\\*[1em]
101\begin{tabular}{|ccccc|}
102\hline
103Gittereinstellung&Gitteraufteilung&Zoomfaktor&Magnetgitterabstand&Ergebnis\\
104\hline
105\hline
106&&&&\\[-0.8em]
107Zoll&4&128&\(\frac{16256000}{8\cdot{}128}\)&15875\\[0.4em]
108Zoll&5&128&\(\frac{16256000}{10\cdot{}128}\)&12700\\[0.4em]
109cm&4&128&\(\frac{6400000}{4\cdot{}128}\)&12500\\[0.4em]
110cm&5&128&\(\frac{6400000}{5\cdot{}128}\)&10000\\[0.4em]
111Zoll&4&100&\(\frac{16256000}{8\cdot{}100}\)&20320\\[0.4em]
112Zoll&5&100&\(\frac{16256000}{10\cdot{}100}\)&16256\\[0.4em]
113cm&4&100&\(\frac{6400000}{4\cdot{}100}\)&16000\\[0.4em]
114cm&5&100&\(\frac{6400000}{5\cdot{}100}\)&12800\\[0.4em]
115\hline
116\end{tabular}~\\[1em]
117
118Mit 32"=Bit"=Koordinaten kann die maximale Höhe und Breite einer
119Zeichnung somit 6710\,mm bzw. 264\,Zoll betragen.
120Werden nur positive Koordinaten benutzt, halbieren sich die Werte.
121\clearpage
122\subsection{Caching}
123In wxdkdraw werden 3 verschiedene Caches (Bitmaps) benutzt:
124\begin{itemize}
125\item	Gitter\\
126Die "`tiefstgelegenen"' Zeichenoperationen zeichnen den Grenzbereich in
127hellblau, den Zeichnungshintergrund in hellgrau und das optische Gitter
128in Form von horizontalen und vertikalen Linien.\\
129Das Ergebnis dieser Zeichenoperationen wird in einem Bitmap zwischengespeichert.
130Das Bitmap wird nur bei Bedarf neu erzeugt, z.\,B. beim Scrollen oder Zoomen.
131\item	Zeichnung\\
132Die "`mittleren"' Zeichenoperationen übertragen zunächst den Gitter"=Cache
133und zeichnen darauf die Graphikelemente, evtl. mit Ausnahme gerade bearbeiteter
134Elemente. Das Ergebnis dieser Operationen wird wiederum in einem Bitmap
135zwischengespeichert.
136\item	Markup\\
137Die "`obersten"' Zeichenoperationen übertragen zunächst den Zeichnungs"=Cache
138und zeichnen darüber das Markup, z.\,B. den wxdkdraw"=Cursor,
139die Platzierungshilfe und gerade zu kopierende/verschiebende Graphikelemente
140bzw. Markierungen für Kandidaten von Kopier"=/Verschiebe"=/Löschoperationen.
141Auch das Ergebnis dieser Operationen wird in einem Bitmap zwischengespeichert.
142\end{itemize}
143Bei Änderungen an der Zeichnung wird vermerkt, bei welchem der drei Caches
144ein Neuzeichnen erforderlich ist.
145\clearpage
146\subsection{Pfeilspitzen}
147\figimage{ahcalc2}{Längenkorrektur für Pfeilspitzen}
148In der Exportdatei soll eine qualitativ hochwertige Ausgabe erzeugt werden.
149Hierbei sollen die Pfeilspitzen exakt am angegebenen Endpunkt einer Linie
150enden.\\
151An gekrümmten Linien (Kreisbögen und X"=Splines) sollen die Pfeilspitzen der Krümmung folgen.
152
153Dies ist insbesondere für X"=Splines mit aufwendigen Berechnungen verbunden,
154bei denen Näherungsverfahren eingesetzt werden müssen. Dies ist für das
155Export"=Programm wxd2lat akzeptabel, für das interaktive Zeichenprogramm
156wxdkdraw aber nicht, denn hier würden diese Berechnungen zu Stockungen beim
157Scrollen und beim Bewegen von Linien führen. Im Zeichenprogramm wird daher
158nur eine Näherung der Pfeilspitze dargestellt.
159\clearpage
160
161\subsubsection{Notwendigkeit der Längenkorrektur}
162Abb.~\vref{fig:ahcalc2} zeigt eine von links kommende Linie, die in Punkt
163\(P_0\) endet. An diese Linie wird eine Pfeilspitze angefügt, die als
164Polylinie \(P_1\)\ldots\(P_0\)\ldots\(P_2\) gezeichnet wird.
165Zum Zeichnen der Pfeilspitze wird dieselbe Linienbreite \(l\) verwendet
166wie für die eigentliche Linie.
167Wie man sieht, endet die Pfeilspitze im Punkt \(P_E\), der um die
168Länge \(s\) von \(P_0\) entfernt ist.\\
169Der in der WXD"=Datei angegebene Endpunkt ist der Punkt \(P_E\). Die
170eigentliche Linie muss also leicht gekürzt werden, so dass sie im
171Bereich zwischen \(P_{\text{A}}\) und \(P_{\text{B}}\) endet.
172
173Bezeichnet man den Öffnungswinkel der Pfeilspitze
174(Winkel zwischen den zwei Schenkeln der Pfeilspitze)
175mit \(\alpha\),
176so erhält man:
177\begin{align*}
178\frac{l}{2}&=s\cdot\sin{\left(\frac{\alpha}{2}\right)}
179\end{align*}
180Sind Endpunkt \(P_E\), Linienbreite \(l\) und Öffnungswinkel \(\alpha\)
181vorgegeben, so muss der Punkt \(P_0\) für das Zeichnen der Pfeilspitze
182den Abstand
183\begin{align*}
184s&=\frac{\tfrac{l}{2}}{\sin{\left(\tfrac{\alpha}{2}\right)}}=\frac{l}{w}\hksqrt{{l_{\text{a}}}^2+\tfrac{1}{4}{w_{\text{a}}}^2}
185\end{align*}
186zu \(P_E\) haben. Die Punkte \(P_1\) und \(P_2\) können dann über
187die Pfeilspitzenlänge und -breite berechnet werden.
188
189Die eigentliche Linie -- die noch vor der Pfeilspitze gezeichnet
190werden sollte -- muss zwischen den Punkten \(P_A\) und \(P_B\)
191bzw. auf einem dieser Punkte enden.
192Die Entfernung von \(P_A\) zu \(P_E\) beträgt \(2s\), die
193Entfernung von \(P_B\) zu \(P_E\) ergibt sich als \(c_{\text{min}}\) zu:
194\begin{align*}
195\frac{\tfrac{l}{2}}{c_{\text{min}}}&=\tan{\left(\frac{\alpha}{2}\right)}=\frac{w_{\text{a}}}{2l_{\text{a}}}\\[0.2em]
196c_{\text{min}}&=\frac{\tfrac{l}{2}}{\tan{\left(\tfrac{\alpha}{2}\right)}}=\frac{l\cdot{}l_{\text{a}}}{w_{\text{a}}}&c_{\text{min}}&\leq s\\[0.2em]
197c_{\text{max}}&=2s\\
198\intertext{Für Polylinien und Kreisbögen ist eine exakte Berechnung möglich, hier wird}
199c&=c_{\text{min}}\\
200\intertext{verwendet. Für X"=Splines sind Näherungsberechnungen erforderlich, hier gilt:}
201c&=\tfrac{1}{2}(c_{\text{max}}+c_{\text{min}})\\[0.2em]
202\Delta c&=\tfrac{1}{2}(c_{\text{max}}-c_{\text{min}})
203\end{align*}
204\clearpage
205\subsubsection{Längenkorrektur für Pfeilspitzen an Linien}
206Die Längenkorrektur um die Länge \(c\) an einer Linie von
207\(P_0(x_0,y_0)\) nach \(P_1(x_1,y_1)\)
208wird mit Hilfe folgender Formeln durchgeführt:
209\begin{align*}
210l&=\hksqrt{{(x_1-x_0)}^2+{(y_1-y_0)}^2}&q&=\frac{l-c}{l}\\
211\intertext{für nichtnegative \(q\) gilt dann:}
212x_1'&=x_0+q(x_1-x_0)&y_1'&=y_0+q(y_1-y_0)\\
213\end{align*}
214