100 CLS
120 PRINT " "
130 PRINT "Map of Hawaiian Islands for IBM PC with color/graphics."
140 PRINT " "
150 PRINT "Please wait a minute while I learn some geography."
160 PRINT " "
200 PRINT "After the display is up, use the arrow keys to pan,"
220 PRINT " the + and - keys to zoom."
300 LAT=20!                     'tangent point near hawaii
350 LON=-158!
400 HGT=0!
450 GOSUB 8850                  'initialize for coord xforms
500 DIM COOR(1,300)             'array for coordinates
550 ' geodetic coords, 99,99 means end of polygon (island)
600 '  must be followed by center point for painting
650 '  999,999 means end of all coordinates
700 '   kahoolawe
750 DATA 20.5600,-156.6833, 20.6057,-156.6030, 20.6086,-156.5682
800 DATA 20.5943,-156.5485, 20.5443,-156.5591, 20.5429,-156.5394
850 DATA 20.5157,-156.5500, 20.5271,-156.5591, 20.5129,-156.5894
900 DATA 20.5286,-156.6061, 20.5114,-156.6636, 20.5129,-156.6879
950 DATA 20.5329,-156.7045, 99,99
1000 DATA 20.5600,-156.6030
1050 '   niihau
1100 DATA 21.8714,-160.2394, 21.9114,-160.2045, 21.9471,-160.1348
1150 DATA 21.9929,-160.1061, 22.0000,-160.0758, 21.9900,-160.0530
1200 DATA 21.9714,-160.0530, 21.9714,-160.0682, 21.9214,-160.0864
1250 DATA 21.9000,-160.0727, 21.8643,-160.1515, 21.7857,-160.2045
1300 DATA 21.7786,-160.1909, 21.8143,-160.2455, 99,99
1350 DATA 21.9000,-160.1515
1400 '   kauai
1450 DATA 22.0600,-159.7848, 22.1229,-159.7333, 22.1529,-159.7242
1500 DATA 22.1657,-159.6667, 22.2229,-159.5833, 22.2057,-159.5000
1550 DATA 22.2243,-159.4879, 22.2143,-159.4303, 22.2229,-159.4015
1600 DATA 22.2057,-159.3530, 22.1829,-159.3197, 22.1429,-159.3030
1650 DATA 22.0829,-159.3167, 22.0286,-159.3424, 21.9500,-159.3288
1700 DATA 21.8571,-159.4409, 21.8929,-159.6242, 21.9514,-159.6682
1750 DATA 21.9786,-159.7621, 99,99
1800 DATA 22.0600,-159.5000
1850 '   molokai
1900 DATA 21.2343,-157.2712, 21.2286,-157.2106, 21.2171,-157.2015
1950 DATA 21.1900,-157.0121, 21.2186,-156.9818, 21.1871,-156.9576
2000 DATA 21.1671,-156.8697, 21.1814,-156.7470, 21.1686,-156.7273
2050 DATA 21.1229,-156.7409, 21.0671,-156.8303, 21.0600,-156.8955
2100 DATA 21.0843,-157.0000, 21.1257,-157.1045, 21.1086,-157.1348
2150 DATA 21.0986,-157.2439, 21.1229,-157.3167, 21.1457,-157.3061
2200 DATA 21.1929,-157.2606, 99,99
2250 DATA 21.1229,-156.9818
2300 '   oahu
2350 DATA 21.5814,-158.2803, 21.5971,-158.1242, 21.7071,-158.0288
2400 DATA 21.7086,-158.0106, 21.7171,-157.9955, 21.6857,-157.9409
2450 DATA 21.5586,-157.8758, 21.5614,-157.8606, 21.5471,-157.8424
2500 DATA 21.5086,-157.8394, 21.5129,-157.8561, 21.4643,-157.8455
2550 DATA 21.4200,-157.7939, 21.4200,-157.7667, 21.4414,-157.7636
2600 DATA 21.4414,-157.7833, 21.4629,-157.7712, 21.4557,-157.7394
2650 DATA 21.4071,-157.7439, 21.3886,-157.7197, 21.3457,-157.7076
2700 DATA 21.3057,-157.6530, 21.2614,-157.7000, 21.2571,-157.7258
2750 DATA 21.2786,-157.7152, 21.2729,-157.7591, 21.2500,-157.8106
2800 DATA 21.3100,-157.8894, 21.3371,-157.8955, 21.3143,-157.9106
2850 DATA 21.3129,-157.9364, 21.3300,-157.9636, 21.3571,-157.9682
2900 DATA 21.3614,-157.9455, 21.3743,-157.9424, 21.3843,-157.9712
2950 DATA 21.3814,-157.9848, 21.3557,-157.9833, 21.3729,-158.0182
3000 DATA 21.3629,-158.0242, 21.3414,-157.9848, 21.3157,-157.9864
3050 DATA 21.2986,-158.0606, 21.3000,-158.1167, 21.3971,-158.1606
3100 DATA 21.4029,-158.1864, 21.4329,-158.1848, 21.4857,-158.2348
3150 DATA 21.5386,-158.2394, 99,99,  21.5,-158
3200 '   lanai
3250 DATA 20.9100,-157.0712, 20.9286,-157.0439, 20.9257,-156.9470
3300 DATA 20.8929,-156.8742, 20.8486,-156.8273, 20.8271,-156.8182
3350 DATA 20.7786,-156.8364, 20.7586,-156.8561, 20.7429,-156.8924
3400 DATA 20.7386,-156.9697, 20.7857,-156.9970, 20.8286,-157.0000
3450 DATA 20.8671,-157.0212, 20.8671,-157.0455, 20.8743,-157.0621
3500 DATA 99,99,  20.8286,-156.9470
3550 '   hawaii
3600 DATA 20.2643,-155.8818, 20.2586,-155.8106, 20.1257,-155.5955
3650 DATA 20.1314,-155.5591, 20.0129,-155.2667, 19.9129,-155.1394
3700 DATA 19.8400,-155.0879, 19.7214,-155.0939, 19.7271,-155.0076
3750 DATA 19.5643,-154.9167, 19.5143,-154.8152, 19.4814,-154.8212
3800 DATA 19.3457,-154.9833, 19.2600,-155.2000, 19.2614,-155.3030
3850 DATA 19.1300,-155.5197, 18.9057,-155.6818, 18.9400,-155.6955
3900 DATA 19.0043,-155.8015, 19.0243,-155.8652, 19.0686,-155.9091
3950 DATA 19.1300,-155.9273, 19.3400,-155.8939, 19.4786,-155.9288
4000 DATA 19.4886,-155.9530, 19.6400,-155.9909, 19.6543,-156.0333
4050 DATA 19.7157,-156.0591, 19.7814,-156.0485, 19.8514,-155.9727
4100 DATA 19.8586,-155.9242, 19.9671,-155.8621, 19.9871,-155.8258
4150 DATA 20.0371,-155.8258, 20.1100,-155.8833, 20.2000,-155.9015
4200 DATA 99,99,  19.5643,-155.5
4250 '   maui
4300 DATA 21.0286,-156.6621, 21.0300,-156.6379, 21.0371,-156.6000
4350 DATA 20.9871,-156.5258, 20.9543,-156.5136, 20.9443,-156.5212
4400 DATA 20.9357,-156.5000, 20.8986,-156.4758, 20.9014,-156.4212
4450 DATA 20.9429,-156.3636, 20.9500,-156.2909, 20.9371,-156.2394
4500 DATA 20.8657,-156.1652, 20.8714,-156.1409, 20.8386,-156.1288
4550 DATA 20.8329,-156.0833, 20.8171,-156.0742, 20.8014,-156.0121
4600 DATA 20.7714,-155.9864, 20.7271,-155.9894, 20.6886,-156.0167
4650 DATA 20.6880,-156.0348, 20.6614,-156.0485, 20.6486,-156.1212
4700 DATA 20.6300,-156.1455, 20.6357,-156.2030, 20.5914,-156.3152
4750 DATA 20.5886,-156.3864, 20.6114,-156.4394, 20.6414,-156.4439
4800 DATA 20.6443,-156.4636, 20.6600,-156.4439, 20.7943,-156.4667
4850 DATA 20.8086,-156.5106, 20.7843,-156.5242, 20.8171,-156.6242
4900 DATA 20.8643,-156.6758, 20.9157,-156.6985, 20.9586,-156.6939
4950 DATA 99,99,  20.7714,-156.2909
5000 DATA 999,999
5050 MINX= 9.999999E+37: MINY= 9.999999E+37
5100 MAXX=-9.999999E+37: MAXY=-9.999999E+37
5150 I=-1
5200 I=I+1
5250 READ LAT   : READ LON
5300 COOR(0,I) = LAT:  COOR(1,I) = LON
5350 IF LAT = 99 AND LON = 99 THEN GOTO 5200
5400 IF LAT >900 THEN GOTO 5850
5450 GOSUB 9850
5500 IF XR<MINX THEN MINX=XR
5550 IF YR<MINY THEN MINY=YR
5600 IF XR>MAXX THEN MAXX=XR
5650 IF YR>MAXY THEN MAXY=YR
5700 COOR(0,I)=XR
5750 COOR(1,I)=YR
5800 GOTO 5200
5850 DIM GRID(1,5,7)
5900 LAT = 17!
5950 LON = -162!
6000 FOR I = 0 TO 5
6050 LAT = LAT+1!
6100 FOR J = 0 TO 7
6150   LON = LON+1!
6200   GOSUB 9850
6250   GRID(0,I,J) = XR
6300   GRID(1,I,J) = YR
6350   NEXT J
6400 LON = -162!
6450 NEXT I
6500 '  end of coordinate transformation loop
6550 '  once only display commands
6600 SCREEN 1
6650 COLOR 1,0
6700 VIEW SCREEN (0,0)-(319,199)
6750 DELX=MAXX-MINX:  DELY=MAXY-MINY
6800 IF (DELX/DELY)>1.4 THEN DELY=DELX/1.4 ELSE DELX=DELY*1.4
6810 '
6850 '  display loop
6860 '
6900 CLS
6950 WINDOW SCREEN (MINX,MINY)-(MINX+DELX,MINY+DELY)
7000 I=-1 
7050 I=I+1 
7100 OLDX=COOR(0,I)  :  OLDY=COOR(1,I)
7150 IF COOR(0,I)=999 AND COOR(1,I)=999 THEN GOTO 7500
7200 I=I+1
7250 LINE (OLDX,OLDY)-(COOR(0,I),COOR(1,I)),1
7300 I=I+1
7350 IF COOR(0,I)=99 AND COOR(1,I)=99 THEN LINE -(OLDX,OLDY),1:I=I+1:PAINT (COOR(0,I),COOR(1,I)),3,1:GOTO 7050
7400 LINE -(COOR(0,I),COOR(1,I)),1
7450 GOTO 7300
7500 FOR I = 0 TO 5
7550 FOR J = 1 TO 7
7600 LINE (GRID(0,I,J-1),GRID(1,I,J-1))-(GRID(0,I,J),GRID(1,I,J)),2,,&HAAAA
7650 NEXT J
7700 NEXT I
7750 FOR I = 0 TO 7
7800 FOR J = 1 TO 5
7850 LINE (GRID(0,J-1,I),GRID(1,J-1,I))-(GRID(0,J,I),GRID(1,J,I)),2,,&HAAAA
7900 NEXT J
7950 NEXT I
8000 K$=INKEY$
8050 IF K$ = "" THEN 8000
8100 IF LEN(K$)=2 THEN K$=RIGHT$(K$,1)
8150 K = ASC(K$)
8200 IF K = 77 OR K$ = "6" THEN MINX=MINX+(DELX/3) 'right arrow
8250 IF K = 75 OR K$ = "4" THEN MINX=MINX-(DELX/3) 'left  arrow
8300 IF K = 72 OR K$ = "8" THEN MINY=MINY-(DELY/3) 'up    arrow
8350 IF K = 80 OR K$ = "2" THEN MINY=MINY+(DELY/3) 'down  arrow
8400 IF K = 71 OR K$ = "7" THEN MINY=MINY-(DELY/3):MINX=MINX-(DELX/3) 'up-left
8450 IF K = 73 OR K$ = "9" THEN MINY=MINY-(DELY/3):MINX=MINX+(DELX/3) 'up-rt.
8500 IF K = 79 OR K$ = "1" THEN MINY=MINY+(DELY/3):MINX=MINX-(DELX/3) 'dn.-left
8550 IF K = 81 OR K$ = "3" THEN MINY=MINY+(DELY/3):MINX=MINX+(DELX/3) 'dn.-rt.
8600 IF K$ = "+" THEN MINX=MINX+(DELX/6):MINY=MINY+(DELY/6):DELX=DELX*(2/3):DELY=DELY*(2/3)
8650 IF K$ = "-" THEN MINX=MINX-(DELX/6):MINY=MINY-(DELY/6):DELX=DELX*(4/3):DELY=DELY*(4/3)
8700 GOTO 6900
8750 '
8800 '
8850 'initialization for geodetic to ref. sys. conversion
8900 'input: lat,lon,hgt of ref. sys. origin
8950 'output:vars used by subroutines for conversion
9000 AE = 20925690#             'earth equ. rad. ft.
9050 BP = 20855540#             'earth pol. rad. ft.
9100 FL = (AE -BP)/AE           'earth flat.
9150 C1 = FL *(2!-FL)
9200 C2 = AE *(1!-FL)*(1!-FL)
9250 DEGRAD = 57.29578
9300 GOSUB 10150
9350 XCO=XC                     'save ref. origin geocentric coords
9400 YCO=YC
9450 ZCO=ZC
9500 A=(-LAT-90)/DEGRAD
9550 SA = SIN(A)
9600 CA = COS(A)
9650 B=(LON+90)/DEGRAD
9700 SB = SIN(B)
9750 CB = COS(B)
9755 CASB = CA*SB
9780 CACB = CA*CB
9800 RETURN 500
9850 'geodetic to reference conversion
9900 'input: lat,lon,hgt
9950 'output:xr,yr,zr
10000 GOSUB 10150                 'geodetic to geocentric
10050 GOSUB 10650                 'geocentric to reference
10100 RETURN
10150 'geodetic to geocentric conversion.
10200 'input: lat,lon,hgt (in degrees and feet)
10250 'output: xc,yc,zc   (in feet)
10300 SP = SIN(LAT/DEGRAD)
10350 DENOM = SQR(1!-(C1*SP*SP))
10400 XC = ((AE/DENOM)+HGT)*COS(LAT/DEGRAD)
10450 YC = XC*SIN(LON/DEGRAD)
10500 XC = XC*COS(LON/DEGRAD)
10550 ZC = ((C2/DENOM)+HGT)*SP
10600 RETURN
10650 'geocentric to reference conversion
10700 'input: xc,yc,zc (in feet)
10750 'output:xr,yr,zr (in feet)
10800 XC = XC-XCO                'translate to ref. sys. origin
10850 YC = YC-YCO
10900 ZC = ZC-ZCO
10950 XR = CB*XC + SB*YC
11000 YR = -CASB*XC + CACB*YC + SA*ZC
11050 '   ZR = SA*SB*XC - SA*CB*YC + CA*ZC
11100 RETURN
