forlang.hlp (Table of Contents; 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.
MAGNIFY.FOR
                                             Up Contents Index Back
────────────────────────────────────────────────────────────────────────────
 
CC  MAGNIFY.FOR - Illustrates translation between window and view
CC                coordinate systems using the following functions:
CC                getphyscoord     getviewcoord   getviewcoord_w
CC                getwindowcoord   lineto        moveto
CC                rectangle        rectangle_w    settextposition
CC                setwindow       setviewport
CC
CC  Although not all illustrated here, functions ending in _w
CC  are similar to rectangle_w.
 
      INCLUDE  'FGRAPH.FI'
      INCLUDE  'FGRAPH.FD'
 
      INTEGER*2              status, rseed, j, k, m, n
      INTEGER*2              coord(3,2,2), fill(2)
      INTEGER*4              i
      REAL*4                 rand
      DOUBLE PRECISION       x(2), y(2)
      CHARACTER*18           text
      RECORD / xycoord  /    xy, xy1
      RECORD / wxycoord /    wxy
      RECORD / rccoord  /    curpos
      RECORD / videoconfig / vc
      DATA text / 'magnification:  1x' /
      DATA fill / $GFILLINTERIOR, $GBORDER /
 
C
C     Find graphics mode.
C
      IF( setvideomode( $MAXRESMODE ) .EQ. 0 )
     +    STOP 'Error:  cannot set graphics mode'
      CALL getvideoconfig( vc )
 
C
C     Find physical (pixel) coordinates for windows 1, 2, and 3.
C
      coord(1,1,1) = vc.numxpixels * 3 / 16
      coord(1,1,2) = vc.numypixels * 7 / 32
      coord(1,2,1) = coord(1,1,1) + vc.numxpixels / 8
      coord(1,2,2) = coord(1,1,2) + vc.numypixels / 16
      coord(2,1,1) = vc.numxpixels * 9 / 16
      coord(2,1,2) = vc.numypixels * 5 / 32
      coord(2,2,1) = coord(2,1,1) + vc.numxpixels * 3 / 8
      coord(2,2,2) = coord(2,1,2) + vc.numypixels * 3 / 16
      coord(3,1,1) = 0
      coord(3,1,2) = vc.numypixels / 2
      coord(3,2,1) = vc.numxpixels - 1
      coord(3,2,2) = vc.numypixels - 1
 
C
C     Connect windows with lines.
C
      status = setcolor( 4 )
      DO i = 1, 2
         DO j = 1, 2
            DO k = 1, 2
               CALL moveto( coord(i,j,1), coord(i,k,2), xy )
               status = lineto( coord(i + 1,j,1), coord(i + 1,k,2) )
            END DO
         END DO
      END DO
 
C
C     Label windows and frame with rectangles.
C
      DO i = 1, 3
         status  = setcolor( i )
         row    = ( coord(i,1,2) * 25 ) / vc.numypixels
         column = ( coord(i,1,1) * 80 ) / vc.numxpixels
         CALL settextposition( row, column, curpos )
         CALL outtext( text )
         text(17:17) = '3'
 
         IF( i .EQ. 2 ) text(17:17) = '8'
         CALL setviewport(  coord(i,1,1), coord(i,1,2) ,
     +                      coord(i,2,1), coord(i,2,2) )
         CALL getviewcoord( coord(i,1,1), coord(i,1,2), xy  )
         CALL getviewcoord( coord(i,2,1), coord(i,2,2), xy1 )
         status = rectangle( $GBORDER, xy.xcoord, xy.ycoord,
     +                      xy1.xcoord, xy1.ycoord )
      END DO
 
C
C     Seed random number generator.
C
      CALL GETTIM( status, status, status, rseed )
      CALL SEED( rseed )
C
C     Get random window coordinates (x, y) for rectangles,
C     where x and y are between 0 and 1000.
C
      DO i = 8, 15
         status = setcolor( i )
         CALL RANDOM( rand )
         x(1)  = rand * 980.0
         x(2)  = rand * ( 999.0 - x(1) ) + x(1)
         CALL RANDOM( rand )
         y(1)  = rand * 980.0
         y(2)  = rand * ( 999.0 - y(1) ) + y(1)
         k     = rand + 1.5
 
C
C        Display rectangles in normal and magnified views.
C
         DO j = 1, 3
            CALL setviewport( coord(j,1,1), coord(j,1,2) ,
     +                        coord(j,2,1), coord(j,2,2) )
            status = setwindow( .TRUE., 0.0, 0.0, 1000.0, 1000.0 )
            status = rectangle_w( fill(k), x(1), y(1), x(2), y(2) )
C
C           In last window, make rectangle sides 2 pixels wide by
C           encasing unfilled rectangles with another rectangle.
C           Convert window coords (x, y) to physical coords,
C           adjust, and translate back into window coords.
C
            IF( (j .EQ. 3)  .AND.  (k .EQ. 2) ) THEN
               m = -1
               DO n = 1, 2
                  CALL getviewcoord_w(x(n), y(n), xy)
                  CALL getphyscoord(xy.xcoord, xy.ycoord, xy)
                  CALL getviewcoord(xy.xcoord+m, xy.ycoord+m, xy)
                  CALL getwindowcoord(xy.xcoord, xy.ycoord, wxy)
                  x(n) = wxy.wx
                  y(n) = wxy.wy
                  m    = 1
               END DO
            status = rectangle_w( fill(k), x(1), y(1), x(2), y(2) )
            END IF
         END DO
      END DO
 
      READ (*,*)  ! Wait for ENTER to be pressed
      status = setvideomode( $DEFAULTMODE )
      END