home *** CD-ROM | disk | FTP | other *** search
- SUBROUTINE POLAR(RADIAL,RR,THETA,DATA,MODE,NUM,ISYMNO,SYMSIZ,
- 1 NPBSYM,PLTLAB)
- C
- C POLAR PLOT SUBROUTINE FOR DIGLIB
- C
- C AUTHOR: JIM LOCKER, SOFTECH INC.
- C MAY 1989
- C
- C POLAR ACCEPTS DATA IN THE FOLLOWING MODES;
- C
- C MODE(1) CONTROLS THE TYPE OF DATA AND WHETHER OR NOT AXES/RANGE
- C RINGS ARE DRAWN
- C
- C MODE(1)= 1 IS R-THETA INFORMATION AND THE PLOT IS TYPE REAL
- C
- C MODE(1)= 2 IS REAL-IMAGINARY TYPE INFORMATION AND THE PLOT REPRESENTS
- C A COMPLEX PLANE PLOT
- C
- C IF MODE(1)= 1, RR IS AN ARRAY OF RADIAL INFORMATION
- C AND THETA IS AN ARRAY OF ANGULAR INFORMATION CORRESPONDING
- C TO THE RADIAL INFORMATION
- C
- C IF MODE(1)= 2, RR IS THE REAL DATA
- C AND THETA IS THE IMAGINARY DATA SO THAT THE DATA SET IS OF THE
- C FORM X+IY
-
- C MODE(1) = 3 IS LIKE MODE(1) = 1 EXCEPT NO AXES OR RANGE RINGS ARE DRAWN
- C MODE(1) = 4 IS LIKE MODE(1) = 2 EXCEPT NO AXES OR RANGE RINGS.
- C
- C MODE(2) CONTROLS THE SCALE OF THE PLOT
- C
- C MODE(2) = 1 INDICATES A LINEAR RADIAL SCALE
- C
- C MODE(2) = 2 INDICATES A LOGARITHMIC RADIAL SCALE
- C
- C MODE(3) TELLS THE NUMBER OF RANGE RINGS TO DRAW. IN LINEAR RADIAL
- C MODE, THIS IS THE NUMBER THAT WILL BE DRAWN. IN LOGARITHMIC MODE,
- C THIS IS THE NUMBER THAT WILL BE DRAWN PER DECADE.
- C
- C MODE(4) DICTATES THE STYLE OF THE LINE FOR RANGE RINGS, FOLLOWING
- C DIGLIB CONVENTION.
- C
- C MODE(5) TELLS WHETHER OR NOT RADIAL TICK MARKS ARE TO BE USED. IF
- C MODE(5) = 0, NO RADIAL TICK MARKS. IF MODE(5) .GT. 0, THEN OUTWARD
- C POINTING TICKS AT DEGREE INCREMENTS SPECIFIED BY THE VALUE IN MODE(5)
- C IF MODE(5) .LT. 0, THEN INWARD POINTING TICKS.
- C
- C MODE(6) SPECIFIES THE COLOR OF THE AXES, RANGE RINGS, AND TICK MARKS
- C MODE(7) SPECIFIES THE COLOR OF THE DATA
- C MODE(8) SPECIFIES THE LINE STYLE OF THE DATA, FOLLOWING DIGLIB
- C CONVENTION
- C
- C NUM IS THE NUMBER OF DATA POINTS
- C
- C DATA IS A WORKSPACE PASSED FROM THE CALLING ROUTINE
- C
- C ISYMNO IS THE CODE FOR THE SYMBOLS TO DRAW
- C
- C SYMSIZ IS THE SIZE OF THE SYMBOLS TO DRAW
- C
- C NPBSYM IS THE NUMBER OF DATA POINTS TO SKIP BETWEEN SYMBOLS
- C
- C PLTLAB IS THE PLOT LABEL
- C
- EXTERNAL LEN
- INTEGER*4 NUM,ISYMNO,NPBSYM
- INTEGER*2 MODE(8)
- REAL*4 RADIAL,RADIUS,SYMSIZ,MOD
- REAL*4 RR(NUM),THETA(NUM),DATA(NUM,2)
- REAL*4 XVSTRT,YVSTRT,XVLEN,YVLEN,XOFF,YOFF,CXSIZE,CYSIZE,
- 1 TICKLN
- INCLUDE PLTSIZ.PRM
- INCLUDE PLTPRM.PRM
- INCLUDE GCLTYP.PRM
- REAL*4 DEVID,XLENCM,YLENCM,XRES,YRES,NDCLRS,IDVBTS,NFLINE,
- 1 XCLIPD,YCLIPD
- COMMON /GCDCHR/ DEVID, XLENCM, YLENCM, XRES, YRES,
- 1 NDCLRS, IDVBTS, NFLINE, XCLIPD, YCLIPD
- REAL*4 XMIN,XMAX,YMIN,YMAX
- COMMON/PLTCLP/XMIN,XMAX,YMIN,YMAX
-
- INTEGER*4 JJ,KK,COLR
- CHARACTER*1 LAB(14),TAG(27),PLTLAB(2)
- CHARACTER*13 HEADER
- REAL*4 XORG,YORG,XSKAL,YSKAL
- COMMON/POL/XORG,YORG,XSKAL,YSKAL
-
- EQUIVALENCE (HEADER,TAG)
- DATA HEADER/'MAX RADIUS = '/
- C
- C SAVE THE OLD LINE TYPE
- C
- IOLDLT = ILNTYP
- ILNTYP = 1
- C
- C DETERMINE THE PLOT ORIGIN IN VIRTUAL COORDINATES
- C
- RADIUS = RADIAL
- XORG = XVSTRT + (XVLEN-XVSTRT)/2
- YORG = YVSTRT + (YVLEN-YVSTRT)/2
- C
- C LOGARITHMIC?
- C
- IF(MODE(2) .EQ. 2) RADIUS = ALOG10(RADIUS)
- C
- C SET THE PLOT SCALE
- C
- XSKAL = (XVLEN - XORG)/RADIUS
- YSKAL = (YVLEN - YORG)/RADIUS
- C
- C DEPENDING UPON MODE, DRAW THE AXES AND RANGE RINGS OR NOT.
- C
- COLR = MODE(6)
- CALL GSCOLR(COLR,IERR)
- IF (MODE(1) .EQ. 1 .OR. MODE(1) .EQ. 2) THEN
- CALL GSMOVE(XVSTRT,YORG)
- CALL GSDRAW(XVLEN,YORG)
- CALL GSMOVE(XORG,YVSTRT)
- CALL GSDRAW(XORG,YVLEN)
- CALL CIRCLE(RADIUS)
- C
- C NOW DO RANGE RINGS, IF INDICATED
- C
- IF (MODE(3) .GT. 0) THEN
- MOD = FLOAT(MODE(3))
- LINSYL = MODE(4)
- CALL GSLTYP(LINSYL)
- C
- C TEST FOR LOG OR LIN
- C
- IF(MODE(2) .NE. 2) THEN
- C
- C LIN
- C
- RINC = RADIUS/MOD
- DO 3 II = 1,MODE(3)-1
- RAD = FLOAT(II)*RINC
- CALL CIRCLE(RAD)
- 3 CONTINUE
- ELSE
- C
- C LOG
- C
- RINC = 10/MOD
- JJ = RADIUS
- DO 103 II = 0,JJ+1
- DO 102 KK = 1,MODE(3)
- RAD = ALOG10(FLOAT(KK)*RINC*(10**II))
- IF(RAD .LT. RADIUS) THEN
- CALL CIRCLE(RAD)
- ENDIF
- 102 CONTINUE
- 103 CONTINUE
- ENDIF
- ENDIF
- ENDIF
- CALL GSLTYP(1)
- C
- C NOW DETERMINE CHARACTER SIZES FOR LABELS AND TICK MARKS
- C
- CSIZE = GOODCS(AMAX1(0.3,AMIN1(YTOP-YBOT,XRIGHT-XLEFT)/80.0))
- CALL GSSETC(CSIZE,0)
- C
- C AND DO THE TICK MARKS AND TICK LABELS, IF INDICATED
- C
- IF(MODE(5) .NE. 0) THEN
- TICKLN = CSIZE * 0.9
- DO 122 JJ = 0,360,ABS(MODE(5))
- ANG = FLOAT(JJ)*6.283185/360
- ANGX = COS(ANG)
- ANGY = SIN(ANG)
- XX1 = RADIUS*ANGX*XSKAL
- YY1 = RADIUS*ANGY*YSKAL
- DELTAX = TICKLN*ANGX
- DELTAY = TICKLN*ANGY
- SPOSX = XORG + XX1
- SPOSY = YORG + YY1
- IF(MODE(5) .GT. 0) THEN
- FPOSX = SPOSX + DELTAX
- FPOSY = SPOSY + DELTAY
- ELSE
- FPOSX = SPOSX - DELTAX
- FPOSY = SPOSY - DELTAY
- ENDIF
- CALL GSMOVE(SPOSX,SPOSY)
- CALL GSDRAW(FPOSX,FPOSY)
- C
- C AND LABEL THE TICKS
- C
- CALL LINLAB(JJ,0,LAB,0)
- LENGTH = LEN(LAB)
- IF(JJ .GT. 90 .AND. JJ .LT.270) THEN
- CPOSX = CSIZE*ANGX*(LENGTH + 0.75)
- ELSE
- CPOSX = CSIZE*ANGX*.5
- ENDIF
- IF(JJ .LT. 180) THEN
- CPOSY = .6*ANGY*CSIZE
- ELSE
- CPOSY = ANGY*1.8*CSIZE
- ENDIF
- IF(JJ .GE. 355) CYCLE
- IF(MODE(5) .GT. 0) THEN
- CALL GSMOVE(FPOSX+CPOSX,FPOSY+CPOSY)
- ELSE
- CALL GSMOVE(SPOSX+ 1.1*CPOSX,SPOSY+ 1.5*CPOSY)
- ENDIF
- CALL GSPSTR(LAB)
- 122 CONTINUE
- ENDIF
- C
- C NOW PROVIDE THE MAXIMUM RADIUS VALUE AS A LABEL
- C
- IF(MODE(1) .EQ. 1 .OR. MODE(1) .EQ. 2) THEN
- IRAD = RADIAL
- CALL LINLAB(IRAD,0,LAB,0)
- CALL GSMOVE(XORG + RADIUS*XSKAL*0.8,YORG+RADIUS*YSKAL)
- DO 123 JJ = 1,14
- 123 TAG(JJ+13) = LAB(JJ)
- CALL GSPSTR(TAG)
- ENDIF
- C
- C AND PLACE THE PLOT LABEL ON THE PLOT
- C
- LENGTH = LEN(PLTLAB)
- CALL GSMOVE(XORG-CSIZE*LENGTH/2,YORG - RADIUS*YSKAL - 5*CSIZE)
- CALL GSPSTR(PLTLAB)
- C
- C DEPENDING UPON MODE, CONVERT POLAR DATA TO X-Y FOR PLOT, OR NOT
- C
- IF(MODE(1) .EQ. 1 .OR. MODE(1) .EQ. 3) THEN
- DO 150, JJ = 1,NUM
- C
- C LOG OR LIN RADIUS
- C
- IF(MODE(2) .NE. 2) THEN
- R = RR(JJ)
- ELSE
- R = ALOG10(RR(JJ))
- ENDIF
- DATA(JJ,1)=R * COS(THETA(JJ))
- DATA(JJ,2)=R * SIN(THETA(JJ))
- 150 CONTINUE
- ELSE
- DO 155 JJ = 1,NUM
- DATA(JJ,1)=RR(JJ)
- DATA(JJ,2)=THETA(JJ)
- 155 CONTINUE
- ENDIF
- C
- C LOGARITHMIC AND OF FORM X+IY ?
- C
- IF(MODE(2) .EQ. 2 .AND. (MODE(1) .EQ. 2 .OR. MODE(1) .EQ. 4)) THEN
- DO 165 II = 1,NUM
- DO 165 KK = 1,2
- IF(DATA(II,KK) .GT. 0)DATA(II,KK) = ALOG10(DATA(II,KK))
- C
- C DON'T PLOT ANYTHING THAT IS A NEGATIVE VALUE ON A LOG POLAR PLOT
- C
- IF(DATA(II,KK) .LT. 0)DATA(II,KK) = 0
- 165 CONTINUE
- ENDIF
- C
- C NOW SCALE THE DATA TO FIT THE PLOT
- C
- DO 170 JJ = 1,NUM
- DATA(JJ,1) = DATA(JJ,1)*XSKAL + XORG
- DATA(JJ,2) = DATA(JJ,2)*YSKAL + YORG
- 170 CONTINUE
- LINSYL = MODE(8)
- CALL GSLTYP(LINSYL)
- CALL GSMOVE(DATA(1,1),DATA(1,2))
- COLR = MODE(7)
- CALL GSCOLR(COLR,IERR)
- DO 211 JJ = 2,NUM
- CALL GSDRAW(DATA(JJ,1),DATA(JJ,2))
- 211 CONTINUE
- CALL GSLTYP(1)
- C
- C NOW ADD SYMBOLS IF DESIRED
- C
- IF (ISYMNO .LE. 0) GO TO 800
- C
- C DO SYMBOLS IN SOLID LINES
- C
- DO 400 I=1,NUM,NPBSYM
- CALL GSMOVE(DATA(I,1),DATA(I,2))
- CALL SYMBOL(ISYMNO,SYMSIZ)
- 400 CONTINUE
- C
- C RESTORE LINE TYPE
- C
-
- ILNTYP = IOLDLT
- 800 CONTINUE
- RETURN
- END
- C
- C THIS SUBROUTINE DRAWS THE CIRCLES FOR THE RANGE RINGS
- C
- SUBROUTINE CIRCLE(RADIUS)
- REAL*4 RADIUS
- REAL*4 XVSTRT,YVSTRT,XVLEN,YVLEN,XOFF,YOFF,CXSIZE,CYSIZE,
- 1 TICKLN
- INCLUDE PLTSIZ.PRM
- INCLUDE PLTPRM.PRM
- INCLUDE GCLTYP.PRM
- REAL*4 DEVID,XLENCM,YLENCM,XRES,YRES,NDCLRS,IDVBTS,NFLINE,
- 1 XCLIPD,YCLIPD
- COMMON /GCDCHR/ DEVID, XLENCM, YLENCM, XRES, YRES,
- 1 NDCLRS, IDVBTS, NFLINE, XCLIPD, YCLIPD
- REAL*4 XMIN,XMAX,YMIN,YMAX
- COMMON/PLTCLP/XMIN,XMAX,YMIN,YMAX
- REAL*4 XORG,YORG,XSKAL,YSKAL
- COMMON/POL/XORG,YORG,XSKAL,YSKAL
- DTORAD = 6.283185/360
- CALL GSMOVE(XORG+XSKAL*RADIUS,YORG)
- DO 10 II = 1,360,2
- XX = FLOAT(II)
- X = XORG+RADIUS*XSKAL*COS(DTORAD*XX)
- Y = YORG+RADIUS*YSKAL*SIN(DTORAD*XX)
- CALL GSDRAW(X,Y)
- 10 CONTINUE
- RETURN
- END
-