ex.hlp (Topic list)
Important Notice
The pages on this site contain documentation for very old MS-DOS software, purely for historical purposes. If you're looking for up-to-date documentation, particularly for programming, you should not rely on the information found here, as it will be woefully out of date.
PMAP, VIEW, and WINDOW Statement Example
                        Example                Contents  Index  Back
──────────────────────────────────────────────────────────────────────────────
' This example uses the VIEW and WINDOW statements to define a graphics
' viewport and window. The PMAP function is used to convert viewport
' coordinates to window coordinates. The program generates a fractal
' that shows a subset of the complex numbers called the "Mandelbrot Set."
 
 DEFINT A-Z                              ' Default variable type is integer
 DECLARE SUB ScreenTest (EM%, CR%, VL%, VR%, VT%, VB%)
 
' Set maximum number of iterations per point.
 CONST MAXLOOP = 30, MAXSIZE = 1000000
 CONST FALSE = 0, TRUE = NOT FALSE       ' Boolean constants
 
' Set window parameters.
 CONST WLeft = -1000, WRight = 250, WTop = 625, WBottom = -625
 
' Call ScreenTest to find out if this is an EGA machine, and get
' coordinates of viewport corners.
 ScreenTest EgaMode, ColorRange, VLeft, VRight, VTop, VBottom
 
' Define viewport and corresponding window.
 VIEW (VLeft, VTop)-(VRight, VBottom), 0, ColorRange
 WINDOW (WLeft, WTop)-(WRight, WBottom)
 LOCATE 24, 10: PRINT "Press any key to quit.";
 XLength = VRight - VLeft
 YLength = VBottom - VTop
 ColorWidth = MAXLOOP \ColorRange
 
' Loop through each pixel in viewport and calculate whether or not it is
' in the Mandelbrot Set.
 FOR Y = 0 TO YLength             ' Loop through every line in the viewport
     LogicY = PMAP(Y, 3)          ' Get the pixel's logical y coordinate
     PSET (WLeft, LogicY)         ' Plot leftmost pixel in the line
     OldColor = 0                 ' Start with background color
     FOR X = 0 TO XLength         ' Loop through every pixel in the line
          LogicX = PMAP(X, 2)     ' Get the pixel's logical x coordinate
          MandelX& = LogicX
          MandelY& = LogicY
 
' Do the calculations to see if this point is in the Mandelbrot Set.
          FOR I = 1 TO MAXLOOP
               RealNum& = MandelX& * MandelX&
               ImagNum& = MandelY& * MandelY&
               IF (RealNum& + ImagNum&) >= MAXSIZE THEN EXIT FOR
                    MandelY& = (MandelX& * MandelY&) \250 + LogicY
                    MandelX& = (RealNum& - ImagNum&) \500 + LogicX
          NEXT I
          PColor = I \ColorWidth    ' Assign a color to the point
 
' If color has changed, draw a line from the last point referenced to the
' new point, using the old color.
          IF PColor <> OldColor THEN
               LINE -(LogicX, LogicY), (ColorRange - OldColor)
               OldColor = PColor
          END IF
          IF INKEY$ <> "" THEN END
     NEXT X
 
' Draw the last line segment to the right edge of the viewport.
     LINE -(LogicX, LogicY), (ColorRange - OldColor)
 NEXT Y
 DO
 LOOP WHILE INKEY$ = ""
 SCREEN 0, 0                         ' Restore the screen to text mode,
 WIDTH 80                            ' 80 columns wide
 END
 
 BadScreen:                          ' Error handler that is invoked if
     EgaMode = FALSE                 ' there is no EGA graphics card
     RESUME NEXT
 
' This procedure tests to see if the user has EGA hardware with SCREEN 8.
' If this causes an error, the EM flag is set to FALSE, and the screen
' is set with SCREEN 1. The procedure also sets values for the corners
' of the viewport (VL = left, VR = right, VT = top, VB = bottom), scaled
' with the correct aspect ratio so the viewport is a perfect square.
 STATIC SUB ScreenTest (EM, CR, VL, VR, VT, VB)
     EM = TRUE
     ON ERROR GOTO BadScreen
     SCREEN 8, 1
     ON ERROR GOTO 0
 
     IF EM THEN                      ' No error, so SCREEN 8 is OK
          VL = 110: VR = 529
          VT = 5: VB = 179
          CR = 15                    ' 16 colors (0 - 15)
 
     ELSE                            ' Error, so use SCREEN 1
          SCREEN 1, 1
          VL = 55: VR = 264
          VT = 5: VB = 179
          CR = 3                     ' 4 colors (0 - 3)
    END IF
 
 END SUB