Byte magazine published an edition centred on graphics and map projection. Back then I didn't have acceess to an adequate computer, nor to the necessary data. It stayed on my back-burner as a 'to-do'. I kept that copy, even though I threw away most of the other months and years.
In the last year I experimented with scanning text and OCR-ing it to recover text. The ( early) BASIC had been printed on a dot-matrix printer for Byte, and not with 100% clarity. However I was able to make a good enough version to be able to correct the OCR and edit to the more modern Liberty BASIC. And remove all those line numbers, labels, and capital letters! I also found that the published version had some errors and contradictions in the published sub-routines, and confused radians and degrees.
Nowadays you can easily download lat/lon data off the 'net. I found a file of all large population centres in the world, and edited out the un-needed extra columns, leaving me a text file of lat/lon/pop'n data.
It took quite while to sort out, but I'm pleased with it so far. By looping round looking from different longitudes I was able to make a nice animated GIF. The cies are coarsely color-coded for population size.
Now to tackle different projection geometries!
It has also been fun looking through the magazine- the old adverts for early personal computers are very evocative. And I found also, even older, the first language manual I tried to understand- Titan Autocode on Cambridge University Atlas in 1967.
nomainwin
WindowWidth =900
WindowHeight =740
graphicbox #w.g,1, 1, 898, 738
open "World Views" for window as #w
#w "trapclose quit"
global pi: pi =3.14159265
global twoPi: twoPi =2 *pi
R =300 ' RADIUS OF GRAPHIC IN SCREEN PIXELS
'L0 = 80 ' LONGITUDE OF OBSERVER IN DEGREES.
for L0 =0 to 360 step 10
#w.g "cls ; goto 450 350 ; down ; fill 60 60 60 ; size 1 ; color white ; circle 300 ; flush"
#w.g "color white ; size 1 ; down"
' Add loop through range of P and LA to generate screen grid of lat /lon
[grid]
for lat =-90 to 90 step 10 ' BOTH IN DEGREES. EAST OF MERIDIAN +ve. NORTH +ve.
for long = -180 to 180 step 10
L =long
P =lat
'#w.g "set "; int( 450 +2 *long); " "; int( 350 +3 *lat)
gosub [findPoint]
next long
next lat
#w.g "flush"
[dataShow]
#w.g "color 180 180 100 ; size 2"
open "LatLon2.txt" for input as #fIn
line input #fIn, g$
for k =2 to 7343
line input #fIn, g$
L =val( word$( g$, 2, ","))
P =val( word$( g$, 1, ","))
pop =val( word$( g$, 3, ","))
gosub [findPoint]
next k
close #fIn
#w.g "flush"
#w.g "getbmp scr 1 1 898 738"
bmpsave "scr", "globe-" +right$( "000" +str$( L0), 3) +".bmp"
scan
next L0
wait
[findPoint]
' SUBROUTINE TO COMPUTE MAP COORDINATES FOR ORTHOGRAPHIC EQUATORIAL PROJECTION.
' THE FOLLOWING VARIABLES MUST BE DEFINED BEFORE THIS SUBROUTINE IS CALLED:
' P IS THE GEOGRAPHIC LATITUDE IN DEGREES OF THE POINT BEING CONVERTED.
' L IS THE GEOGRAPHIC LONGITUDE IN DEGREES OF THE POINT BEING CONVERTED.
' R IS THE RADIUS OF THE FINISHED MAPS IN PIXELS.
' THE FOLLOWING VARIABLES ARE COMPUTED BY THIS SUBROUTINES
' S IS THE OFF-SCALE FLAG. S =0 MEANS ON-SCALE S =1 MEANS OFF-SCALE.
' R1 IS TEMPORARY STORAGE.
' X 1S THE MAP X-COORDINATE IN PIXELS.
' Y IS THE MAP Y=COORDINATE IN PIXELS.
S = 0
' ROTATE THE GEOGRAPHIC LONGITUDE OF THE POINT FROM THE DATA BASE TO REFERENCE IT TO THE MAP CENTER LONGITUDE
' AND CONVERT TO RADIANS.
L = ( L -L0) *pi /180
P = P *pi /180
' NORMALIZE THE ROTATED LONGITUDE BETWEEN ~180 DEGREES AND +180 DEGREES (-PI AND +PI)
IF L >pi THEN L = L - twoPi
IF L <( 0 -pi) THEN L = L + twoPi
' IF OFF-SCALE (OUTSIDE THE RANGE FROM -P1/2 TO +pi/2 SET FLAG AND RETURN
IF L <( 0 -pi /2) THEN S = 1: RETURN
IF L >( pi /2) THEN S = 1: RETURN
' COMPUTE THE MAP COORDINATES FROM THE GEOGRAPHIC COORDINATES.
' L IN RANGE -pi/2..pi/2 P IN RANGE -pi/pi.
R1 = R * sin( ( pi /2 -abs( P)))
X = R1 * sin( L)
Y = R * sin( P)
select case
case pop >1E7
col$ ="red": size =3
case pop >1E6
col$ ="yellow": size =2
case pop >1E5
col$ ="green": size =1
case else
col$ ="cyan": size =1
end select
#w.g "color "; col$
#w.g "size "; size
#w.g "set "; int( 450 +X); " "; int( 350 -Y)
RETURN
END
sub quit h$
close #h$
end
end sub