'CMD-LIKE TOOL 'SELECT CHARACTER '- ROM ENTRY (0-15) '- CHARACTER (0-255) -> NUMBER -> CELL DISPLAY 'SIZE (0-3) OR (4-15) (MAX IS 15 (ALL CHARACTERS)) 'FIRST ANGLE (DEGREES) 'LAST ANGLE (DEGREES) 'AMOUNT OF CHARACTERS 'SAVE IN FILE 'METADATA IN A SEPARATE FILE? (Y/N), ALWAYS NO, USER CAN EXTRACT IT MANUALLY 'CODE THAT COPIES FROM OUTPUT ROM TO CHARACTER CELL, PROGRAM GENERATES PARAMETERS, AND WRITES THEM TO A FILE, OR THE FILE 'METADATA: EACH OF THE USER DEFINED PARAMETERS IS STORED 'FILENAME IS "ROTATIONS V0-SP4CE" 'WITH METADATA: "META+ROTATIONS V0-SP4CE" 'ONLY METADATA: "ROT METADATA V0-SP4CE" 'FIND OTHER FILE NAMES I MADE TO COMPARE FOR CONCISTENCY SSIZE=1 ANG0=0 ANG1=180 CAMOUNT=32 SFILE=9 GLOBAL RADCONV RADCONV=PI/180 'PI*0.05/9 CALL RADIANS(ANG0) CALL RADIANS(ANG1) ANGD=ANG1-ANG0 ANGS=ANGD/CAMOUNT SUB RADIANS(A) A=A*RADCONV END SUB BG 1 'SET BG TO INDUVIDUAL CHARACTERS FOR I=0 TO 15 FOR J=0 TO 15 CELL J,I,J+I*16 NEXT J NEXT I 'CLEAR TEXT COPY ROM(5),$500 TO $8B00 'TOUCHSCREEN OPERATION=2 X1=0 Y1=0 'SPRITE 0,0,0,12 'SPRITE 0 SIZE 3 REM = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = REM = V E C T O R M A T R I X G R A P H I C S - B Y S P 4 C E B A R = REM = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = REM PASTE YOUR PAINTING HERE (PASTE FROM TRANSFER AFTER USING MY PAINT PROGRAM) REM REPLACE THIS DATA BLOCK VSOURCE: DATA 1,55,46,55,41,1 DATA 1,55,41,52,37,1 DATA 1,52,37,44,35,1 DATA 1,44,35,40,29,1 DATA 1,40,29,22,29,1 DATA 1,22,29,17,36,1 DATA 1,17,36,7,37,1 DATA 1,7,37,6,45,1 DATA 1,6,45,10,45,1 DATA 1,10,45,14,40,1 DATA 1,14,40,20,40,1 DATA 1,20,40,23,45,1 DATA 1,23,45,41,45,1 DATA 1,41,45,44,40,1 DATA 1,44,40,49,40,1 DATA 1,49,40,51,45,1 DATA 1,51,45,55,45,1 DATA 1,49,45,47,42,2 DATA 1,47,42,45,42,2 DATA 1,45,42,44,44,2 DATA 1,44,44,44,45,2 DATA 1,44,45,45,46,2 DATA 1,45,46,47,46,2 DATA 1,47,46,48,44,2 DATA 1,18,42,15,42,2 DATA 1,15,42,13,44,2 DATA 1,13,44,13,47,2 DATA 1,13,47,15,49,2 DATA 1,15,49,18,49,2 DATA 1,18,49,20,47,2 DATA 1,20,47,20,44,2 DATA 1,20,44,18,42,2 DATA 3,46,44,0,0,2 DATA 3,17,45,0,0,2 DATA 3,31,37,0,0,1 REM LEAVE THESE END CODES HERE DATA 0,0,0,0,0,0 DATA 0,0,0,0,0,0 REM SOURCE IMAGE IMG: DATA 0,0,0,0,0,0,0,0 DATA 0,0,0,0,0,0,0,0 DATA 0,0,0,0,1,0,0,0 DATA 0,0,0,0,0,1,0,0 DATA 1,1,1,1,1,1,1,1 DATA 1,2,2,1,1,2,2,1 DATA 0,2,2,0,0,2,2,0 DATA 0,0,0,0,0,0,0,0 VECTORI=0 VECTORIZED=0 GAMEPAD(1) PAUSE OFF DIM IMG(7,7) DIM IMG2(7,7) DIM MATRIX(1,1) REM LOAD SOURCE IMAGE RESTORE IMG 'FOR J=0 TO 7 'FOR I=0 TO 7 'READ IMG(I,J) 'NEXT I 'NEXT J CALL DECODE_NEW(1,IMG()) REM MATRIX PARAMETERS A1=0 'S=1-VECTORI*0.8 S=1 DX=63 DY=63 SDX=0 SDY=0 M00=0 M10=0 M01=0 M11=0 X_PIVOT = -30 Y_PIVOT = -40 'SPRITE 5,20,20,2 DO IF VECTORIZED THEN IF PAUSE THEN VECTORI=1-VECTORI REM ROTATION PARAMETER A1=A1+0.01 A=A1*PI REM SCALE PARAMETER S=MAX(0,S+0.1*(BUTTON(0,0)-BUTTON(0,1))) REM OFFSET PARAMETER DX=DX+4*(LEFT(0)-RIGHT(0)) DY=DY+4*(UP(0)-DOWN(0)) REM TURN THESE PARAMETERS INTO A MATRIX CALL MATRIX(S*(1-VECTORI*0.8),A,MATRIX()) IF VECTORI THEN REM VECTOR IMAGE RESTORE VSOURCE DO READ D,X1,Y1,X2,Y2,C IF D=0 AND X1=0 AND Y1=0 AND X2=0 AND Y2=0 AND C=0 THEN IF A=0 THEN A=1 REM LAYER 0 ELSE A=0 EXIT END IF END IF REM INITIALIZE RETURN VARIABLES AX=0 AY=0 BX=0 BY=0 REM FIRST OFFSETS: [CENTER IT (FOR THE PIVOT POINT)] XI= X1+X_PIVOT YI= Y1+Y_PIVOT REM THIS MATRIX TRANSFORMS THE SOURCE IMAGE COORDINATES TO THE FINAL IMAGE CALL USE_MATRIX(XI,YI,AX,AY,DX,DY,MATRIX()) REM DO IT AGAIN FOR THE OTHER COORDINATE SET XI= X2+X_PIVOT YI= Y2+Y_PIVOT CALL USE_MATRIX(XI,YI,BX,BY,DX,DY,MATRIX()) REM RECREATE THE VECTOR IMAGE IF D=0 THEN REM PLOT AX,AY CALL PLOT2(AX,AY,C) ELSE IF D=1 THEN REM LINE AX,AY TO BX,BY CALL LINE2(AX,AY,BX,BY,C) ELSE IF D=2 THEN REM BOX AX,AY TO BX,BY ELSE IF D=3 THEN REM PAINT AX,AY ELSE IF D=4 THEN REM BAR AX,AY TO BX,BY REM COLOR 1 REM BOX AX,AY TO BX,BY END IF 'NOT THE MAIN LOOP LOOP ELSE REM VECTORIZED PIXELS GRAPHICS RENDERER REM Y COORDINATE OF OUR SOURCE IMAGE FOR J=0 TO 7 REM X COORDINATE OF OUR SOURCE IMAGE FOR I=0 TO 7 REM FOUR CORNERS OF A BOX (SCALED PIXELS) FOR K=0 TO 3 REM FIRST OFFSETS: [CENTER IT (FOR THE PIVOT POINT), SET THE CORNERS OF THE BOX] XI= I-4 + 0.5*((K MOD 2)*2-1) YI= J-4 + 0.5*(INT(K/2)*2-1) REM THIS MATRIX TRANSFORMS THE SOURCE IMAGE COORDINATES TO THE FINAL IMAGE X=0 Y=0 CALL USE_MATRIX(XI,YI,X,Y,DX,DY,MATRIX()) REM SET THE COLOR TO THE COLOR OF OUR SELECTED SOURCE IMAGE PIXEL 'COLOR IMG(I,J) C= IMG(I,J) REM DRAW LINES BETWEEN THE FOUR COORDINATES TO MAKE A BOX (AND FLOOD FILL THEM) GOSUB INTERPOLATE NEXT K NEXT I NEXT J END IF ELSE REM ROTATION PARAMETER INC A1 A=A1*0.01*PI REM SCALE PARAMETER 'S=MAX(0,S+0.1*(BUTTON(0,0)-BUTTON(0,1))) REM OFFSET PARAMETER DX=DX+4*(LEFT(0)-RIGHT(0)) DY=DY+4*(UP(0)-DOWN(0)) REM TURN THESE PARAMETERS INTO A MATRIX CALL MATRIX2(S*(1-VECTORI*0.8),A,M00,M10,M01,M11) REM PURELY PIXEL BASED GRAPHICS RENDERER REM Y COORDINATE OF OUR SOURCE IMAGE FOR J=0 TO 7 REM X COORDINATE OF OUR SOURCE IMAGE FOR I=0 TO 7 REM FIRST OFFSETS: [CENTER IT (FOR THE PIVOT POINT)] XI= I-4 YI= J-4 REM THIS MATRIX TRANSFORMS THE SOURCE IMAGE COORDINATES TO THE FINAL IMAGE X=0 Y=0 CALL USE_MATRIX2(XI,YI,X,Y,SDX,SDY,M00,M10,M01,M11) 'TRACE XI,YI,INT(X),INT(Y) ADD X,4 ADD Y,4 REM SET THE COLOR TO THE COLOR OF OUR SELECTED SOURCE IMAGE PIXEL 'COLOR IMG(I,J) C= IMG(I,J) 'CALL PLOT3(X,Y,C,2) 'IMG2(MAX(MIN(X,7),0),MAX(MIN(Y,7),0))=C IF X>=0 AND Y>=0 AND X<=7 AND Y<=7 THEN IMG2(X,Y)=C NEXT I NEXT J CALL ENCODE_NEW2(1+A1,IMG2()) END IF WAIT VBL SPRITE 0,DX,DY, WAIT 10 'CLEAR DISPLAY 'COPY ROM(5),4096 TO $8000 LOOP SUB MATRIX(S,A,MATRIX()) REM DEFINE THE MATRIX REM SCALE * ROTATION MATRIX (OFFSETS ARE ADDED LATER) MATRIX(0,0)= S* COS(A) MATRIX(1,0)= S* SIN(A) MATRIX(0,1)= S* -SIN(A) MATRIX(1,1)= S* COS(A) END SUB SUB USE_MATRIX(XI,YI,X,Y,DX,DY,MATRIX()) REM MATRIX MULTIPLICATION TO TURN (XI,YI) INTO (X,Y) REM AND THE OFFSETS (DX,DY) ARE ADDED X= MATRIX(0,0)*XI + MATRIX(1,0)*YI + DX Y= MATRIX(0,1)*XI + MATRIX(1,1)*YI + DY 'TRACE DX,DY END SUB SUB MATRIX2(S,A,M00,M10,M01,M11) REM DEFINE THE MATRIX REM SCALE * ROTATION MATRIX (OFFSETS ARE ADDED LATER) M00= S* COS(A) M10= S* SIN(A) M01= S* -SIN(A) M11= S* COS(A) END SUB SUB USE_MATRIX2(XI,YI,X,Y,DX,DY,M00,M10,M01,M11) REM MATRIX MULTIPLICATION TO TURN (XI,YI) INTO (X,Y) REM AND THE OFFSETS (DX,DY) ARE ADDED X= M00*XI + M10*YI + DX Y= M01*XI + M11*YI + DY 'TRACE DX,DY END SUB 'MERGE M00 AND M10 TO ONE VALUE IN AN ATTEMPT TO SPEED UP THE CALCULATIONS 'A*B+C*D 'C*D+A*B*C*D/C*D '(1+A*B/C*D)*C*D 'A*B*C/C+C*D 'C*(A*B/C)+C*D '(A+C) (B+D) INTERPOLATE: REM INTERPOLATE BOXES (SCALED PIXELS) 'C IS ALREADY DEFINED FOR THIS SUBPROGRAM IF K=0 THEN REM (0,0) X1=X Y1=Y REM PLOT X,Y ELSE IF K=1 THEN REM (1,0) X2=X Y2=Y REM LINE BETWEEN (1,0) AND (0,0) REM LINE X,Y TO X1,Y1 CALL LINE2(X,Y,X1,Y1,C) ELSE IF K=2 THEN REM (0,1) X3=X Y3=Y REM LINE BETWEEN (0,1) AND (0,0) REM LINE X,Y TO X1,Y1 CALL LINE2(X,Y,X1,Y1,C) ELSE REM (1,1) REM LINE BETWEEN (1,1) AND (1,0) REM LINE X,Y TO X2,Y2 CALL LINE2(X,Y,X2,Y2,C) REM LINE BETWEEN (1,1) AND (0,1) REM LINE X,Y TO X3,Y3 CALL LINE2(X,Y,X3,Y3,C) REM FLOOD FILL AT THE AVERAGE PIXEL (THE CENTER OF THE BOX) REM BUG: (WHEN THE BOX IS SMALL, THE CENTER MAY ALREADY BE COVERED, WHILE OTHER PIXELS MAY NOT BE) REM PAINT 0.25*(X+X1+X2+X3),0.25*(Y+Y1+Y2+Y3) END IF RETURN SUB PLOT2(X,Y,C) CX=X\8 CY=Y\8 X1=X MOD 8 Y1=Y MOD 8 A=$8000+CY*256+CX*16+Y1 N=X1 CALL INSERTBITS(A,N,C) END SUB SUB PLOT3(X,Y,C,C0) CX=X\8+C0 CY=Y\8 X1=X MOD 8 Y1=Y MOD 8 A=$8000+CY*256+CX*16+Y1 'TRACE CY*16+CX,CY,CX-C0,X,Y N=X1 CALL INSERTBITS(A,N,C) END SUB SUB LINE2(X1,Y1,X2,Y2,C) DX=X2-X1 DY=Y2-Y1 L=SQR(DY*DY+DX*DX) T=0 STEPS=1 FX=DX/(L+0.001) FY=DY/(L+0.001) REPEAT X=FX*T+X1 Y=FY*T+Y1 X=X*-(X>0 AND X<1024) 'X>0 AND X<1024 Y=Y*-(Y>0 AND Y<1024) 'Y>0 AND Y<1024 A=$8000+(Y\8)*256+(X\8)*16+(Y MOD 8) N=7-(X MOD 8) CALL INSERTBITS(A,N,C) ADD T,STEPS UNTIL T>=L T=0 END SUB SUB INSERTBITS(A,N,C) IF C MOD 2 THEN POKE A,PEEK(A) OR 2^N IF C\2 THEN POKE A+8,PEEK(A+8) OR 2^N 'POKE A,PEEK(A) OR (2^N * C MOD 2) 'POKE A+8,PEEK(A+8) OR (2^N * C\2) END SUB SUB UNHEX(V$,V) V1=ASC(MID$(V$,1,1))-48 V2=ASC(MID$(V$,2,2))-48 V1=V1+7*(V1>9) V2=V2+7*(V2>9) V=V1*16+V2 END SUB SUB DECODE_NEW(C,IMG()) DIM DAT2(7,7) FOR I=0 TO 7 FOR J=0 TO 1 X=PEEK($8000+C*16+I+J*8) FOR K=0 TO 7 E=2^K ADD IMG(7-K,I),(X AND E)\E*(J+1) NEXT K NEXT J NEXT I END SUB SUB ENCODE_NEW(C,IMG()) FOR I=0 TO 7 V0=0 V1=0 FOR J=0 TO 7 E=2^J V=IMG(7-J,I) ADD V0,E*(V MOD 2) ADD V1,E*(V\2) NEXT J A=$8000+C*16+I POKE(A),V0 POKE(A+8),V1 NEXT I END SUB SUB ENCODE_NEW2(C,IMG()) FOR I=0 TO 7 V0=0 V1=0 FOR J=0 TO 7 JI=7-J V=IMG(JI,I) IMG(JI,I)=0 E=2^J ADD V0,E*(V MOD 2) ADD V1,E*(V\2) NEXT J A=$8000+C*16+I POKE(A),V0 POKE(A+8),V1 NEXT I END SUB SUB DISP(X0,Y0,IMG()) FOR Y=0 TO 7 FOR X=0 TO 7 NUMBER X0+X,Y0+Y,IMG(X,Y),1 NEXT X NEXT Y END SUB REM NOTES FOR MATRIX MULTIPLICATION AND THE ROTATION MATRIX REM REM [A,B] [X] [AX+BY] REM [C,D]*[Y]=[CX+DY] REM REM [1,2] [16] [1*16+2*32] [16+64 ] [80] REM [4,8]*[32]=[4*16+8*32]=[64+256]=[320] REM REM [ COS(A), SIN(A)] [X] [COS(A)*X+SIN(A)*Y] REM [-SIN(A), COS(A)]*[Y]=[-SIN(A)*X+COS(A)*Y] REM REM XO= COS(A)*X + SIN(A)*Y REM YO= COS(A)*Y - SIN(A)*X #1:MAIN PALETTES 0030151500383400003C0C00003F3C00 003F2A15003F2A15003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 0000000804FFFF660000000000006666 #5:PAINTING CHARACTERS 00000000000000000000000000000000