home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d2xx
/
d267
/
diglib.lha
/
Diglib
/
diglib.zoo
/
diglib
/
AXIS.FOR
< prev
next >
Wrap
Text File
|
1989-06-20
|
4KB
|
130 lines
SUBROUTINE AXIS(BLOW,BHIGH,MAXTKS,LSHORT,LRAGGD,BMIN,BMAX,
1 BTMIN,BTMAX,BTICK,IPWR)
LOGICAL*1 LSHORT, LRAGGD
C
C THIS SUBROUTINE IS MAINLY FOR INTERNAL USE,
C ITS FUNCTION IS TO DETERMINE A SUITABLE
C "TICK" DISTANCE OVER THE RANGE SPECIFIED BETWEEN
C ALOW AND AHIGH. IT OUTPUTS THE AXIS RANGE BMIN,BMAX
C AND THE TICK DISTANCE BTICK STRIPPED OF THEIR POWER OF
C TEN. THE POWER OF TEN IS RETURNED IN THE VAR. IPWR.
C
DIMENSION JTICKS(6)
LOGICAL*2 LDIVDS
LOGICAL*1 LISNEG
C
C IF A RAGGED AXIS IS "TOO CLOSE" TO THE NEXT TICK, THEN EXTEND IT.
C THE "TOO CLOSE" PARAMETER IS THE VARIABLE TOOCLS
C
DATA TOOCLS /0.8/
C
DATA FUZZ /0.001/
DATA JTICKS /1,2,5,4,3,10/
C
C
MAXTKS = MAX0(1,MAXTKS)
MINTKS = MAX0(1,MAXTKS/2)
BMAX = BHIGH
BMIN = BLOW
LISNEG = .FALSE.
IF (BMAX .GE. BMIN) GO TO 30
BMAX = BLOW
BMIN = BHIGH
LISNEG = .TRUE.
C
C MAKE SURE WE HAVE ENOUGH RANGE, IF NOT, INCREASE AHIGH
C
30 RANGE = BMAX - BMIN
TEMP = AMAX1(ABS(BMIN),ABS(BMAX))
IF (TEMP .EQ. 0.0) TEMP = 10.0
IF (RANGE/TEMP .GE. 5.0E-3) GO TO 40
BMIN = BMIN - 5.0E-3*TEMP
BMAX = BMAX + 5.0E-3*TEMP
40 CONTINUE
C
C STRIP THE RANGE OF ITS POWER OF TEN
C
IPWR=ALOG10(BMAX-BMIN)-2
50 TENX = 10.0**IPWR
ASTRT = AINT(BMIN/TENX)
AFIN = AINT(BMAX/TENX+0.999)
IF (AFIN*TENX .LT. BMAX) AFIN = AFIN + 1
RANGE = AFIN - ASTRT
IF (RANGE .LE. 10*MAXTKS) GO TO 75
IPWR = IPWR + 1
GO TO 50
75 CONTINUE
C
C SEARCH FOR A SUITABLE TICK
C
D TYPE 9999, BMIN, ASTRT, BMAX, AFIN, TENX
D9999 FORMAT(/' AXIS DEBUG'/' DATA STRIPPED'/
D 1 2(1X,G14.7,2X,G14.7/)/' POWER = ',G14.7)
BTICK = 0
DO 100 I=1,6
TICK = JTICKS(I)
NTICK = RANGE/TICK+0.999
IF (NTICK .LT. MINTKS .OR. NTICK .GT. MAXTKS) GO TO 100
IF (LDIVDS(ASTRT,TICK) .AND. LDIVDS(AFIN,TICK)) GO TO 150
IF (BTICK .EQ. 0) BTICK = TICK
100 CONTINUE
C
C USE BEST NON-PERFECT TICK
C
GO TO 160
C
C FOUND A GOOD TICK
C
150 BTICK=JTICKS(I)
160 CONTINUE
IF (BTICK .NE. 10.0) GO TO 165
BTICK = 1.0
IPWR = IPWR + 1
TENX = 10.0*TENX
165 TICK = BTICK*TENX
C
C FIGURE OUT TICK LIMITS
C
BTMIN = BTICK*AINT(BMIN/TICK)
IF (BTMIN*TENX .LT. BMIN) BTMIN = BTMIN + BTICK
BTMAX = BTICK*AINT(BMAX/TICK)
IF (BTMAX*TENX .GT. BMAX) BTMAX = BTMAX - BTICK
NINTVL = (BTMAX-BTMIN)/BTICK
C
C IF USER ABSOLUTELY MUST HAVE RAGGED AXIS, THEN FORCE IT.
C
IF (LSHORT .AND. LRAGGD) GO TO 180
C
C CHECK INDIVIDUALLY
C
IF (LSHORT .AND. (NINTVL .GT. 0) .AND.
1 ((BTMIN-BMIN/TENX)/BTICK .LE. TOOCLS) ) GO TO 170
IF ((BTMIN-BMIN/TENX) .GT. FUZZ) BTMIN = BTMIN - BTICK
BMIN = BTMIN*TENX
170 CONTINUE
IF (LSHORT .AND. (NINTVL .GT. 0) .AND.
1 ((BMAX/TENX-BTMAX)/BTICK .LE. TOOCLS) ) GO TO 180
IF ((BMAX/TENX-BTMAX) .GT. FUZZ) BTMAX = BTMAX + BTICK
BMAX = BTMAX*TENX
180 CONTINUE
IF (.NOT. LISNEG) GO TO 200
C SWITCH BACK TO BACKWARDS
BTICK = -BTICK
TEMP = BMIN
BMIN = BMAX
BMAX = TEMP
TEMP = BTMIN
BTMIN = BTMAX
BTMAX = TEMP
200 RETURN
END
FUNCTION LDIVDS(ANUMER,ADENOM)
LOGICAL*2 LDIVDS
IF (ANUMER/ADENOM .EQ. AINT(ANUMER/ADENOM)) GO TO 10
LDIVDS = .FALSE.
RETURN
10 LDIVDS = .TRUE.
RETURN
END