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