-' 3D transformation using 3*3 matrix math.\r
-' by Svjatoslav Agejenko 2003.03\r
+' Program to demonstrate 3x3 matrix math for coordinate rotation in 3D space.\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2003.03, Initial version\r
+' 2024.08, Improved program readability using AI\r
+\r
\r
' use keys:\r
' 7 9 - change alpha\r
' 1 3 - change gamma\r
' ESC - quit program\r
\r
-DECLARE SUB gc (x!, y!, z!, x1!, y1!)\r
-DECLARE SUB setan (a!, b!, c!)\r
-DIM SHARED mx1, my1, mz1\r
-DIM SHARED mx2, my2, mz2\r
-DIM SHARED mx3, my3, mz3\r
+DECLARE SUB graphicalCoordinates (xVal!, yVal!, zVal!, x1Val!, y1Val!)\r
+DECLARE SUB setAngles (alphaVal!, betaVal!, gammaVal!)\r
+DIM SHARED matrixX1, matrixY1, matrixZ1\r
+DIM SHARED matrixX2, matrixY2, matrixZ2\r
+DIM SHARED matrixX3, matrixY3, matrixZ3\r
\r
SCREEN 7, , , 1\r
\r
+' Main loop starts here\r
1\r
-setan n1, n2, n3\r
+CALL setAngles(angleAlpha, angleBeta, angleGamma)\r
\r
FOR y = -70 TO 70 STEP 5\r
FOR x = -70 TO 70 STEP 5\r
- gc x, y, SIN((ABS(x) + ABS(y)) / 30) * 30, x1, y1\r
- PSET (x1, y1), 15\r
+ CALL graphicalCoordinates(x, y, SIN((ABS(x) + ABS(y)) / 30) * 30, x1Val, y1Val)\r
+ PSET (x1Val, y1Val), 15\r
NEXT x\r
NEXT y\r
PCOPY 0, 1\r
CLS\r
-a$ = INPUT$(1)\r
-IF a$ = "7" THEN n1 = n1 + .1\r
-IF a$ = "9" THEN n1 = n1 - .1\r
-IF a$ = "4" THEN n2 = n2 + .1\r
-IF a$ = "6" THEN n2 = n2 - .1\r
-IF a$ = "1" THEN n3 = n3 + .1\r
-IF a$ = "3" THEN n3 = n3 - .1\r
-IF a$ = CHR$(27) THEN SYSTEM\r
+inputChar$ = INPUT$(1)\r
+IF inputChar$ = "7" THEN angleAlpha = angleAlpha + .1\r
+IF inputChar$ = "9" THEN angleAlpha = angleAlpha - .1\r
+IF inputChar$ = "4" THEN angleBeta = angleBeta + .1\r
+IF inputChar$ = "6" THEN angleBeta = angleBeta - .1\r
+IF inputChar$ = "1" THEN angleGamma = angleGamma + .1\r
+IF inputChar$ = "3" THEN angleGamma = angleGamma - .1\r
+IF inputChar$ = CHR$(27) THEN SYSTEM\r
GOTO 1\r
\r
-SUB gc (x, y, z, x1, y1)\r
-\r
-rx = x * mx1 + y * my1 + z * mz1 ' matrix transformation\r
-ry = x * mx2 + y * my2 + z * mz2\r
-rz = x * mx3 + y * my3 + z * mz3\r
-\r
-rz = rz + 100 ' perspective calculation\r
-x1 = rx / rz * 120 + 160\r
-y1 = ry / rz * 120 + 100\r
+SUB graphicalCoordinates (xVal, yVal, zVal, x1Val, y1Val)\r
+ ' matrix transformation\r
+ rxVal = xVal * matrixX1 + yVal * matrixY1 + zVal * matrixZ1\r
+ ryVal = xVal * matrixX2 + yVal * matrixY2 + zVal * matrixZ2\r
+ rzVal = xVal * matrixX3 + yVal * matrixY3 + zVal * matrixZ3\r
\r
+ ' perspective calculation\r
+ rzVal = rzVal + 100\r
+ x1Val = rxVal / rzVal * 120 + 160\r
+ y1Val = ryVal / rzVal * 120 + 100\r
END SUB\r
\r
-SUB setan (alp, bet, gam)\r
-mx1 = SIN(gam) * SIN(bet) * SIN(alp) + COS(gam) * COS(alp)\r
-my1 = COS(bet) * SIN(alp)\r
-mz1 = SIN(gam) * COS(alp) - COS(gam) * SIN(bet) * SIN(alp)\r
+SUB setAngles (alphaVal, betaVal, gammaVal)\r
+ ' Calculate rotation matrix elements for alpha, beta, and gamma angles\r
+ matrixX1 = SIN(gammaVal) * SIN(betaVal) * SIN(alphaVal) + COS(gammaVal) * COS(alphaVal)\r
+ matrixY1 = COS(betaVal) * SIN(alphaVal)\r
+ matrixZ1 = SIN(gammaVal) * COS(alphaVal) - COS(gammaVal) * SIN(betaVal) * SIN(alphaVal)\r
\r
-mx2 = SIN(gam) * SIN(bet) * COS(alp) - COS(gam) * SIN(alp)\r
-my2 = COS(bet) * COS(alp)\r
-mz2 = -COS(gam) * SIN(bet) * COS(alp) - SIN(gam) * SIN(alp)\r
-\r
-mx3 = -SIN(gam) * COS(bet)\r
-my3 = SIN(bet)\r
-mz3 = COS(gam) * COS(bet)\r
-END SUB\r
+ matrixX2 = SIN(gammaVal) * SIN(betaVal) * COS(alphaVal) - COS(gammaVal) * SIN(alphaVal)\r
+ matrixY2 = COS(betaVal) * COS(alphaVal)\r
+ matrixZ2 = -COS(gammaVal) * SIN(betaVal) * COS(alphaVal) - SIN(gammaVal) * SIN(alphaVal)\r
\r
+ matrixX3 = -SIN(gammaVal) * COS(betaVal)\r
+ matrixY3 = SIN(betaVal)\r
+ matrixZ3 = COS(gammaVal) * COS(betaVal)\r
+END SUB
\ No newline at end of file
-' 3D rotation\r
-' made by Svjatoslav Agejenko\r
-' in 2003.12\r
-' H-Page: svjatoslav.eu\r
-' E-Mail: svjatoslav@svjatoslav.eu\r
- \r
-DIM SHARED px(1000) ' point x & y location\r
-DIM SHARED py(1000)\r
-DIM SHARED ox(1000) ' point old x & y location\r
-DIM SHARED oy(1000)\r
+' Program to render rotating pixels\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2003.12, Initial version\r
+' 2024.08, Improved program readability using AI\r
\r
\r
+DIM SHARED pointX(1000) ' Point x & y location\r
+DIM SHARED pointY(1000)\r
+DIM SHARED oldPointX(1000) ' Old point x & y location\r
+DIM SHARED oldPointY(1000)\r
+\r
SCREEN 13\r
\r
-np = 0 'Set points to them place\r
-FOR x = -10 TO 10\r
-FOR y = -10 TO 10\r
-np = np + 1\r
-px(np) = x\r
-py(np) = y\r
-NEXT y\r
-NEXT x\r
-\r
- 'Rotate points now\r
-nrk = 0 'start angle\r
+numPoints = 0 ' Set points to their place\r
+FOR pointXVal = -10 TO 10\r
+ FOR pointYVal = -10 TO 10\r
+ numPoints = numPoints + 1\r
+ pointX(numPoints) = pointXVal\r
+ pointY(numPoints) = pointYVal\r
+ NEXT pointYVal\r
+NEXT pointXVal\r
+\r
+' Rotate points now\r
+rotationAngle = 0 ' Start angle\r
1\r
-nrk = nrk + .01\r
-s1 = SIN(nrk)\r
-c1 = COS(nrk)\r
-\r
-\r
-FOR a = 1 TO 399\r
-PSET (ox(a), oy(a)), 0\r
-\r
-x = px(a)\r
-y = py(a)\r
-\r
-x1 = x * s1 + y * c1\r
-y1 = x * c1 - y * s1\r
-x1 = x1 * 7 + 160\r
-y1 = y1 * 7 + 100\r
-\r
+ rotationAngle = rotationAngle + 0.01\r
+ sineOfAngle = SIN(rotationAngle)\r
+ cosineOfAngle = COS(rotationAngle)\r
\r
-ox(a) = x1\r
-oy(a) = y1\r
-PSET (x1, y1), 15\r
+ FOR a = 1 TO numPoints\r
+ PSET (oldPointX(a), oldPointY(a)), 0\r
\r
-NEXT a\r
+ x = pointX(a)\r
+ y = pointY(a)\r
\r
-IF INKEY$ = "" THEN GOTO 1\r
- \r
+ newX = x * sineOfAngle + y * cosineOfAngle\r
+ newY = x * cosineOfAngle - y * sineOfAngle\r
+ newX = newX * 7 + 160\r
+ newY = newY * 7 + 100\r
\r
-SYSTEM\r
+ oldPointX(a) = newX\r
+ oldPointY(a) = newY\r
+ PSET (newX, newY), 15\r
+ NEXT a\r
\r
+IF INKEY$ = "" THEN GOTO 1
\ No newline at end of file
-' Svjatoslav Agejenko\r
-' year: 2002\r
+' Program to render animation inspired by movie.\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2002, Initial version\r
+' 2024.08, Improved program readability using AI\r
+\r
DEFINT A-Z\r
-DECLARE SUB putm ()\r
-DIM SHARED tmr AS DOUBLE\r
-DIM SHARED arv(1 TO 20)\r
-DIM SHARED lng\r
-DIM SHARED msg$\r
+DECLARE SUB PutMatrix ()\r
+DIM SHARED array(1 TO 20)\r
+DIM SHARED length\r
+DIM SHARED message$\r
RANDOMIZE 2\r
\r
CLS\r
COLOR 10, 0\r
-msg$ = ""\r
-e = 0\r
-g = 0\r
-putm\r
-1\r
-f = 0\r
-IF g >= 3 THEN f = 10000: g = 0\r
-SOUND f, .2\r
-e = e + 1\r
-g = g + 1\r
-IF e > 100 THEN putm: e = 0\r
+message$ = ""\r
+counter = 0\r
+iteration = 0\r
+PutMatrix\r
+\r
+1 : ' Label for looping\r
+frequency = 0\r
+IF iteration >= 3 THEN frequency = 10000: iteration = 0\r
+SOUND frequency, .2\r
+counter = counter + 1\r
+iteration = iteration + 1\r
+IF counter > 100 THEN PutMatrix: counter = 0\r
\r
-b$ = ""\r
-c = 1\r
-FOR a = 1 TO 80\r
-c = c + 1\r
-d$ = CHR$(RND * 9 + 48)\r
-IF c > lng THEN c = 1: d$ = " "\r
-b$ = b$ + d$\r
-NEXT a\r
+displayLine$ = ""\r
+lineCounter = 1\r
+FOR column = 1 TO 80\r
+ lineCounter = lineCounter + 1\r
+ char$ = CHR$(INT(RND * 9) + 48)\r
+ IF lineCounter > length THEN lineCounter = 1: char$ = " "\r
+ displayLine$ = displayLine$ + char$\r
+NEXT column\r
LOCATE 25, 1\r
-PRINT b$\r
+PRINT displayLine$\r
IF INKEY$ <> "" THEN COLOR 7, 0: CLS : SYSTEM\r
GOTO 1\r
\r
-SUB putm\r
-VIEW PRINT 1 TO 25\r
-SELECT CASE lng\r
-CASE 13\r
-msg$ = "Are you sure the line is clear ?"\r
-CASE 6\r
-msg$ = " Then I'll go ..."\r
-END SELECT\r
+SUB PutMatrix\r
+ VIEW PRINT 1 TO 25\r
+ SELECT CASE length\r
+ CASE 13\r
+ message$ = "Are you sure the line is clear?"\r
+ CASE 6\r
+ message$ = " Then I'll go ..."\r
+ END SELECT\r
\r
-LOCATE 1, 30\r
-PRINT " "\r
-LOCATE 1, 30\r
-PRINT msg$\r
-c = RND * 9 + 1\r
-FOR b = 1 TO 3\r
-FOR a = c TO 10\r
-IF arv(a) = -1 THEN arv(a) = RND * 8 + 1: lng = lng - 1: GOTO 2\r
-NEXT a\r
-c = 1\r
-NEXT b\r
-lng = 13\r
-FOR a = 1 TO 20\r
-arv(a) = -1\r
-NEXT a\r
-CLS\r
-IF msg$ <> "" THEN SYSTEM\r
-2\r
-FOR a = 1 TO 20\r
-LOCATE 1, a\r
-IF arv(a) = -1 THEN b$ = " " ELSE b$ = STR$(arv(a))\r
-b$ = RIGHT$(b$, 1)\r
-PRINT b$\r
-NEXT a\r
-VIEW PRINT 2 TO 25\r
+ LOCATE 1, 30\r
+ PRINT " ";\r
+ LOCATE 1, 30\r
+ PRINT message$\r
+\r
+ randomValue = INT(RND * 9) + 1\r
+ FOR pass = 1 TO 3\r
+ FOR value = randomValue TO 10\r
+ IF array(value) = -1 THEN\r
+ array(value) = INT(RND * 8) + 1\r
+ length = length - 1\r
+ GOTO 2\r
+ END IF\r
+ NEXT value\r
+ randomValue = 1\r
+ NEXT pass\r
+\r
+ length = 13\r
+ FOR index = 1 TO 20\r
+ array(index) = -1\r
+ NEXT index\r
+\r
+ CLS\r
+ IF message$ <> "" THEN SYSTEM\r
+\r
+2 : ' Label for continuing after GOTO\r
+ FOR index = 1 TO 20\r
+ LOCATE 1, index\r
+ IF array(index) = -1 THEN displayChar$ = " " ELSE displayChar$ = STR$(array(index))\r
+ displayChar$ = RIGHT$(displayChar$, 1)\r
+ PRINT displayChar$\r
+ NEXT index\r
+\r
+ VIEW PRINT 2 TO 25\r
END SUB\r
\r