Re: OT: Determining the size of plotting area
  Home FAQ Contact Sign in
comp.lang.fortran only
 
Advanced search
POPULAR GROUPS

more...

 Up
Re: OT: Determining the size of plotting area         

Group: comp.lang.fortran · Group Profile
Author: Kevin G. Rhoads
Date: Sep 17, 2008 09:42

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
no comments
diggit! del.icio.us! reddit!

RELATED THREADS
SubjectArticles qty Group
do structure definitions go in data area or in code area...15 comp.lang.c ·