; ; GLOBUSSEGMENTE ; ============== ; ; Name: Für Globussegmente nimmt man (Wagner, S. 155) den ; querachsigen abstandstreuen Zylinderentwurf ; Richtung: Inverse Transformation ; Nr.: Wagner Nr. 6 (In normaler Lage, also die gute alte quadratische Plattkarte) ; ; Das Programm übernimmt die Koordinaten eines Punktes (x/y) und transformiert ; diese in einen Punkt (x'/y'). ; ; x/y sind ebene Zielpunktkoordinaten, x'/y' geben die geogr. Breite und Länge ; der Position auf der Quell-Erdkugel, auf der der Zielpunkt gelesen werden ; kann. ; ; Es werden ein Maßstab und die Anzahl der Segmente abgefragt. Bei gerader Segmentzahl wird ; der Mittelmeridian auf eine Segmentgrenze, bei ungerader Segmentzahl auf eine Segment- ; mitte gestellt. So gibt es am Kartenrand keine geteilten Halbsegmente. ; ; Es sind 3 bis 360 Segmente möglich. ; ; Literatur: ; Wagner: Kartographische Netzentwürfe, Leipzig: Bibliographisches Institut 1949 ; Fiala: Mathematische Kartographie, Berlin: Verlag Technik 1957 ; (C) Rolf Böhm 2004 ; Benutzte Variablen ; ================== ; ; Name ; _name Globussegmente ; ; Winkel der Formeln ; _var phi ; Geographische Breite _var lambda ; Geographische Länge _var phi' ; Kartographische Breite _var alpha ; " (Bei Wagner so, ohne ') _var delta' ; Kartographische Poldistanz _var delta ; " (Bei Wagner ohne ') _var lambda' ; Kartographische Länge in 4 Varianten _var lambda0 ; Null-Länge ; ; Temporäre Variablen ; _var t1 ; Temporäre Variablen _var t2 _var t3 _var t4 ; ; Hauptvariablen der Segmentierung ; _var anzahl ; Anzahl der Globussegmente _var schrittweite ; Abstand der Globussegmente in Grad _var grenzmeridian ; Aussenmeridian eines Segmentes im Gradmaß _var -grenzmeridian ; und dessen Negativum _var evenflag ; 1: anzahl gerade, 0: anzahl ungerade ; ; Interne Segmentvariablen ; _var seg-num ; Segmentnummer _var seg-off ; Segmentoffset _var seg-step ; Segmentsprung _var seg-width ; Segmentbreite im Bogenmaß _var seg-width° ; Segmentbreite im Grad _var half-seg-width ; Halbe Segmentbreite im Bogenmaß _var half-seg-width° ; Halbe Segmentbreite in Grad _var seg-shift ; 1/2 Segmentbreite, wenn anzahl gerade ist _var seg-shift° ; dasselbe im Gradmaß ; ; Sonst noch ... ; _var 2pi _var -pi/2 _var -pi _var phase ; Phasensprung, der Arkusfunktionen-Mehrdeutigkeit hebt _var scale ; Kartenmaßstabszahl (also 1000000, nicht 1/1000000) _var initial ; 0: Programm nicht initialisiert, 1: initialisiert _var ------- ; End of Symbol Table ; ; x, y, x', y', Rx', Ry', °(, (°, pi, pi/2 etc. sind vordefinierte globale Konstanten ; ; Initialisierung ; =============== ; tstne initial 77$ ; ; Dialog ; input scale Globussegmente\\Maßstabszahl input anzahl Anzahl~der~Globussegmente~(3~...~360,~Standard:~12)\\(Wenn~gerade,~wird~die~Bildmitte~Segmentgrenze,~wenn~ungerade,~Segmentmitte) input lambda0 Mittelpunktslänge~in~Grad~(-180~...~180) tstne anzahl 66$ mov anzahl 12 66$: ; Eingegebene Werte auf Min/Max bringen und in Bogenmaß umrechnen ; clip scale 1 1E12 clip anzahl 3 360 clip lambda0 -180 180 ; ; Pi-Konstanten ; mov 2pi pi mul 2pi 2 mov -pi/2 pi/2 neg -pi/2 mov -pi pi neg -pi ; ; Feststellen, ob Segmentanzahl gerade oder ungerade ; clr evenflag mov t1 anzahl div t1 2 frac t1 tstne t1 67$ mov evenflag 1 67$: ; Segmentberechnungen ; ; Hauptvariablen mov schrittweite 360 div schrittweite anzahl mov grenzmeridian schrittweite div grenzmeridian 2 mov -grenzmeridian schrittweite neg -grenzmeridian div -grenzmeridian 2 ; Interne Variablen mov seg-width 2pi div seg-width anzahl mov half-seg-width seg-width div half-seg-width 2 mov seg-width° seg-width mul seg-width° (° mov half-seg-width° seg-width° div half-seg-width° 2 clr seg-shift clr seg-shift° tsteq evenflag 68$ mov seg-shift half-seg-width mov seg-shift° half-seg-width° 68$: ; Programm ist initialisiert ; mov initial 1 77$: ; ; SIMD-Laufbereich ; ================ ; ; Maßstab, Kartenmittelpunkt etc. einrechnen ; ------------------------------------------ sub x Cx' ; Bildmittelpunkt div x Rx' ; Erdradius mul x scale ; Kartenmaßstab sub y Cy' div y Ry' mul y scale ; ; Vorbereitungsarbeiten ; --------------------- ; ; Oberhalb Nordpol und unterhalb Südpol ist ausserhalb ; mov t1 y abs t1 cmpgt t1 pi/2 out ; ; Trennung von x in Segmentnummer seg-num und Segmentoffset seg-off ; ; Das Mittelsegment hat die Nummer 0 und es wird von W nach O ganzzahlig gezählt. ; Der Segmentoffset ist der Winkel ab Mittelmeridian innerhalb jeden Segmentes im Bogenmaß. ; ; Dann gibt noch einen Segmentsprung seg-step. Das ist ein Winkel, der nach der Berechnung, ; (die ja innerhalb eines Segmentes erfolgt) addiert wird, um von Segment zu Segment ; zu springen. Da diese Addition erst ganz am Ende erfolgt, steht der seg-step im Gradmaß. ; ; Das Verfahren ähnelt der Abtrennung von Zehner und Einer in einer zweistelligen Zahl mit ; Division und Modulö, allerdings erfolgt statt Abschneiden Runden (per Addition von 0.5). ; mov t1 x ; geographische Länge add t1 seg-shift ; Bei gerader Segmentzahl 1/2 Segment verschieben so, ; dass im Mittelmeridian eine Segmentgrenze liegt ; und im Gegenmeridian kein Segment zerschnitten wird. add t1 2pi ; *) 0 ... 360° --> 360 ... 720° (um Negativa zu meiden) add t1 half-seg-width ; Mitte wird so rechter Rand mov t2 t1 ; Kopie für unten **) div t1 seg-width ; Der div erzeugt die Segmentnummer fix t1 ; Der fix macht eine Ganzzahl draus sub t1 anzahl ; Den Vollkreis von oben *) wieder wegnehmen mov seg-num t1 ; Wegschaffen cmod t2 0 seg-width ; So wird **) der Offset sub t2 half-seg-width ; Mitte wird so rechter Rand mov seg-off t2 ; Wegschaffen mov x seg-off ; Mit dem Segmentoffset wird als x gerechnet mov seg-step seg-num ; Segmentsprung ist Segmentnummer mul seg-step seg-width° ; mal Segmentbreite. Und gleich noch Umrechnung in ° ; ; Abtrennung eines Vollphasensprunges phase aus der geographischen Länge ; ; Unten gibt es einen Arkussinus, der mehrdeutig ist, und dafür bereiten wir eine Variable phase vor ... ; clr phase cmplt x pi/2 97$ mov phase pi 97$: cmpgt x -pi/2 98$ mov phase -pi 98$: ; ; Der eigentlicher Entwurf (invers), was einigermaßen trivial ist ; --------------------------------------------------------------- ; mov lambda x ; Geographische Länge mov phi y ; Geographische Breite ; ; Bild um 90° drehen um den querachsig liegenden Zylinder aufzurichten ; -------------------------------------------------------------------- ; ; Der Anwender erwartet "stehende" Segmente (bei denen Norden oben ist) ; mov t1 lambda mov lambda phi mov phi t1 ; ; Umrechnung in querachsige Lage ; ------------------------------ ; ; Ein wenig sphärische Trigonometrie. Siehe Wagner S. 105. ; (Die nur wenig ins Konzept passenden Variablennamen alpha und delta ; stammen von Wagner.) ; mov t1 phi cos t1 mov t2 lambda sin t2 mul t1 t2 ; cos(phi)*sin(lambda) acos t1 mov delta t1 ; Das delta von Wagner mov t1 phi sin t1 ; sin(t1) mov t2 delta sin t2 mov alpha t1 div alpha t2 ; sin(phi)/sin(delta) asin alpha ; Im Wagner steht ein Cosinus, aber der verschiebt um 90° Phase ; und spiegelt -- klarer Fall: Sinus nehmen. add alpha phase ; Hebt die Mehrdeutigkeit des Arkussinus mov phi' pi/2 ; phi' ... sub phi' delta ; ... übernehmen mov lambda' alpha ; lambda' übernehmen ; ; Schlussarbeiten ; --------------- ; ; In Gradmaß umrechnen ; mul phi' (° mul lambda' (° ; ; Wenn Länge ausserhalb, dann wegspringen ... ; ; (Dies erzeugt die Leerflächen zwischen den Segmenten) ; cmplt lambda' -grenzmeridian out cmpgt lambda' grenzmeridian out ; ; Den Segmentsprung hineinrechnen ; ; (So entstehen die einzelnen Segmente) ; add lambda' seg-step sub lambda' seg-shift° ; Den Shift wieder rausrechnen ; ; Lambda um lambda0 kreisen lassen ; add lambda' lambda0 cmod lambda' -180 180 ; ; Die Ergebnissse wegschaffen ; mov x' lambda' mov y' phi' exit ; Reguläres Programmende ; ; Ausserhalb ; ---------- out: mov x' -9999 mov y' -9999 exit ; Ausserhalb-Programmende _end