| Re: OT: Determining the size of plotting area |
|
 |
|
 |
|
 |
|
 |
Group: comp.lang.fortran · Group Profile
Author: GaryScottGaryScott Date: Sep 17, 2008 15:34
On Sep 17, 11:42Â am, "Kevin G. Rhoads" alum.mit.edu> wrote:
> In addition to suggestions received so far, I will note that
> if one uses log base 10 (i.e., common logs) it is possible
> to find the next higher power of ten that contains the
> values in question. Â This is useful for a starting range
> when scaling may be wildly disparate form one set to the next.
> It is also useful for gridding and generating tick marks.
>
> Example (F77 from early 1980s, target processor M680000):
>
> *----------
> Â Â Â ENTRY GENTIX
> Â Â Â TIKS = .TRUE.
> Â Â Â GRDS = .FALSE.
> Â Â Â XOR = .TRUE.
> Â 6789 CONTINUE
> Â Â Â XRANGE = XMAX - XMIN
> Â Â Â YRANGE = YMAX - YMIN
> Â Â Â XPOW = ALOG10(XRANGE)
> Â Â Â YPOW = ALOG10(YRANGE)
> Â Â Â NX = NINT(XPOW)
> Â Â Â NY = NINT(YPOW)
> Â Â Â XINCR = 10.0**NX
> Â Â Â YINCR = 10.0**NY
> Â Â Â NX = XRANGE/XINCR
> Â Â Â NY = YRANGE/YINCR
> Â Â Â IF (NX.LT.3) XINCR = XINCR/10.0
> Â Â Â IF (NY.LT.3) YINCR = YINCR/10.0
> Â Â Â NX = XRANGE/XINCR
> Â Â Â NY = YRANGE/YINCR
> Â Â Â IF (USEWIN) THEN
> Â Â Â Â Â IF (((T-B).LE.81).AND.NY.GT.9) THEN
> Â Â Â Â Â Â Â YINCR = YINCR*10.0
> Â Â Â Â Â ELSEIF (((T-B).LE.121).AND.NY.GT.19) THEN
> Â Â Â Â Â Â Â YINCR = YINCR*10.0
> Â Â Â Â Â ELSEIF (((T-B).LE.161).AND.NY.GT.29) THEN
> Â Â Â Â Â Â Â YINCR = YINCR*10.0
> Â Â Â Â Â ELSEIF (((T-B).LE.241).AND.NY.GT.39) THEN
> Â Â Â Â Â Â Â YINCR = YINCR*10.0
> Â Â Â Â Â ENDIF
> Â Â Â Â Â IF (((R-L).LE.65).AND.NX.GT.9) THEN
> Â Â Â Â Â Â Â XINCR = XINCR*10.0
> Â Â Â Â Â ELSEIF (((R-L).LE.97).AND.NX.GT.14) THEN
> Â Â Â Â Â Â Â XINCR = XINCR*10.0
> Â Â Â Â Â ELSEIF (((R-L).LE.129).AND.NX.GT.29) THEN
> Â Â Â Â Â Â Â XINCR = XINCR*10.0
> Â Â Â Â Â ELSEIF (((R-L).LE.193).AND.NX.GT.39) THEN
> Â Â Â Â Â Â Â XINCR = XINCR*10.0
> Â Â Â Â Â ENDIF
> Â Â Â Â Â NX = XRANGE/XINCR
> Â Â Â Â Â NY = YRANGE/YINCR
> Â Â Â ENDIF
> Â Â Â IF (NX.GE.51) XINCR = XINCR*10.0
> Â Â Â IF (NY.GE.51) YINCR = YINCR*10.0
> Â Â Â NX = XRANGE/XINCR
> Â Â Â NY = YRANGE/YINCR
> *
> Â Â Â LX = NINT(XMIN/XINCR-0.5)
> Â Â Â IX = 1
> Â Â Â IF (XMAX.GE.0.0) THEN
> Â Â Â Â Â XFOO = XMAX * 1.00001D0
> Â Â Â ELSE
> Â Â Â Â Â XFOO = XMAX * 0.99999D0
> Â Â Â ENDIF
> Â Â Â XTIK(55) = XFOO
> Â Â Â XTIK(54) = XFOO
> Â Â Â XTIK(53) = XFOO
> Â Â Â XTIK(52) = XFOO
> Â Â Â XTIK(51) = XFOO
> Â Â Â XTIK(50) = XFOO
> Â Â Â XTIK(0) = XMIN
> Â Â Â DO 1 I = LX,(LX+53)
> Â Â Â Â Â XTIK(IX) = FLOAT(I)*XINCR
> * Â Â Â Â IF (XTIK(IX).GT.XFOO) GOTO 30
> Â Â Â Â Â IX = IX + 1
> Â Â 1 CONTINUE
> Â Â 30 CONTINUE
> Â Â Â IF (IX.LT.54) THEN
> Â Â Â Â Â DO 11 I = IX,54
> Â Â Â Â Â Â Â XTIK(I) = XFOO
> Â Â 11 Â Â CONTINUE
> Â Â Â ENDIF
> Â Â Â LY = NINT(YMIN/YINCR-0.5)
> Â Â Â IY = 1
> Â Â Â IF (YMAX.GE.0.0) THEN
> Â Â Â Â Â YFOO = YMAX * 1.00001D0
> Â Â Â ELSE
> Â Â Â Â Â YFOO = YMAX * 0.99999D0
> Â Â Â ENDIF
> Â Â Â YTIK(55) = YFOO
> Â Â Â YTIK(54) = YFOO
> Â Â Â YTIK(53) = YFOO
> Â Â Â YTIK(52) = YFOO
> Â Â Â YTIK(51) = YFOO
> Â Â Â YTIK(50) = YFOO
> Â Â Â YTIK(0) = YMIN
> Â Â Â DO 2 I = LY,(LY+53)
> Â Â Â Â Â YTIK(IY) = FLOAT(I)*YINCR
> * Â Â Â Â IF (YTIK(IY).GT.YFOO) GOTO 31
> Â Â Â Â Â IY = IY + 1
> Â Â 2 CONTINUE
> Â Â 31 CONTINUE
> Â Â Â IF (IY.LT.54) THEN
> Â Â Â Â Â DO 21 I = IY,54
> Â Â Â Â Â Â Â YTIK(I) = YFOO
> Â Â 21 Â Â CONTINUE
> Â Â Â ENDIF
> Â Â Â IX = MAX(IX,IY,52,NX,NY)
> Â Â Â IF (GRDS) CALL DOGRID(XTIK(1),YTIK(1),IX,SCALES,0)
> Â Â Â IF (TIKS) THEN
> Â Â Â Â Â Â IF (XOR) THEN
> Â Â Â Â Â Â Â Â CALL TICKX(XTIK(1),YTIK(1),IX,SCALES,0)
> Â Â Â Â Â Â ELSE
> Â Â Â Â Â Â Â Â CALL DOTICK(XTIK(1),YTIK(1),IX,SCALES,0)
> Â Â Â Â Â Â ENDIF
> Â Â Â ENDIF
> Â Â Â RETURN
Yuck...I'm sure glad I use GINO...3D graphing, surface plots, dynamic
view rotation, imports/exports lots of other formats.
|