GENWiki

Premier IT Outsourcing and Support Services within the UK

User Tools

Site Tools


archive:computers:bradbery

_PORTING FORTAN PROGRAMS FROM MINIS TO PCS_ by John L. Bradberry

[LISTING ONE]

C C > PROGRAM GLOBE C C PROGRAM TO DRAW A GLOBE AT A USER SPECIFIED ANGLE ON A GRAPHICS C SURFACE. INPUTS ALSO INCLUDE LOCATION OF GRATING LOBES REFERENCED C TO LONGITUDE AND LATITUDE.

    AUTHOR: SCIENTIFIC CONCEPTS

C ————————————————————– IMPLICIT NONE C C

    INTEGER*2         I               !LOOP COUNTER
    INTEGER*2         J               !LOOP COUNTER
    INTEGER*2         PMOVE           !PEN CONTROL MOVE COMMAND
    INTEGER*2         PDRAW           !PEN CONTROL DRAW COMMAND
    INTEGER*2         PENC            !PEN CONTROL: 2=DRAW,3=MOVE
    INTEGER*2         TLU             !TERMINAL LOGICAL UNIT NUMBER
    INTEGER*2         ROW             !TEXT ROW POSITION
    INTEGER*2         COLUMN          !TEXT COLUMN POSITION
    INTEGER*2         NUMLOBES        !NUMBER OF GRATING LOBES REQUESTED

C

    REAL*8            GRLOBEX(10)     !X LOCATION FOR GRATING LOBE
    REAL*8            GRLOBEY(10)     !Y LOCATION FOR GRATING LOBE
    REAL*8            XPOS            !HORIZONTAL PIXEL POSITION
    REAL*8            YPOS            !VERTICAL PIXEL POSITION
    REAL*8            HORIZONTAL      !CALCULATED HORIZONTAL PIXEL POSITION
    REAL*8            VERTICAL        !CALCULATED VERTICAL PIXEL POSITION
    REAL*8            RADIUS          !RADIUS OF GLOBE CIRCLE
    REAL*8            TILT            !TILT ANGLE FOR GLOBE
    REAL*8            PI              !PI CONSTANT
    REAL*8            COSCONVER       !COS CONVERSION OF TILT IN RADIANS
    REAL*8            SINCONVER       !SIN CONVERSION OF TILT IN RADIANS
    REAL*8            ELEVATION       !CALCULATED LONGITUDE POSITION
    REAL*8            AZIMUTH         !CALCULATED LATITUDE POSITION
    REAL*8            GLOBEINC        !GRATING LOBE INCREMENT (RADIANS)

C

    CHARACTER         STEMP*8         !TEMPORARY STRING 

C C

    PARAMETER         (PMOVE=3,PDRAW=2)

C

    TLU=6
    NUMLOBES=0
    PI=3.14159265

C C C HORIZONTAL,VERTICAL ARE COORDINATES OF ORIGIN C

    WRITE(TLU,*)'ENTER ORIGIN COORDINATES (TRY 300,200 FOR EGA/VGA)'    
    READ(TLU,*)HORIZONTAL,VERTICAL

C

    WRITE(TLU,*)'ENTER RADIUS OF CIRCLE (TRY 160 FOR EGA/VGA)'
    READ(TLU,*)RADIUS

C

    WRITE(TLU,*)'ENTER TILT ANGLE IN DEGREES (TRY 30)'
    READ(TLU,*)TILT

C

    WRITE(TLU,*)'HOW MANY GRATING LOBES (MAXIMUM=10) ? '
    READ(TLU,*)NUMLOBES

C

    IF (NUMLOBES.GT.10) THEN
      WRITE(TLU,*)' ERROR: TOO MANY GRATING LOBES REQUESTED!'
      STOP
    ELSE IF (NUMLOBES.GT.0) THEN
      DO I=1,NUMLOBES
        WRITE(TLU,*)'ENTER (X,Y) COORDINATES FOR POINT ',I
        READ(TLU,*)GRLOBEX(I),GRLOBEY(I)
      END DO
    ENDIF

C C INITIALIZE IBM PC TO MAXIMUM RESOLUTION … C

    CALL GINIT(TLU)

