home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1990 / 09 / bradbery.asc < prev    next >
Text File  |  1990-07-25  |  13KB  |  424 lines

  1. _PORTING FORTAN PROGRAMS FROM MINIS TO PCS_
  2. by John L. Bradberry
  3.  
  4. [LISTING ONE]
  5.  
  6. C
  7. C    >**************************************************************
  8.       PROGRAM GLOBE
  9. C     **************************************************************
  10. C     PROGRAM TO DRAW A GLOBE AT A USER SPECIFIED ANGLE ON A GRAPHICS
  11. C     SURFACE. INPUTS ALSO INCLUDE LOCATION OF GRATING LOBES REFERENCED
  12. C     TO LONGITUDE AND LATITUDE.
  13.       AUTHOR: SCIENTIFIC CONCEPTS
  14. C     --------------------------------------------------------------   
  15.       IMPLICIT NONE
  16. C
  17. C
  18.       INTEGER*2         I               !LOOP COUNTER
  19.       INTEGER*2         J               !LOOP COUNTER
  20.       INTEGER*2         PMOVE           !PEN CONTROL MOVE COMMAND
  21.       INTEGER*2         PDRAW           !PEN CONTROL DRAW COMMAND
  22.       INTEGER*2         PENC            !PEN CONTROL: 2=DRAW,3=MOVE
  23.       INTEGER*2         TLU             !TERMINAL LOGICAL UNIT NUMBER
  24.       INTEGER*2         ROW             !TEXT ROW POSITION
  25.       INTEGER*2         COLUMN          !TEXT COLUMN POSITION
  26.       INTEGER*2         NUMLOBES        !NUMBER OF GRATING LOBES REQUESTED
  27. C
  28.       REAL*8            GRLOBEX(10)     !X LOCATION FOR GRATING LOBE
  29.       REAL*8            GRLOBEY(10)     !Y LOCATION FOR GRATING LOBE
  30.       REAL*8            XPOS            !HORIZONTAL PIXEL POSITION
  31.       REAL*8            YPOS            !VERTICAL PIXEL POSITION
  32.       REAL*8            HORIZONTAL      !CALCULATED HORIZONTAL PIXEL POSITION
  33.       REAL*8            VERTICAL        !CALCULATED VERTICAL PIXEL POSITION
  34.       REAL*8            RADIUS          !RADIUS OF GLOBE CIRCLE
  35.       REAL*8            TILT            !TILT ANGLE FOR GLOBE
  36.       REAL*8            PI              !PI CONSTANT
  37.       REAL*8            COSCONVER       !COS CONVERSION OF TILT IN RADIANS
  38.       REAL*8            SINCONVER       !SIN CONVERSION OF TILT IN RADIANS
  39.       REAL*8            ELEVATION       !CALCULATED LONGITUDE POSITION
  40.       REAL*8            AZIMUTH         !CALCULATED LATITUDE POSITION
  41.       REAL*8            GLOBEINC        !GRATING LOBE INCREMENT (RADIANS)
  42. C  
  43.       CHARACTER         STEMP*8         !TEMPORARY STRING 
  44. C
  45.       PARAMETER         (PMOVE=3,PDRAW=2)
  46. C
  47.       TLU=6
  48.       NUMLOBES=0
  49.       PI=3.14159265
  50. C
  51. C      
  52. C     HORIZONTAL,VERTICAL ARE COORDINATES OF ORIGIN 
  53. C
  54.       WRITE(TLU,*)'ENTER ORIGIN COORDINATES (TRY 300,200 FOR EGA/VGA)'    
  55.       READ(TLU,*)HORIZONTAL,VERTICAL
  56. C
  57.       WRITE(TLU,*)'ENTER RADIUS OF CIRCLE (TRY 160 FOR EGA/VGA)'
  58.       READ(TLU,*)RADIUS
  59. C
  60.       WRITE(TLU,*)'ENTER TILT ANGLE IN DEGREES (TRY 30)'
  61.       READ(TLU,*)TILT
  62. C
  63.       WRITE(TLU,*)'HOW MANY GRATING LOBES (MAXIMUM=10) ? '
  64.       READ(TLU,*)NUMLOBES
  65. C
  66.       IF (NUMLOBES.GT.10) THEN
  67.         WRITE(TLU,*)' ERROR: TOO MANY GRATING LOBES REQUESTED!'
  68.         STOP
  69.       ELSE IF (NUMLOBES.GT.0) THEN
  70.         DO I=1,NUMLOBES
  71.           WRITE(TLU,*)'ENTER (X,Y) COORDINATES FOR POINT ',I
  72.           READ(TLU,*)GRLOBEX(I),GRLOBEY(I)
  73.         END DO
  74.       ENDIF
  75. C
  76. C     INITIALIZE IBM PC TO MAXIMUM RESOLUTION ...
  77. C
  78.       CALL GINIT(TLU)
  79. C
  80. C     DRAW '+' AT ORIGIN 
  81. C
  82.       XPOS=HORIZONTAL-4.5
  83.       CALL PLOT(XPOS,VERTICAL,PMOVE)
  84.       XPOS=HORIZONTAL+4.5
  85.       CALL PLOT(XPOS,VERTICAL,PDRAW)
  86.       YPOS=VERTICAL-3.6
  87.       CALL PLOT(HORIZONTAL,YPOS,PMOVE)
  88.       YPOS=VERTICAL+3.9
  89.       CALL PLOT(HORIZONTAL,YPOS,PDRAW)
  90. C
  91. C     LABEL FIGURE WITH PARAMETERS
  92. C
  93.       ROW=24
  94.       COLUMN=26
  95.       WRITE(STEMP,'(F6.2)')TILT
  96.       CALL TEXTLABEL(ROW,COLUMN,'TILT ANGLE (DEGREES)='//STEMP)
  97. C       
  98. C     DRAW OUTER CIRCLE
  99. C
  100.       CALL PLOT(HORIZONTAL+RADIUS,VERTICAL,PMOVE)
  101.       DO I=1,100
  102.         XPOS=HORIZONTAL+RADIUS*COS(I*2*PI/100)
  103.         YPOS=VERTICAL+RADIUS*SIN(I*2*PI/100)
  104.         CALL PLOT(XPOS,YPOS,PDRAW)
  105.       END DO
  106. C
  107. C     DRAW LATITUDES
  108. C
  109.       TILT=TILT*PI/180.0
  110.       COSCONVER=COS(TILT)
  111.       SINCONVER=SIN(TILT)
  112. C
  113.       DO I=1,12
  114.         ELEVATION=PI/2-PI/12*I
  115.         XPOS=HORIZONTAL
  116.         YPOS=VERTICAL+RADIUS*(SIN(ELEVATION)*COSCONVER
  117.      +       -COS(ELEVATION)*SINCONVER)
  118.         CALL PLOT(XPOS,YPOS,PMOVE)
  119.         PENC=2
  120.         DO J=1,100
  121.           AZIMUTH=J*2*PI/100.0
  122.           IF (SIN(ELEVATION)*SINCONVER+COS(ELEVATION)*
  123.      +        COS(AZIMUTH)*COSCONVER.GE.0.) THEN
  124.             XPOS=HORIZONTAL+RADIUS*COS(ELEVATION)*SIN(AZIMUTH)
  125.             YPOS=VERTICAL+RADIUS*(SIN(ELEVATION)*COSCONVER
  126.      +           -COS(ELEVATION)*COS(AZIMUTH)*SINCONVER)
  127.             CALL PLOT(XPOS,YPOS,PENC)
  128.             PENC=2
  129.           ELSE
  130.             PENC=3
  131.           END IF
  132.         END DO
  133.       END DO
  134. C
  135. C     DRAW LONGITUDES
  136. C
  137.       DO I=1,12
  138.         AZIMUTH=I*PI/12
  139.         YPOS=VERTICAL+RADIUS*COSCONVER
  140.         CALL PLOT(HORIZONTAL,YPOS,PMOVE)
  141.         PENC=2
  142.         DO J=1,100
  143.           ELEVATION=PI/2-J*2*PI/100
  144.           IF (SIN(ELEVATION)*SINCONVER+COS(ELEVATION)*
  145.      +        COS(AZIMUTH)*COSCONVER.GE.0.) THEN
  146.             XPOS=HORIZONTAL+RADIUS*COS(ELEVATION)*SIN(AZIMUTH)
  147.             YPOS=VERTICAL+RADIUS*(SIN(ELEVATION)*COSCONVER
  148.      +           -COS(ELEVATION)*COS(AZIMUTH)*SINCONVER)
  149.             CALL PLOT(XPOS,YPOS,PENC)
  150.             PENC=2
  151.           ELSE
  152.             PENC=3
  153.           END IF
  154.         END DO
  155.       END DO
  156. C
  157. C
  158. C     DRAW GRATING LOBES
  159. C
  160.       IF (NUMLOBES.GT.0) THEN
  161.         DO I=1,NUMLOBES
  162.           XPOS=HORIZONTAL+GRLOBEX(I)+RADIUS
  163.           YPOS=VERTICAL+GRLOBEY(I)
  164.           CALL PLOT(XPOS,YPOS,PMOVE)
  165. C
  166.           DO J=1,100
  167.             GLOBEINC=J*PI/50
  168.             XPOS=HORIZONTAL+GRLOBEX(I)+RADIUS*COS(GLOBEINC+.04)
  169.             YPOS=VERTICAL+GRLOBEY(I)+RADIUS*SIN(GLOBEINC+.04)
  170.             IF((GRLOBEX(I)+RADIUS*COS(GLOBEINC))**2+
  171.      +         (GRLOBEY(I)+RADIUS*SIN(GLOBEINC))**2.LT.RADIUS**2) THEN
  172.               CALL PLOT(XPOS,YPOS,PDRAW)
  173.             ELSE
  174.               CALL PLOT(XPOS,YPOS,PMOVE)
  175.             END IF
  176.           END DO
  177.         END DO
  178.       END IF
  179. C
  180. C
  181. C     PREPARE TO EXIT GRAPHICS AND RETURN TO NORMAL VIDEO ...
  182. C
  183.       CALL EXITGRAPHICS(TLU)
  184. C
  185.       END
  186. C
  187. C
  188.       INCLUDE 'FGRAPH.FI'
  189. C
  190. C
  191. C    >**************************************************************
  192.       SUBROUTINE TEXTLABEL(ROW,COLUMN,STRING) 
  193. C     **************************************************************
  194. C     SUBROUTINE TO WAIT FOR USER SIGNAL AND EXIT GRAPHICS MODE. TERMINAL
  195. C     IS RESTORED TO PRE-VIDEO CONDITIONS...
  196. C     --------------------------------------------------------------
  197.       IMPLICIT NONE
  198. C
  199.       INCLUDE 'FGRAPH.FD'
  200. C
  201.       INTEGER*2         ROW             !TEXT ROW POSITION
  202.       INTEGER*2         COLUMN          !TEXT COLUMN POSITION
  203. C
  204.       CHARACTER         STRING*(*)      !TEXT STRING FOR LABEL
  205. C
  206.       RECORD /RCCOORD/ CURPOS
  207. C
  208. C
  209. C     OUTPUT USER SUPLIED STRING AT ROW,COLUMN ...
  210. C
  211.       CALL SETTEXTPOSITION(ROW,COLUMN,CURPOS)
  212.       CALL OUTTEXT(STRING)
  213. C
  214.       RETURN
  215.       END 
  216. C
  217. C
  218. C    >**************************************************************
  219.       SUBROUTINE EXITGRAPHICS(TLU) 
  220. C     **************************************************************
  221. C     SUBROUTINE TO WAIT FOR USER SIGNAL AND EXIT GRAPHICS MODE. TERMINAL
  222. C     IS RESTORED TO PRE-VIDEO CONDITIONS...
  223. C     --------------------------------------------------------------   
  224.       IMPLICIT NONE
  225. C
  226.       INCLUDE 'FGRAPH.FD'
  227. C
  228.       INTEGER*2         TLU             !TERMINAL LOGICAL UNIT NUMBER
  229.       INTEGER*2         DUMMY           !DUMMY FUNCTION ARGUMENT
  230.       INTEGER*2         ROW             !TEXT ROW POSITION
  231.       INTEGER*2         COLUMN          !TEXT COLUMN POSITION
  232. C
  233.       ROW=25
  234.       COLUMN=28
  235. C
  236. C
  237. C     OUTPUT PROMPT AND WAIT FOR ENTER KEY ...
  238. C
  239.       CALL TEXTLABEL(ROW,COLUMN,'PRESS ENTER TO CONTINUE')
  240.       READ(TLU,*)
  241. C
  242. C     RESET VIDEO MODE AND STOP
  243. C
  244.       DUMMY=SETVIDEOMODE($DEFAULTMODE)
  245. C
  246.       RETURN
  247.       END 
  248. C
  249. C
  250. C    >**************************************************************
  251.       SUBROUTINE GINIT(TLU) 
  252. C     **************************************************************
  253. C     SUBROUTINE TO INITIALIZE IBM PC GRAPHICS MODE TO MAXIMUM
  254. C     AVAILABLE RESOLUTION ...
  255. C     --------------------------------------------------------------
  256.       IMPLICIT NONE
  257. C
  258.       INCLUDE 'FGRAPH.FD'
  259. C
  260.       INTEGER*2         ERRC            !ERROR CODE RETURNED
  261.       INTEGER*2         TLU             !TERMINAL LOGICAL UNIT NUMBER
  262.       INTEGER*2         DUMMY           !DUMMY FUNCTION ARGUMENT
  263. C
  264.       LOGICAL*2         WINDINVERT      !INVERT WINDOW COORDINATES IF TRUE
  265. C
  266.       REAL*8            LOWERX          !LOWER X AXIS CORNER OF WINDOW
  267.       REAL*8            LOWERY          !LOWER Y AXIS CORNER OF WINDOW
  268.       REAL*8            UPPERX          !UPPER X AXIS CORNER OF WINDOW
  269.       REAL*8            UPPERY          !UPPER Y AXIS CORNER OF WINDOW
  270. C
  271. C
  272. C
  273. C     INITIALIZE VIDEO MODE TO MAXIMUM RESOLUTION AVAILABLE
  274. C
  275.       ERRC=SETVIDEOMODE($MAXRESMODE)
  276.       IF (ERRC.EQ.0) THEN
  277.         WRITE(TLU,*)' ERROR: CANNOT SET VIDEO MODE'
  278.         STOP
  279.       END IF
  280. C
  281.       LOWERX=-3.0
  282.       LOWERY=3.0
  283.       UPPERX=-3.0
  284.       UPPERY=3.0
  285.       WINDINVERT=.TRUE.
  286.       DUMMY=SETWINDOW(WINDINVERT,LOWERX,LOWERY,UPPERX,UPPERY)
  287. C
  288.       RETURN
  289.       END 
  290. C
  291. C
  292. C    >**************************************************************
  293.       SUBROUTINE PLOT(XPOS,YPOS,PENC) 
  294. C     **************************************************************
  295. C     SUBROUTINE TO DRAW OR MOVE TO THE USER SPECIFIED POSITION 'XPOS,
  296. C     YPOS' WITH PEN CONTROL AS DESIGNATED BY 'PENC'.
  297. C     --------------------------------------------------------------   
  298.       IMPLICIT NONE
  299. C
  300.       INCLUDE 'FGRAPH.FD'
  301. C
  302.       INTEGER*2         DUMMY           !DUMMY FUNCTION ARGUMENT
  303.       INTEGER*2         PENC            !PEN CONTROL: 2=DRAW,3=MOVE
  304. C
  305.       REAL*8            XPOS            !HORIZONTAL PIXEL POSITION
  306.       REAL*8            YPOS            !VERTICAL PIXEL POSITION
  307. C
  308.       RECORD /WXYCOORD/ XY
  309. C
  310.       IF (PENC.EQ.2) THEN 
  311.         DUMMY=LINETO_W(XPOS,YPOS)
  312.       ELSE
  313.         CALL MOVETO_W(XPOS,YPOS,XY)
  314.       END IF
  315. C
  316.       RETURN
  317.       END 
  318.  
  319.  
  320.  
  321.  
  322. [LISTING TWO]
  323.                        Top Level Fragment
  324.  
  325.  
  326. C    >**********************************************************
  327.       PROGRAM GLOBE
  328. C     **********************************************************
  329. C
  330. C PROGRAM TO DRAW A GLOBE AT A USER SPECIFIED ANGLE ON A GRAPHICS
  331. C SURFACE. INPUTS ALSO INCLUDE LOCATION OF GRATING LOBES REFERENCED
  332. C TO LONGITUDE AND LATITUDE.
  333. C AUTHOR: SCIENTIFIC CONCEPTS
  334. C    
  335. --------------------------------------------------------------
  336. .
  337. .
  338. .
  339.       CALL GINIT         !INITIALIZE GRAPHICS DEVICE
  340. .
  341. .
  342. .
  343.       END
  344.  
  345.                     Layer 3: Graphics Primitives   
  346.  
  347. C*******************************************************C
  348.       SUBROUTINE GINIT
  349. C*******************************************************C
  350. C     PURPOSE: INITIALIZE GRAPHICS DEVICE CURRENTLY
  351. C              SET BY GLOBAL VARIABLE 'DEVICETYPE' ... 
  352. .
  353. .
  354. .
  355.       IF (DEVICETYPE.EQ.HPGL) THEN         !HP GRAPHICS DEVICE
  356.         CALL HPGLINIT
  357.       ELSE IF (DEVICETYPE.EQ.IBMPC) THEN   !IBM MODES CGA-VGA
  358.         CALL IBMPCINIT
  359.       ELSE IF (DEVICETYPE.EQ.TEK) THEN     !TEKTRONIX DEVICES
  360.         CALL TEKINIT
  361.       ELSE IF (DEVICETYPE.EQ.DECVT) THEN   !DEC VT340
  362.         CALL DECVTINIT
  363.       ELSE IF (DEVICETYPE.EQ.VAXSTA) THEN  !DEC VAXSTATION 2000
  364.         CALL VAXSTAINIT  
  365. .
  366. .    
  367. .     ELSE
  368.         CALL INITERROR
  369.       END IF
  370.  
  371.                Layer 2: Graphics Device Drivers      
  372.  
  373. C*******************************************************C
  374.       SUBROUTINE IBMPCINIT
  375. C*******************************************************C
  376. C     PURPOSE: INITIALIZE CURRENT IBM PC GRAPHICS MODE
  377. C              COLORS, RESOLUTION ETC ...
  378. .
  379. .
  380. .
  381.  
  382. C
  383.       IF (IBMMODE.EQ.EGACOLOR) THEN
  384.         DUMMY=SETVIDEOMODE($ERESCOLOR)
  385.       ELSE IF (IBMMODE.EQ.HERCULES) THEN
  386.         DUMMY=SETVIDEOMODE($HERCMONO)
  387. .
  388. .
  389. .
  390.       END IF
  391. C
  392.       RETURN
  393.       END
  394. C
  395. C*******************************************************C
  396.       SUBROUTINE VAXSTAINIT
  397. C*******************************************************C
  398. C     PURPOSE: INITIALIZE VAXSTATION 200 GRAPHICS DEVICE
  399. C              MODE, VIEWPORT ...
  400. .
  401. .
  402. .
  403. C
  404.       LOWLX=1.0             !LOWER LEFT X COORDINATE
  405.       LOWLY=1.0             !LOWER LEFT Y COORDINATE
  406.       UPPRX=20.0            !UPPER RIGHT X COORDINATE
  407.       UPPRY=20.0            !UPPER RIGHT Y COORDINATE
  408.       DISPWIDTH=20.0        
  409.       DISPHEIGHT=20.0
  410. C
  411.       VD_ID=UIS$CREATE_DISPLAY(LOWLX,LOWLY,UPPRX,UPPRY,
  412.      +                           DISPWIDTH,DISPHEIGHT)
  413.       WD_ID=UIS$CREATE_WINDOW(VD_ID,'SYS$WORKSTATION')
  414. C
  415. .
  416. .
  417. .
  418.       RETURN
  419.       END
  420. C
  421. C
  422.  
  423.