++INCLUDE AMGSYM.BSI

MAP1 GCB,X,32000

MAP1 POINT'ARRAY
MAP2 POINT'COUNT,B,2
MAP2 POINTS(20)
 MAP3 POINT'X,B,2
 MAP3 POINT'Y,B,2

MAP1 CLEAR'ARRAY
MAP2 CLEAR'COUNT,B,2
MAP2 CLEARS(20)
 MAP3 CLEAR'X,B,2
 MAP3 CLEAR'Y,B,2

MAP1 STATUS,F           !Status returned from AMIGOS calls

!Variables specific to this design
MAP1 XCENT(2),F
MAP1 YCENT(2),F
MAP1 RADIUS(2),F
MAP1 ANGLE(2),F

MAP1 PREVIOUS'LIST
       MAP2 PSEG(150,2)
        MAP3 PX,B,2
        MAP3 PY,B,2

MAP1 WPOINT,F
MAP1 RPOINT,F,6,-150

MAP1 COLOR'MAP(9)
MAP2 COLOR'INDEX,F
MAP2 COLOR'DATA
 MAP3 HUE,F
 MAP3 LIGHTNESS,F
 MAP3 SATURATION,F

XCENT(1)=11000
YCENT(1)=11000
XCENT(2)=1200
YCENT(2)=12500

ANGLE(1)=51
ANGLE(2)=210

PI = 3.141592654
PI2 = 2 * PI
NSEG = 16
COLOR = 4
LOW'X = 1000
LOW'Y = 1000
UP'X = 32300
UP'Y = 24000



RADIUS(1)=0
RADIUS(2)=0

BOUNCE:
       PRINT   TAB(-1,29);
!       XCALL AMGSBR,G'OPWK,GCB,"TK4105",STATUS,"","TERM2"
!       OPEN #1,"BOUNCE.LST",OUTPUT
       XCALL AMGSBR,G'OPWK,GCB,"",STATUS
       WPOINT = 1
       ON ERROR GOTO ABORT

!Clear the workstation
       XCALL AMGSBR,G'CLRW,GCB,STATUS
!Set workstation viewport
!       XCALL AMGSBR,G'SWKV,GCB,18000.,14000.,32000.,25000.
!Set polymarker type
       XCALL AMGSBR,G'SPMT,GCB,3,STATUS
! Initialize Color Map
       FOR I=1 TO 8
       COLOR'INDEX(I)=I-1
       XCALL AMGSBR,G'QCR,GCB,COLOR'INDEX(I),HUE(I),LIGHTNESS(I),SATURATION(I),STATUS
!       PRINT HUE(I),LIGHTNESS(I),SATURATION(I)
       NEXT I

!       POINT'COUNT = 5
!       POINT'X(1) = LOW'X-100
!       POINT'Y(1) = LOW'Y-100
!       POINT'X(2) = UP'X+100
!       POINT'Y(2) = LOW'Y-100
!       POINT'X(3) = UP'X+100
!       POINT'Y(3) = UP'Y+100
!       POINT'X(4) = LOW'X-100
!       POINT'Y(4) = UP'Y+100
!       POINT'X(5) = LOW'X-100
!       POINT'Y(5) = LOW'Y-100
!       XCALL AMGSBR,G'PL,GCB,POINT'ARRAY,STATUS

       POINT'COUNT = 2
       CLEAR'COUNT=2

LOOP:
!       IF INT(WPOINT/2)=WPOINT/2 THEN CALL ROTATE'COLOR
       IF INT(WPOINT/10)=WPOINT/10 THEN COLOR =INT(RND(1)*7)+1
!       CALL ROTATE'COLOR
!       COLOR=INT(RND(1)*7)+1
       P=1
       CALL    GET'POINT
       P=2
       CALL    GET'POINT
       XCALL AMGSBR,G'SPLC,GCB,COLOR,0,STATUS
       XCALL AMGSBR,G'PL,GCB,POINT'ARRAY,STATUS
       PSEG(WPOINT,1)=POINTS(1)
       PSEG(WPOINT,2)=POINTS(2)
       IF WPOINT = 150 THEN WPOINT = 1 ELSE WPOINT = WPOINT +1
       IF WPOINT = 1 AND RPOINT=-150 THEN RPOINT = 1
       IF RPOINT < 0 THEN GOTO LOOP
       CLEARS(1)=PSEG(RPOINT,1)
       CLEARS(2)=PSEG(RPOINT,2)
       XCALL AMGSBR,G'SPLC,GCB,0,STATUS
       XCALL AMGSBR,G'PL,GCB,CLEAR'ARRAY,STATUS
       IF RPOINT=150 THEN RPOINT =1 ELSE RPOINT=RPOINT+1
       GOTO LOOP

ABORT:
       XCALL AMGSBR,G'CLWK,GCB,STATUS
       END

GET'POINT:
       RADIUS(P)=RADIUS(P)+100+(P*20)
       Q=(PI2*ANGLE(P)/360)
       POINT'X(P+2)=XCENT(P)+RADIUS(P)*COS(Q)
       POINT'Y(P+2)=YCENT(P)+RADIUS(P)*SIN(Q)
       IF POINT'X(P+2)>UP'X OR POINT'X(P+2)<LOW'X OR &
        POINT'Y(P+2)<LOW'Y OR POINT'Y(P+2)>UP'Y THEN GOTO NEW'ANGLE
       POINTS(P)=POINTS(P+2)
       RETURN
NEW'ANGLE:
       ANGLE(P)=ANGLE(P)+1
       IF POINT'X(P+2)> LOW'X THEN GOTO SIDE2
       IF ANGLE(P)<180 THEN ANGLE(P)=ANGLE(P)-90 ELSE ANGLE(P)=ANGLE(P)+90
       GOTO ANG'DONE
SIDE2:  IF POINT'Y(P+2)<UP'Y THEN GOTO SIDE3
       IF ANGLE(P)<90 THEN THEN ANGLE(P)=360-ANGLE(P) ELSE ANGLE(P)=ANGLE(P)+90
       GOTO ANG'DONE
SIDE3:  IF POINT'X(P+2)<UP'X THEN GOTO SIDE4
       IF ANGLE(P)<180 THEN ANGLE(P)=ANGLE(P)+90 ELSE ANGLE(P)=ANGLE(P)-90
       GOTO ANG'DONE
SIDE4:  IF ANGLE(P)>270 THEN ANGLE(P)=360-ANGLE(P) ELSE ANGLE(P)=ANGLE(P)-90

ANG'DONE:
       IF ANGLE(P)<0 THEN ANGLE(P) = ANGLE(P)+360
       IF ANGLE(P) > 360 THEN ANGLE(P) =ANGLE(P)-360
       XCENT(P)=POINT'X(P)
       YCENT(P)=POINT'Y(P)
       RADIUS(P) = 0
       GOTO GET'POINT

ROTATE'COLOR:
       COLOR'DATA(9)=COLOR'DATA(2)
       FOR I = 2 TO 8
       COLOR'DATA(I)=COLOR'DATA(I+1)
       XCALL AMGSBR,G'SCR,GCB,COLOR'INDEX(I),HUE(I),LIGHTNESS(I),SATURATION(I),STATUS
       NEXT I
       RETURN