C C DRAW '+' AT ORIGIN C

    XPOS=HORIZONTAL-4.5
    CALL PLOT(XPOS,VERTICAL,PMOVE)
    XPOS=HORIZONTAL+4.5
    CALL PLOT(XPOS,VERTICAL,PDRAW)
    YPOS=VERTICAL-3.6
    CALL PLOT(HORIZONTAL,YPOS,PMOVE)
    YPOS=VERTICAL+3.9
    CALL PLOT(HORIZONTAL,YPOS,PDRAW)

C C LABEL FIGURE WITH PARAMETERS C

    ROW=24
    COLUMN=26
    WRITE(STEMP,'(F6.2)')TILT
    CALL TEXTLABEL(ROW,COLUMN,'TILT ANGLE (DEGREES)='//STEMP)

C C DRAW OUTER CIRCLE C

    CALL PLOT(HORIZONTAL+RADIUS,VERTICAL,PMOVE)
    DO I=1,100
      XPOS=HORIZONTAL+RADIUS*COS(I*2*PI/100)
      YPOS=VERTICAL+RADIUS*SIN(I*2*PI/100)
      CALL PLOT(XPOS,YPOS,PDRAW)
    END DO

C C DRAW LATITUDES C

    TILT=TILT*PI/180.0
    COSCONVER=COS(TILT)
    SINCONVER=SIN(TILT)

C

    DO I=1,12
      ELEVATION=PI/2-PI/12*I
      XPOS=HORIZONTAL
      YPOS=VERTICAL+RADIUS*(SIN(ELEVATION)*COSCONVER
   +       -COS(ELEVATION)*SINCONVER)
      CALL PLOT(XPOS,YPOS,PMOVE)
      PENC=2
      DO J=1,100
        AZIMUTH=J*2*PI/100.0
        IF (SIN(ELEVATION)*SINCONVER+COS(ELEVATION)*
   +        COS(AZIMUTH)*COSCONVER.GE.0.) THEN
          XPOS=HORIZONTAL+RADIUS*COS(ELEVATION)*SIN(AZIMUTH)
          YPOS=VERTICAL+RADIUS*(SIN(ELEVATION)*COSCONVER
   +           -COS(ELEVATION)*COS(AZIMUTH)*SINCONVER)
          CALL PLOT(XPOS,YPOS,PENC)
          PENC=2
        ELSE
          PENC=3
        END IF
      END DO
    END DO

C C DRAW LONGITUDES C

    DO I=1,12
      AZIMUTH=I*PI/12
      YPOS=VERTICAL+RADIUS*COSCONVER
      CALL PLOT(HORIZONTAL,YPOS,PMOVE)
      PENC=2
      DO J=1,100
        ELEVATION=PI/2-J*2*PI/100
        IF (SIN(ELEVATION)*SINCONVER+COS(ELEVATION)*
   +        COS(AZIMUTH)*COSCONVER.GE.0.) THEN
          XPOS=HORIZONTAL+RADIUS*COS(ELEVATION)*SIN(AZIMUTH)
          YPOS=VERTICAL+RADIUS*(SIN(ELEVATION)*COSCONVER
   +           -COS(ELEVATION)*COS(AZIMUTH)*SINCONVER)
          CALL PLOT(XPOS,YPOS,PENC)
          PENC=2
        ELSE
          PENC=3
        END IF
      END DO
    END DO

C C C DRAW GRATING LOBES C

    IF (NUMLOBES.GT.0) THEN
      DO I=1,NUMLOBES
        XPOS=HORIZONTAL+GRLOBEX(I)+RADIUS
        YPOS=VERTICAL+GRLOBEY(I)
        CALL PLOT(XPOS,YPOS,PMOVE)

C

        DO J=1,100
          GLOBEINC=J*PI/50
          XPOS=HORIZONTAL+GRLOBEX(I)+RADIUS*COS(GLOBEINC+.04)
          YPOS=VERTICAL+GRLOBEY(I)+RADIUS*SIN(GLOBEINC+.04)
          IF((GRLOBEX(I)+RADIUS*COS(GLOBEINC))**2+
   +         (GRLOBEY(I)+RADIUS*SIN(GLOBEINC))**2.LT.RADIUS**2) THEN
            CALL PLOT(XPOS,YPOS,PDRAW)
          ELSE
            CALL PLOT(XPOS,YPOS,PMOVE)
          END IF
        END DO
      END DO
    END IF

C C C PREPARE TO EXIT GRAPHICS AND RETURN TO NORMAL VIDEO … C

    CALL EXITGRAPHICS(TLU)

C

    END

C C

    INCLUDE 'FGRAPH.FI'

C C C > SUBROUTINE TEXTLABEL(ROW,COLUMN,STRING) C C SUBROUTINE TO WAIT FOR USER SIGNAL AND EXIT GRAPHICS MODE. TERMINAL C IS RESTORED TO PRE-VIDEO CONDITIONS… C ————————————————————–

    IMPLICIT NONE

C

    INCLUDE 'FGRAPH.FD'

C

    INTEGER*2         ROW             !TEXT ROW POSITION
    INTEGER*2         COLUMN          !TEXT COLUMN POSITION

C

    CHARACTER         STRING*(*)      !TEXT STRING FOR LABEL

C

    RECORD /RCCOORD/ CURPOS

C C C OUTPUT USER SUPLIED STRING AT ROW,COLUMN … C

    CALL SETTEXTPOSITION(ROW,COLUMN,CURPOS)
    CALL OUTTEXT(STRING)

C

    RETURN
    END 

C C C > SUBROUTINE EXITGRAPHICS(TLU) C C SUBROUTINE TO WAIT FOR USER SIGNAL AND EXIT GRAPHICS MODE. TERMINAL C IS RESTORED TO PRE-VIDEO CONDITIONS… C ————————————————————– IMPLICIT NONE C

    INCLUDE 'FGRAPH.FD'

C

    INTEGER*2         TLU             !TERMINAL LOGICAL UNIT NUMBER
    INTEGER*2         DUMMY           !DUMMY FUNCTION ARGUMENT
    INTEGER*2         ROW             !TEXT ROW POSITION
    INTEGER*2         COLUMN          !TEXT COLUMN POSITION

C

    ROW=25
    COLUMN=28

C C C OUTPUT PROMPT AND WAIT FOR ENTER KEY … C

    CALL TEXTLABEL(ROW,COLUMN,'PRESS ENTER TO CONTINUE')
    READ(TLU,*)

C C RESET VIDEO MODE AND STOP C

    DUMMY=SETVIDEOMODE($DEFAULTMODE)

C

    RETURN
    END 

C C C > SUBROUTINE GINIT(TLU) C C SUBROUTINE TO INITIALIZE IBM PC GRAPHICS MODE TO MAXIMUM C AVAILABLE RESOLUTION … C ————————————————————–

    IMPLICIT NONE

C

    INCLUDE 'FGRAPH.FD'

C

    INTEGER*2         ERRC            !ERROR CODE RETURNED
    INTEGER*2         TLU             !TERMINAL LOGICAL UNIT NUMBER
    INTEGER*2         DUMMY           !DUMMY FUNCTION ARGUMENT

C

    LOGICAL*2         WINDINVERT      !INVERT WINDOW COORDINATES IF TRUE

C

    REAL*8            LOWERX          !LOWER X AXIS CORNER OF WINDOW
    REAL*8            LOWERY          !LOWER Y AXIS CORNER OF WINDOW
    REAL*8            UPPERX          !UPPER X AXIS CORNER OF WINDOW
    REAL*8            UPPERY          !UPPER Y AXIS CORNER OF WINDOW

C C C C INITIALIZE VIDEO MODE TO MAXIMUM RESOLUTION AVAILABLE C

    ERRC=SETVIDEOMODE($MAXRESMODE)
    IF (ERRC.EQ.0) THEN
      WRITE(TLU,*)' ERROR: CANNOT SET VIDEO MODE'
      STOP
    END IF

C

    LOWERX=-3.0
    LOWERY=3.0
    UPPERX=-3.0
    UPPERY=3.0
    WINDINVERT=.TRUE.
    DUMMY=SETWINDOW(WINDINVERT,LOWERX,LOWERY,UPPERX,UPPERY)

C

    RETURN
    END 

C C C > SUBROUTINE PLOT(XPOS,YPOS,PENC) C C SUBROUTINE TO DRAW OR MOVE TO THE USER SPECIFIED POSITION 'XPOS, C YPOS' WITH PEN CONTROL AS DESIGNATED BY 'PENC'. C ————————————————————– IMPLICIT NONE C

    INCLUDE 'FGRAPH.FD'

C

    INTEGER*2         DUMMY           !DUMMY FUNCTION ARGUMENT
    INTEGER*2         PENC            !PEN CONTROL: 2=DRAW,3=MOVE

C

    REAL*8            XPOS            !HORIZONTAL PIXEL POSITION
    REAL*8            YPOS            !VERTICAL PIXEL POSITION

C

    RECORD /WXYCOORD/ XY

C

    IF (PENC.EQ.2) THEN 
      DUMMY=LINETO_W(XPOS,YPOS)
    ELSE
      CALL MOVETO_W(XPOS,YPOS,XY)
    END IF

C

    RETURN
    END 

[LISTING TWO]

                     Top Level Fragment

C > PROGRAM GLOBE C C C PROGRAM TO DRAW A GLOBE AT A USER SPECIFIED ANGLE ON A GRAPHICS C SURFACE. INPUTS ALSO INCLUDE LOCATION OF GRATING LOBES REFERENCED C TO LONGITUDE AND LATITUDE. C AUTHOR: SCIENTIFIC CONCEPTS C


. . .

    CALL GINIT         !INITIALIZE GRAPHICS DEVICE

. . .

    END
                  Layer 3: Graphics Primitives   

C*C SUBROUTINE GINIT C*C C PURPOSE: INITIALIZE GRAPHICS DEVICE CURRENTLY C SET BY GLOBAL VARIABLE 'DEVICETYPE' … . . .

    IF (DEVICETYPE.EQ.HPGL) THEN         !HP GRAPHICS DEVICE
      CALL HPGLINIT
    ELSE IF (DEVICETYPE.EQ.IBMPC) THEN   !IBM MODES CGA-VGA
      CALL IBMPCINIT
    ELSE IF (DEVICETYPE.EQ.TEK) THEN     !TEKTRONIX DEVICES
      CALL TEKINIT
    ELSE IF (DEVICETYPE.EQ.DECVT) THEN   !DEC VT340
      CALL DECVTINIT
    ELSE IF (DEVICETYPE.EQ.VAXSTA) THEN  !DEC VAXSTATION 2000
      CALL VAXSTAINIT  

. . . ELSE

      CALL INITERROR
    END IF
             Layer 2: Graphics Device Drivers      

C*C SUBROUTINE IBMPCINIT C*C C PURPOSE: INITIALIZE CURRENT IBM PC GRAPHICS MODE C COLORS, RESOLUTION ETC … . . .

C

    IF (IBMMODE.EQ.EGACOLOR) THEN
      DUMMY=SETVIDEOMODE($ERESCOLOR)
    ELSE IF (IBMMODE.EQ.HERCULES) THEN
      DUMMY=SETVIDEOMODE($HERCMONO)

. . .

    END IF

C

    RETURN
    END

C C*C SUBROUTINE VAXSTAINIT C*C C PURPOSE: INITIALIZE VAXSTATION 200 GRAPHICS DEVICE C MODE, VIEWPORT … . . . C

    LOWLX=1.0             !LOWER LEFT X COORDINATE
    LOWLY=1.0             !LOWER LEFT Y COORDINATE
    UPPRX=20.0            !UPPER RIGHT X COORDINATE
    UPPRY=20.0            !UPPER RIGHT Y COORDINATE
    DISPWIDTH=20.0        
    DISPHEIGHT=20.0

C

    VD_ID=UIS$CREATE_DISPLAY(LOWLX,LOWLY,UPPRX,UPPRY,
   +                           DISPWIDTH,DISPHEIGHT)
    WD_ID=UIS$CREATE_WINDOW(VD_ID,'SYS$WORKSTATION')

C . . .

    RETURN
    END

C C



/home/gen.uk/domains/wiki.gen.uk/public_html/data/pages/archive/computers/bradbery.txt · Last modified: 2001/11/08 10:19 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki