' 3D transformation using 3*3 matrix math. ' by Svjatoslav Agejenko 2003.03 ' use keys: ' 7 9 - change alpha ' 4 6 - change beta ' 1 3 - change gamma ' ESC - quit program DECLARE SUB gc (x!, y!, z!, x1!, y1!) DECLARE SUB setan (a!, b!, c!) DIM SHARED mx1, my1, mz1 DIM SHARED mx2, my2, mz2 DIM SHARED mx3, my3, mz3 SCREEN 7, , , 1 1 setan n1, n2, n3 FOR y = -70 TO 70 STEP 5 FOR x = -70 TO 70 STEP 5 gc x, y, SIN((ABS(x) + ABS(y)) / 30) * 30, x1, y1 PSET (x1, y1), 15 NEXT x NEXT y PCOPY 0, 1 CLS a$ = INPUT$(1) IF a$ = "7" THEN n1 = n1 + .1 IF a$ = "9" THEN n1 = n1 - .1 IF a$ = "4" THEN n2 = n2 + .1 IF a$ = "6" THEN n2 = n2 - .1 IF a$ = "1" THEN n3 = n3 + .1 IF a$ = "3" THEN n3 = n3 - .1 IF a$ = CHR$(27) THEN SYSTEM GOTO 1 SUB gc (x, y, z, x1, y1) rx = x * mx1 + y * my1 + z * mz1 ' matrix transformation ry = x * mx2 + y * my2 + z * mz2 rz = x * mx3 + y * my3 + z * mz3 rz = rz + 100 ' perspective calculation x1 = rx / rz * 120 + 160 y1 = ry / rz * 120 + 100 END SUB SUB setan (alp, bet, gam) mx1 = SIN(gam) * SIN(bet) * SIN(alp) + COS(gam) * COS(alp) my1 = COS(bet) * SIN(alp) mz1 = SIN(gam) * COS(alp) - COS(gam) * SIN(bet) * SIN(alp) mx2 = SIN(gam) * SIN(bet) * COS(alp) - COS(gam) * SIN(alp) my2 = COS(bet) * COS(alp) mz2 = -COS(gam) * SIN(bet) * COS(alp) - SIN(gam) * SIN(alp) mx3 = -SIN(gam) * COS(bet) my3 = SIN(bet) mz3 = COS(gam) * COS(bet) END SUB