X0=0 Y0=0 X1=50 Y1=10 TOUCHSCREEN A=0 DO X1=50*COS(A) Y1=50*SIN(A) ADD A,0.01 X0=TOUCH.X-80 Y0=TOUCH.Y-64 CALL ALLIGN(X0,Y0,X1,Y1) CALL PLOT_VECTOR(0,X0,Y0,0) CALL PLOT_VECTOR(1,X1,Y1,1) CALL PLOT_VECTOR(2,TOUCH.X-80,TOUCH.Y-63,0) FOR I=0 TO 2 CALL PLOT_LINE(3+I*10,80,64,A+(0.5*I-0.5)*PI,5,2) NEXT I FOR I=0 TO 1 CALL PLOT_LINE(33+I*10,80+X0,64+Y0,A+I*PI,5,0) NEXT I WAIT VBL LOOP SUB ALLIGN(X,Y,RX,RY) M=X A=Y RM=RX RA=RY CALL POLAR(M,A) CALL POLAR(RM,RA) DA=A-RA IF NOT(ABS(DA)<=0.5*PI OR ABS(DA)>=1.5*PI) THEN RA=1.5*PI-RA NA=A+RA-2*PI*(RA<0)-0.5*PI M=-M*SIN(NA) X=COS(RA)*M Y=SIN(RA)*M END IF END SUB SUB PLOT_VECTOR(N,X,Y,P) SPRITE N,X+80,Y+64,1 SPRITE N PAL P END SUB SUB PLOT_LINE(N,X0,Y0,A,S,P) FOR I=0 TO 9 SPRITE N+I,X0+COS(A)*I*S,Y0+SIN(A)*I*S,2 SPRITE N+I PAL P NEXT I END SUB SUB UNIT_VECTOR(DX,DY) D=0 CALL MAG(DX,DY,D) CALL INVERT(D) DX=DX*D DY=DY*D END SUB SUB UNIT_VECTOR2(DX,DY,M) D=0 CALL MAG(DX,DY,D) M=D CALL INVERT(D) DX=DX*D DY=DY*D END SUB SUB SCALE(V,S) V=V*S END SUB SUB MAG(X,Y,M) M=SQR(X*X+Y*Y) END SUB SUB MAG_SQ(X,Y,D) D=X*X+Y*Y END SUB SUB INVERT(V) IF V<>0 THEN V=1/V ELSE V=0 END SUB SUB POLAR(I1,I2) 'A LITTLE BIT OF MATH TO GET AN ANGLE AND A LENGTH FROM A SET OF COORDINATES 'CONVERTS THE CARTESIAN (X,Y) TO THE POLAR (RADIUS,ANGLE) 'CODE EXPLANATION '1 SET A TO INPUT 1 '2 SET B TO INPUT 2 '3 I1 TO THE LENGTH OF THE VECTOR (PYTHAGORAS) '4 IF THE LENGTH VARIABLE (I1) SUPPORTS DIVISIONS '5 I2 TO THE ANGLE OF THE VECTOR: ATAN2 MADE WITH ACOS IN A UNIT CIRCLE AND SGN(B) (NOT 0) '6 IF THE LENGTH IS ZERO WE MAY AS WELL HAVE NO ANGLE AT ALL A=I1 B=I2 I1=SQR(A*A+B*B) IF I1>0 THEN I2=ACOS(MIN(1,MAX(-1,A/I1))) * (1+2*(B>=0)) ELSE I2=0 END IF END SUB SUB CARTHESIAN(I0,I1) I0=COS(I0)*I1 I1=SIN(I0)*I1 END SUB 'TRASHBIN SUB ALLIGN1(X,Y,RX,RY) M=X A=Y RM=RX RA=RY CALL POLAR(M,A) CALL POLAR(RM,RA) DA=A-RA IF NOT(ABS(DA)<=0.5*PI OR ABS(DA)>=1.5*PI) THEN RA=1.5*PI-RA DA2=A+RA A=RA NA=DA2-2*PI*(A<0)-0.5*PI M=-M*SIN(NA) X=COS(A)*M Y=SIN(A)*M END IF END SUB SUB ALLIGN2(X,Y,RX,RY) M=X A=Y RM=RX RA=RY CALL POLAR(M,A) CALL POLAR(RM,RA) DA=A-RA DA2=A+RA IF NOT(ABS(DA)<=0.5*PI OR ABS(DA)>=1.5*PI) THEN 'TRACE SGN(DA)*SGN(A) 'TRACE DA2*SGN(A)-0.5*PI NA=DA2-2*PI*(A<0)-0.5*PI TRACE NA 'TRACE COS(DA2*SGN(A)-0.5*PI) 'A=RA+0.5*PI+0.5*PI*SGN(DA)*SGN(A) 'A=RA+0.5*PI+0.5*PI*SGN(DA2*SGN(A)-0.5*PI) 'A=RA+0.5*PI-0.5*PI M=-M*SIN(NA) X=COS(RA)*M Y=SIN(RA)*M END IF END SUB #1:MAIN PALETTES 000C08040003020100302010003F3C00 003F2A15003F2A15003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 80000000000000000000000000000000 80000000000000008000000000000000