; ; WORLD PROJECTION ON REGULAR POLYHEDRA: CUBE ; =========================================== ; ; Nr. bei Wagner: 14b ; Name: World projection on regular Polyhedra: Cube. ; Gnomonic Azimuthal Projection. ; Author: Rolf Böhm ; Direction: Inverse ; ; (C) Rolf Böhm Bad Schandau 2004, 2011, 2012 ; ; DECLARATIONS ; ============ ; ; Co-ordinates ; _name World~projection~on~regular~polyhedra/Cube _var phi ; latitide _var lambda ; longitude _var alpha ; plane polar azimuth, oblique azimuth _var delta ; plane polar distance, oblique distance _var m ; plane polar radius _var phi' ; cartographic latitude _var lambda' ; cartographic longitude, solution 1 and common _var lambda" ; cartographic longitude, solution 2 ; ; Constants ; _var phi0 ; (oblique) central point latitude _var sinphi0 ; its sine _var cosphi0 ; its cosine _var lambda0 ; (oblique) central point longitude _var lambda1 ; rotation _var scale ; map scale denominator (e. g. 1000000, not 1/1000000) _var -pi ; pi multiples and inverses _var -pi/2 _var pi/3 _var -pi/3 _var 2pi/3 _var -2pi/3 _var -pi/4 _var 3pi/4 _var -3pi/4 _var beta ; faces inclination _var -beta ; ; Cube face selection ; _var inr ; Inradius _var fcr ; Face circum radius _var snoff ; Solid number of faces _dim FCCL 6 ; Face center central lambda array _dim FCCP 6 ; Face center central phi array _dim FCCR 6 ; Face rotations _dim FCSX 6 ; Face center shift X (in inradius units) array _dim FCSY 6 ; Face center shift y (in inradius units) array _var d ; distance on face _var i ; index of face ; ; Miscelleanous ; _var sinl ; sin(lambda) _var cosl ; cosine(lambda) _var sinp ; sine(phi) _var cosp ; cosine(phi) _var dlambda ; delta lambda (=lambda-lambda0) _var sindl ; sine delta lambda _var cosdl ; cosine delta lambda _var return ; return target address _var initial ; program init flag ; ; x, y, x', y', Cx', Rx', °(, (°, pi, pi/2 etc. are pre-defined global variables ; ; INITIALISATION CODE ; =================== ; tstne initial 077$ ; ; pi multiples and inverses ; mov pi/3 pi div pi/3 3 mov 2pi/3 pi/3 mul 2pi/3 2 ; mov -pi/3 pi/3 neg -pi/3 mov -2pi/3 2pi/3 neg -2pi/3 ; mov -pi pi neg -pi mov -pi/2 -pi div -pi/2 2 ; mov -pi/4 pi/4 neg -pi/4 mov 3pi/4 pi/4 mul 3pi/4 3 mov -3pi/4 3pi/4 neg -3pi/4 ; ; Faces inclination ; mov r0 3 root r0 2 mov beta 1 div beta r0 asin beta mov -beta beta neg -beta ; ; Solid definition I: Face center lambda/phi on Earth table, Face rotations ; mov FCCL(1) -2pi/3 mov FCCP(1) beta mov FCCL(2) 0 mov FCCP(2) beta mov FCCL(3) 2pi/3 mov FCCP(3) beta mov FCCL(4) -pi mov FCCP(4) -beta mov FCCL(5) -pi/3 mov FCCP(5) -beta mov FCCL(6) pi/3 mov FCCP(6) -beta ; mov FCCR(1) 3pi/4 mov FCCR(2) -pi/4 mov FCCR(3) pi/4 mov FCCR(4) pi/4 mov FCCR(5) -pi/4 mov FCCR(6) pi/4 ; ; Solid definition II: Face center X/Y shift in the map table (in inradius units) ; mov FCSX(1) -1 mov FCSY(1) 2 mov FCSX(2) -3 mov FCSY(2) 0 mov FCSX(3) -1 mov FCSY(3) 0 mov FCSX(4) 1 mov FCSY(4) 0 mov FCSX(5) 3 mov FCSY(5) 0 mov FCSX(6) -1 mov FCSY(6) -2 ; ; Solid definition III: Main values ; mov snoff 6 ; solid number of faces. Cube: 6 mov fcr 2 ; face circumradius (not solid circumradius) root fcr 2 ; ; Dialog ; input scale Map~scale~(denominator) clip scale 1 1E12 ; ; Program setted as initialized ; mov initial 1 077$: ; ; SIMD-CODE ; ========= ; ; Scale target geometry (0.1-mm-pixels) into centered unit sphere ; --------------------------------------------------------------- ; sub x Cx' ; Image center div x Rx' ; Earth radius mul x scale ; Map scale sub y Cy' div y Ry' mul y scale ; ; x, y now on unit sphere ; ; Detect the solids face index ; ---------------------------- ; mov r0 snoff ; solid number of faces = index mov d 1E90 ; current distance ("infinite") l_cycle: mov return l_return jump .euclid ; returns the distance actual point - face center in r1 l_return: cmpgt r1 d l_continue mov d r1 ; new distance mov i r0 , new index l_continue: dec r0 tstgt r0 l_cycle jump l_end l_end: cmplt d fcr l_noout mov x' -9999 mov y' -9999 exit ; outside l_noout: ; ; now contains ... ; i ... the current face index ; d ... the distance actual point - face center ; ; Get the detected face lambda0/phi0 from table ; --------------------------------------------- ; get lambda0 FCCL i get phi0 FCCP i get lambda1 FCCR i ; mov cosphi0 phi0 ; phi0 angle functions cos cosphi0 mov sinphi0 phi0 sin sinphi0 ; ; Page the single faces in a local system ; --------------------------------------- ; get r0 FCSX i sub x r0 get r2 FCSY i sub y r2 ; ; Projection I: Cartesian x/y into Polar co-ordinates m/alpha ; ----------------------------------------------------------- ; mov alpha x div alpha y err . d_zero ; d_ error handler begin jump d_okok d_zero: mov alpha pi/2 tstgt x d_end neg alpha jump d_end d_okok: atan alpha tstgt y d_end ; If negative y then ... add alpha pi ; add 180° d_end: ; d_ error handler end 151$: power x 2 power y 2 clr m add m x add m y root m 2 ; ; Projection II: (Inverse) gnomonic projection ; -------------------------------------------- ; delta ... pole distance (90º-latitude) mov lambda alpha ; Longitude add lambda lambda1 ; Rotation mov delta m ; Latitude atan delta mov phi pi/2 sub phi delta ; ; Projection III: Pole centered phi/lambda pair into oblique delta/alpha co-ordinates ; ----------------------------------------------------------------------------------- ; ; alpha = (here) oblique longitude ; delta = (here) oblique pole distance (90º-latitude) ; ; Formulas: Fiala, Kartographische Netzentwürfe, Prague, p. 79f. ; compute constant angle functions mov sinl lambda sin sinl ; sine(lambda) mov cosl lambda cos cosl ; cosine(lambda) mov sinp phi sin sinp ; sine(phi) mov cosp phi cos cosp ; cosine(phi) ; phi' mov r1 sinp mul r1 sinphi0 mov r2 cosp mul r2 cosphi0 mul r2 cosl add r1 r2 mov phi' r1 asin phi' ; lambda 1st solution: arcsine mov r1 cosp neg r1 mul r1 sinl mov r2 phi' cos r2 div r1 r2 mov lambda' r1 ; lambda 2nd solution: arccosine mov r1 cosphi0 neg r1 mul r1 sinp mov r2 sinphi0 mul r2 cosp mul r2 cosl mov r3 phi' cos r3 add r1 r2 div r1 r3 mov lambda" r1 ; lambda by arcsine with the arccosine sign (using the FAI/full angle inversion instruction) asin lambda' lambda" add lambda' lambda0 ; ; Oblique co-ordinates from arc into degree ; ----------------------------------------- ; mul phi' (° mul lambda' (° ; ; Final Computations ; ------------------ ; mov x' lambda' mov y' phi' add x' 180 cmpgt x' -180 3$ add x' 360 3$: cmplt x' 180 4$ sub x' 360 4$: exit ; ; ; SUBROUTINES ; =========== ; ; .euclid - euclidean distance ; ---------------------------- ; ; Returns the euclidean distance between 2 Points ; P1(x, y) and P2(FCSX(i), FCSY(i)) in r1. ; x and y is a global co-ordinate pair. ; FCSX and FCSY are 2 global tables with x/y values, ; r0 is the table index i. ; .euclid: get r1 FCSX r0 sub r1 x power r1 2 get r2 FCSY r0 sub r2 y power r2 2 add r1 r2 root r1 2 jump return ; _end