home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / gamefly / fsgriduk.arj / FS-GRID.BAS next >
BASIC Source File  |  1991-02-01  |  6KB  |  211 lines

  1. ' FS-GRID
  2.  
  3. ' A program to create a file of FS grid intersections in OS coordinates
  4. ' There is also a mode (if CHT% is on) which creates files for a survey
  5. ' plotting system which I use.
  6.  
  7. ' Andy Zienkiewicz           1991
  8.  
  9. ' My switch !
  10.   CHT% = 0
  11.   IF INSTR(UCASE$(COMMAND$), "/C") THEN CHT% = -1
  12.  
  13.   GOSUB SetVariables
  14.   GOSUB GetParameters
  15.   IF CHT% THEN
  16.     GOSUB MakeCHTFile
  17.   ELSE
  18.     GOSUB MakeIntersectionFile
  19.   END IF
  20.   END
  21.  
  22. SetVariables:
  23.   SCREEN 0
  24.   DEFDBL A-Z
  25.   IF CHT% THEN
  26.     OutFile$ = "FS.CHT"
  27.   ELSE
  28.     OutFile$ = "FS.GRD"
  29.   END IF
  30. '  Set constants for OS2FS convertion
  31.  
  32. '  Input file FS-OS.DAT contains a list of points, each with
  33. '  FS coords  and  OS coords.  Three points  are selected to
  34. '  bound an area  where conversions are to be done  and have
  35. '  a "*" on the line before.
  36.  
  37.   DatFile$ = "FS-OS.DAT"
  38.  
  39.   OPEN DatFile$ FOR RANDOM AS #1
  40.   IF LOF(1) = 0 THEN
  41.     CLOSE : PRINT : PRINT DatFile$; " not found.": PRINT : END
  42.   END IF
  43.   CLS : CLOSE
  44.  
  45.   OPEN DatFile$ FOR INPUT AS #1
  46.   DO
  47.     DO
  48.       LINE INPUT #1, i$
  49.     LOOP UNTIL LEFT$(i$, 1) = "*"
  50.     n% = n% + 1
  51.     PointName$(n%) = LTRIM$(MID$(i$, 2))
  52.     INPUT #1, FSn(n%), FSe(n%), OSe(n%), OSn(n%)
  53.   LOOP UNTIL EOF(1) OR n% = 3
  54.   CLOSE
  55.  
  56.   qqC = ((OSe(2) - OSe(3)) * (FSe(1) - FSe(3)) - (OSe(1) - OSe(3)) * (FSe(2) - FSe(3))) / ((FSn(3) - FSn(1)) * (FSe(2) - FSe(3)) - (FSn(3) - FSn(2)) * (FSe(1) - FSe(3)))
  57.   qqB = ((OSe(1) - OSe(3)) + qqC * (FSn(3) - FSn(1))) / (FSe(1) - FSe(3))
  58.   qqA = OSe(1) - qqB * FSe(1) - qqC * FSn(1)
  59.   qqR = ((OSn(2) - OSn(3)) * (FSe(1) - FSe(3)) - (OSn(1) - OSn(3)) * (FSe(2) - FSe(3))) / ((FSn(3) - FSn(1)) * (FSe(2) - FSe(3)) - (FSn(3) - FSn(2)) * (FSe(1) - FSe(3)))
  60.   qqQ = ((OSn(1) - OSn(3)) + qqR * (FSn(3) - FSn(1))) / (FSe(1) - FSe(3))
  61.   qqP = OSn(1) - qqQ * FSe(1) - qqR * FSn(1)
  62.   RETURN
  63.  
  64. GetParameters:
  65.   CLS
  66.   PRINT
  67.   PRINT "         FS-Grid                            Andy Zienkiewicz   1991"
  68.   PRINT
  69.   PRINT "         This program creates a file of OS coordinates representing"
  70.   PRINT "         the intersections of a Flight Simulator grid.  This can be"
  71.   PRINT "         plotted on any OS map (or an overlay)  for fast reading of"
  72.   PRINT "         FS Coordinates."
  73.   PRINT
  74.   PRINT "         The transformation data comes from the file "; DatFile$
  75.   PRINT "         and is currently using the three points:-"
  76.   PRINT
  77.   PRINT TAB(25); PointName$(1)
  78.   PRINT TAB(25); PointName$(2)
  79.   PRINT TAB(25); PointName$(3)
  80.   PRINT
  81.   PRINT
  82.   INPUT "  Enter minimum FS northing "; FSnMin
  83.   INPUT "  Enter maximum FS northing "; FSnMax
  84.   PRINT
  85.   INPUT "   Enter minimum FS easting "; FSeMin
  86.   INPUT "   Enter maximum FS easting "; FSeMax
  87.   PRINT
  88.   DO
  89.     INPUT "     Enter FS grid interval "; GridInt
  90.   LOOP UNTIL GridInt > 0
  91.   PRINT
  92.  
  93. '  Round GridInt to 1,2,5 * 10^?
  94.   lg = LOG(GridInt) / LOG(10)
  95.   char = INT(lg)
  96.   mant = lg - char
  97.   IF mant < .15 THEN
  98.     mant = 0
  99.   ELSEIF mant < .5 THEN
  100.     mant = .30103
  101.   ELSEIF mant < .85 THEN
  102.     mant = .69897
  103.   ELSE
  104.     mant = 0
  105.     char = char + 1
  106.   END IF
  107.   GridInt = 10 ^ (char + mant)
  108.  
  109. '  Swap mixed min & max
  110.   IF FSnMin > FSnMax THEN SWAP FSnMin, FSnMax
  111.   IF FSnMin = FSnMax THEN FSnMax = FSnMin + GridInt
  112.   IF FSeMin > FSeMax THEN SWAP FSeMin, FSeMax
  113.   IF FSeMin = FSeMax THEN FSeMax = FSeMin + GridInt
  114.  
  115. '  Round out mins & maxs
  116.   FSnMin = INT(FSnMin / GridInt) * GridInt
  117.   FSnMax = INT(FSnMax / -GridInt) * -GridInt
  118.   FSeMin = INT(FSeMin / GridInt) * GridInt
  119.   FSeMax = INT(FSeMax / -GridInt) * -GridInt
  120.  
  121.   CLS
  122.   PRINT
  123.   PRINT "Grid intersections will be sent to "; OutFile$; " as shown:-";
  124.  
  125.   FOR y% = 0 TO 5
  126.     FOR x% = 0 TO 5
  127.       LOCATE y% * 3 + 4, x% * 7 + 25: PRINT "┼";
  128.     NEXT x%
  129.   NEXT y%
  130.  
  131.   LOCATE 19, 18: PRINT USING "#####N"; FSnMin;
  132.   LOCATE 20, 20: PRINT USING "#####E"; FSeMin;
  133.   LOCATE 4, 18:  PRINT USING "#####N"; FSnMax;
  134.   LOCATE 20, 55: PRINT USING "#####E"; FSeMax;
  135.   LOCATE 18, 25: PRINT CHR$(27); : PRINT USING "#### "; GridInt; : PRINT CHR$(26);
  136.   LOCATE 16, 28: PRINT CHR$(24);
  137.   LOCATE 19, 28: PRINT CHR$(25);
  138.   PRINT
  139.   LOCATE 22, 10
  140.   PRINT "Continue? (Y/N) ";
  141.  
  142.   DO
  143.     i$ = UCASE$(INKEY$)
  144.   LOOP UNTIL i$ = "Y" OR i$ = "N"
  145.   IF i$ = "N" THEN PRINT : PRINT : END
  146.   RETURN
  147.  
  148. MakeIntersectionFile:
  149.   LOCATE , 1: PRINT TAB(50); : LOCATE , 1
  150.  
  151.   OPEN OutFile$ FOR OUTPUT AS #1
  152.  
  153.   FOR FSe = FSeMin TO FSeMax STEP GridInt
  154.     FOR FSn = FSnMin TO FSnMax STEP GridInt
  155.       GridCount% = GridCount% + 1
  156.       GOSUB ConvertFS2OS
  157.       LOCATE , 1: PRINT "Grid cross No."; GridCount%; " at ";
  158.       PRINT USING "#####N, #####E    ######E, ######N"; FSn; FSe; OSe; OSn;
  159.       PRINT #1, USING "#####N, #####E    ######E, ######N"; FSn; FSe; OSe; OSn
  160.     NEXT FSn
  161.     PRINT #1,
  162.   NEXT FSe
  163.   CLOSE
  164.   LOCATE , 1: PRINT TAB(70); : LOCATE , 1
  165.   PRINT "Done."
  166.   RETURN
  167.  
  168. MakeCHTFile:
  169. '     Type(2=line), Code(=0), Colour(=COLOR), Dash(0=solid)
  170.   LineHead$ = "2 0 2 0"
  171.  
  172.   LOCATE , 1: PRINT TAB(50); : LOCATE , 1
  173.   OPEN OutFile$ FOR OUTPUT AS #1
  174.  
  175. '  Draw S-N lines
  176.   FOR FSe = FSeMin TO FSeMax STEP GridInt
  177.     PRINT #1, LineHead$
  178.     FOR FSn = FSnMin TO FSnMax STEP GridInt
  179.       GridCount% = GridCount% + 1
  180.       GOSUB ConvertFS2OS
  181.       LOCATE , 1: PRINT "Grid cross No."; GridCount%; " at ";
  182.       PRINT USING "#####N, #####E    ######E, ######N"; FSn; FSe; OSe; OSn;
  183.       PRINT #1, USING " ######.#  ######.#"; OSe; OSn
  184.     NEXT FSn
  185.     PRINT #1, " 0 0"
  186.   NEXT FSe
  187.  
  188. '  Draw E-W lines
  189.   FOR FSn = FSnMin TO FSnMax STEP GridInt
  190.     PRINT #1, LineHead$
  191.     FOR FSe = FSeMin TO FSeMax STEP GridInt
  192.       GridCount% = GridCount% + 1
  193.       GOSUB ConvertFS2OS
  194.       LOCATE , 1: PRINT "Grid cross No."; GridCount%; " at ";
  195.       PRINT USING "#####N, #####E    ######E, ######N"; FSn; FSe; OSe; OSn;
  196.       PRINT #1, USING " ######.#  ######.#"; OSe; OSn
  197.     NEXT FSe
  198.     PRINT #1, " 0 0"
  199.   NEXT FSn
  200.          
  201.   CLOSE
  202.   LOCATE , 1: PRINT TAB(70); : LOCATE , 1
  203.   PRINT "Done."
  204.   RETURN
  205.  
  206. ConvertFS2OS:     '   Convert OS grid to FS grid
  207.   OSe = qqA + qqB * FSe + qqC * FSn
  208.   OSn = qqP + qqQ * FSe + qqR * FSn
  209.   RETURN
  210.  
  211.