; ; WORLD PROJECTION ON REGULAR POLYHEDRA: OCTAHEDRON (POLAR) ; ========================================================= ; ; Nr. bei Wagner: 14b ; Name: World projection on regular Polyhedra: Octahedron (polar). ; 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/Octahedron~(polar) _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 angle _var scale ; map scale denominator (e. g. 1000000, not 1/1000000) _var beta ; upper faces normal angle _var -beta ; lower faces normal angle _var -pi/2 _var -pi/4 _var pi/3 _var -pi/3 _var 2pi/3 _var -2pi/3 _var pi/6 _var -pi/6 _var 6/r6 ; 6/root(6) _var r3/2 ; root(3)/2 _var a ; Face triangle side length _var h ; Face triangle heigth _var a/4 _var 3a/4 _var 5a/4 _var -a/4 _var -3a/4 _var -5a/4 _var h/6 _var 5h/6 _var -h/6 _var -5h/6 ; ; Cube face selection ; _var inr ; Inradius _var fcr ; Face circum radius _var snoff ; Solid number of faces _dim FCCL 8 ; Face center central lambda array _dim FCCP 8 ; Face center central phi array _dim FCCR 8 ; Rotation array _dim FCSX 8 ; Face center shift X (in inradius units) array _dim FCSY 8 ; 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$ ; ; constants ; mov r0 1 div r0 3 neg r0 acos r0 ; octahedron side face -- face angle sub r0 pi/2 mov beta r0 mov -beta beta neg -beta ; mov -pi/2 pi/2 neg -pi/2 mov -pi/4 pi/4 neg -pi/4 mov pi/3 pi div pi/3 3 mov -pi/3 pi/3 neg -pi/3 mov 2pi/3 pi/3 mul 2pi/3 2 mov -2pi/3 -pi/3 mul -2pi/3 2 mov pi/6 pi div pi/6 6 mov -pi/6 pi/6 neg -pi/6 ; mov r0 6 root r0 2 mov 6/r6 6 div 6/r6 r0 ; mov r3/2 3 root r3/2 2 div r3/2 2 ; mov a 6/r6 ; triangle side a in inradius units ; mov a/4 a div a/4 4 mov 3a/4 a/4 mul 3a/4 3 mov 5a/4 a/4 mul 5a/4 5 mov -a/4 a/4 neg -a/4 mov -3a/4 3a/4 neg -3a/4 mov -5a/4 5a/4 neg -5a/4 ; mov h a mul h r3/2 ; mov h/6 h div h/6 6 mov 5h/6 h/6 mul 5h/6 5 mov -h/6 h/6 neg -h/6 mov -5h/6 5h/6 neg -5h/6 ; ; Solid definition I: Face center lambda/phi on Earth table ; mov FCCL(1) 0 mov FCCP(1) pi/2 mov FCCL(2) pi mov FCCP(2) -beta mov FCCL(3) -2pi/3 mov FCCP(3) beta mov FCCL(4) -pi/3 mov FCCP(4) -beta mov FCCL(5) 0 mov FCCP(5) beta mov FCCL(6) pi/3 mov FCCP(6) -beta mov FCCL(7) 2pi/3 mov FCCP(7) beta mov FCCL(8) -pi/3 mov FCCP(8) -pi/2 ; mov FCCR(1) 0 mov FCCR(2) 0 mov FCCR(3) 0 mov FCCR(4) 0 mov FCCR(5) 0 mov FCCR(6) 0 mov FCCR(7) 0 mov FCCR(8) 0 ; ; Solid definition II: Face center X/Y shift in the map table (in inradius units) ; mov FCSX(1) a/4 mov FCSY(1) 5h/6 mov FCSX(2) -5a/4 mov FCSY(2) -h/6 mov FCSX(3) -3a/4 mov FCSY(3) h/6 mov FCSX(4) -a/4 mov FCSY(4) -h/6 mov FCSX(5) a/4 mov FCSY(5) h/6 mov FCSX(6) 3a/4 mov FCSY(6) -h/6 mov FCSX(7) 5a/4 mov FCSY(7) h/6 mov FCSX(8) -a/4 mov FCSY(8) -5h/6 ; ; Solid definition III: Main values ; mov snoff 8 ; solid number of faces. Octahedron: 8 mov inr 1 ; insphere is the unit sphere mov fcr h ; face circumradius mul fcr 2 div fcr 3 ; ; 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/rotation from table ; ------------------------------------------------------ ; get lambda0 FCCL i ; lambda0 get phi0 FCCP i ; phi0 get lambda1 FCCR i ; rotation ; 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