-' Svjatoslav Agejenko 2000\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2000, Initial version\r
+' 2024.08, Improved program readability using AI\r
\r
\r
-DECLARE SUB lu (x%, y%, l%, c2%)\r
+DECLARE SUB DrawLine (x%, y%, l%, clr%)\r
+\r
DEFINT A-Z\r
SCREEN 12\r
\r
+' Set up the palette\r
FOR a = 0 TO 16\r
-OUT &H3C8, a\r
-OUT &H3C9, a * 4\r
-OUT &H3C9, a * 4\r
-OUT &H3C9, a * 4\r
+ OUT &H3C8, a\r
+ OUT &H3C9, a * 4\r
+ OUT &H3C9, a * 4\r
+ OUT &H3C9, a * 4\r
NEXT\r
\r
+' Draw the pattern\r
FOR x = 0 TO 200\r
-y = SQR((200 - x) * x) / 2\r
-lu x + 200, y + 200, y * 2, t\r
-LINE (x + 200, y + 202)-(x + 200, y + 250), t\r
-IF x < 195 THEN\r
-LINE (300 + ((x - 100) / 2), y / 2 + 328)-(x + 200, y + 252), t\r
-END IF\r
-LINE (300 + ((x - 100) / 2), y / 2 + 330)-(300 + ((x - 100) / 2), y / 2 + 370), t\r
+ y = SQR((200 - x) * x) / 2\r
+ DrawLine x + 200, y + 200, y * 2, t\r
+ LINE (x + 200, y + 202)-(x + 200, y + 250), t\r
+ IF x < 195 THEN\r
+ LINE (300 + ((x - 100) / 2), y / 2 + 328)-(x + 200, y + 252), t\r
+ END IF\r
+ LINE (300 + ((x - 100) / 2), y / 2 + 330)-(300 + ((x - 100) / 2), y / 2 + 370), t\r
NEXT x\r
\r
-SUB lu (x, y, l, c2)\r
-\r
-c = 650 - y - x\r
-1\r
-IF c > 30 THEN c = c - 30: GOTO 1\r
-c2 = c\r
-IF c2 > 15 THEN c2 = 30 - c2\r
-\r
-FOR y1 = y TO y - l STEP -1\r
-c1 = c\r
-IF c1 > 15 THEN c1 = 30 - c1\r
-PSET (x, y1), c1\r
-c = c + 1\r
-IF c > 30 THEN c = c - 30\r
-NEXT y1\r
+SUB DrawLine (x, y, l, clr)\r
+ ' Calculate the initial color value\r
+ c = 650 - y - x\r
+\r
+ ' Adjust color to be within a specific range\r
+1 IF c > 30 THEN\r
+ c = c - 30\r
+ GOTO 1\r
+ END IF\r
+\r
+ clr = c\r
+ IF clr > 15 THEN\r
+ clr = 30 - clr\r
+ END IF\r
+\r
+ ' Draw a vertical line with varying colors\r
+ FOR y1 = y TO y - l STEP -1\r
+ c1 = c\r
+ IF c1 > 15 THEN\r
+ c1 = 30 - c1\r
+ END IF\r
+\r
+ PSET (x, y1), c1\r
+\r
+ ' Increment the color and wrap around if necessary\r
+ c = c + 1\r
+ IF c > 30 THEN\r
+ c = c - 30\r
+ END IF\r
+ NEXT y1\r
END SUB\r
\r
' Texture mapping\r
-' by Svjatoslav Agejenko\r
-' 04.2003\r
-\r
-DECLARE SUB demo3 ()\r
-DECLARE SUB demo2 ()\r
-DECLARE SUB demo1 ()\r
-DECLARE SUB hline (x1!, y!, x2!, tx1!, ty1!, tx2!, ty2!)\r
-DECLARE SUB polygon (x1!, y1!, x2!, y2!, x3!, y3!, tx1!, ty1!, tx2!, ty2!, tx3!, ty3!)\r
-DECLARE SUB pline (x1!, y1!, x2!, y2!, tx1!, ty1!, tx2!, ty2!)\r
-DECLARE SUB start ()\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2003.04, Initial version\r
+' 2024.08, Improved program readability using AI\r
+\r
+DECLARE SUB Demo3()\r
+DECLARE SUB Demo2()\r
+DECLARE SUB Demo1()\r
+DECLARE SUB HLine(x1!, y!, x2!, tx1!, ty1!, tx2!, ty2!)\r
+DECLARE SUB Polygon(x1!, y1!, x2!, y2!, x3!, y3!, tx1!, ty1!, tx2!, ty2!, tx3!, ty3!)\r
+DECLARE SUB PLine(x1!, y1!, x2!, y2!, tx1!, ty1!, tx2!, ty2!)\r
+DECLARE SUB Start()\r
DIM SHARED img(0 TO 100, 0 TO 100)\r
\r
DIM SHARED bufx(0 TO 199)\r
DIM SHARED buftx(0 TO 199)\r
DIM SHARED bufty(0 TO 199)\r
\r
-start\r
-demo1\r
-demo2\r
-demo3\r
+Start\r
+Demo1\r
+Demo2\r
+Demo3\r
SYSTEM\r
\r
-SUB demo1\r
-polygon 10, 10, 300, 80, 100, 180, 1, 1, 99, 1, 30, 99\r
-\r
-a$ = INPUT$(1)\r
-3\r
-x1 = RND * 300 + 10\r
-x2 = RND * 300 + 10\r
-x3 = RND * 300 + 10\r
-y1 = RND * 180 + 10\r
-y2 = RND * 180 + 10\r
-y3 = RND * 180 + 10\r
-polygon x1, y1, x2, y2, x3, y3, 1, 1, 99, 1, 30, 99\r
-IF INKEY$ = "" THEN GOTO 3\r
-CLS\r
+SUB Demo1\r
+ ' Draw a polygon with predefined vertices and texture coordinates\r
+ Polygon 10, 10, 300, 80, 100, 180, 1, 1, 99, 1, 30, 99\r
+\r
+ ' Wait for user input\r
+ a$ = INPUT$(1)\r
+\r
+ ' Label to repeat the polygon drawing\r
+3:\r
+ x1 = RND * 300 + 10\r
+ x2 = RND * 300 + 10\r
+ x3 = RND * 300 + 10\r
+ y1 = RND * 180 + 10\r
+ y2 = RND * 180 + 10\r
+ y3 = RND * 180 + 10\r
+\r
+ ' Draw a polygon with random vertices and predefined texture coordinates\r
+ Polygon x1, y1, x2, y2, x3, y3, 1, 1, 99, 1, 30, 99\r
+\r
+ ' Repeat the process until a key is pressed\r
+ IF INKEY$ = "" THEN GOTO 3\r
+\r
+ CLS\r
END SUB\r
\r
-SUB demo2\r
-\r
-n = 0\r
-4\r
-x1 = SIN(n) * 80 + 160\r
-y1 = COS(n) * 80 + 100\r
-x2 = SIN(n + 2) * 80 + 160\r
-y2 = COS(n + 2) * 80 + 100\r
-x3 = SIN(n + 4) * 90 + 160\r
-y3 = COS(n + 4) * 90 + 100\r
-polygon x1, y1, x2, y2, x3, y3, 1, 1, 99, 1, 30, 99\r
-n = n + .1\r
-IF INKEY$ = "" THEN GOTO 4\r
-CLS\r
+SUB Demo2\r
+ n = 0\r
+\r
+ ' Label to repeat the polygon drawing\r
+4:\r
+ x1 = SIN(n) * 80 + 160\r
+ y1 = COS(n) * 80 + 100\r
+ x2 = SIN(n + 2) * 80 + 160\r
+ y2 = COS(n + 2) * 80 + 100\r
+ x3 = SIN(n + 4) * 90 + 160\r
+ y3 = COS(n + 4) * 90 + 100\r
+\r
+ ' Draw a polygon with calculated vertices and predefined texture coordinates\r
+ Polygon x1, y1, x2, y2, x3, y3, 1, 1, 99, 1, 30, 99\r
+\r
+ n = n + .1\r
+\r
+ ' Repeat the process until a key is pressed\r
+ IF INKEY$ = "" THEN GOTO 4\r
+\r
+ CLS\r
END SUB\r
\r
-SUB demo3\r
-\r
-n = 0\r
-5\r
-x1 = SIN(n) * 40 + 50\r
-y1 = COS(n) * 40 + 50\r
-x2 = SIN(n + 2) * 40 + 50\r
-y2 = COS(n + 2) * 40 + 50\r
-x3 = SIN(n + 4) * 40 + 50\r
-y3 = COS(n + 4) * 40 + 50\r
-polygon 1, 50, 300, 1, 100, 180, x1, y1, x2, y2, x3, y3\r
-n = n + .1\r
-IF INKEY$ = "" THEN GOTO 5\r
-CLS\r
+SUB Demo3\r
+ n = 0\r
+\r
+ ' Label to repeat the polygon drawing\r
+5:\r
+ x1 = SIN(n) * 40 + 50\r
+ y1 = COS(n) * 40 + 50\r
+ x2 = SIN(n + 2) * 40 + 50\r
+ y2 = COS(n + 2) * 40 + 50\r
+ x3 = SIN(n + 4) * 40 + 50\r
+ y3 = COS(n + 4) * 40 + 50\r
+\r
+ ' Draw a polygon with calculated vertices and predefined texture coordinates\r
+ Polygon 1, 50, 300, 1, 100, 180, x1, y1, x2, y2, x3, y3\r
+\r
+ n = n + .1\r
+\r
+ ' Repeat the process until a key is pressed\r
+ IF INKEY$ = "" THEN GOTO 5\r
+\r
+ CLS\r
\r
END SUB\r
\r
-SUB hline (x1, y, x2, tx1, ty1, tx2, ty2)\r
-\r
-IF INT(x2) = INT(x1) THEN GOTO 2\r
-IF x2 > x1 THEN\r
- nx1 = INT(x1)\r
- nx2 = INT(x2)\r
- ntx1 = tx1\r
- nty1 = ty1\r
- ntx2 = tx2\r
- nty2 = ty2\r
-ELSE\r
- nx1 = INT(x2)\r
- nx2 = INT(x1)\r
- ntx1 = tx2\r
- nty1 = ty2\r
- ntx2 = tx1\r
- nty2 = ty1\r
-END IF\r
-\r
-v = nx2 - nx1\r
-tvx = ntx2 - ntx1\r
-tvy = nty2 - nty1\r
-\r
-FOR a = 0 TO v\r
- rtx = tvx * a / v + ntx1\r
- rty = tvy * a / v + nty1\r
- PSET (a + nx1, y), img(rtx, rty)\r
-NEXT a\r
-\r
-2\r
+SUB HLine(x1, y, x2, tx1, ty1, tx2, ty2)\r
+\r
+ ' Exit if the horizontal line has zero length\r
+ IF INT(x2) = INT(x1) THEN GOTO 2\r
+\r
+ ' Determine the direction and initialize variables\r
+ IF x2 > x1 THEN\r
+ nx1 = INT(x1)\r
+ nx2 = INT(x2)\r
+ ntx1 = tx1\r
+ nty1 = ty1\r
+ ntx2 = tx2\r
+ nty2 = ty2\r
+ ELSE\r
+ nx1 = INT(x2)\r
+ nx2 = INT(x1)\r
+ ntx1 = tx2\r
+ nty1 = ty2\r
+ ntx2 = tx1\r
+ nty2 = ty1\r
+ END IF\r
+\r
+ ' Calculate the line parameters\r
+ v = nx2 - nx1\r
+ tvx = ntx2 - ntx1\r
+ tvy = nty2 - nty1\r
+\r
+ FOR a = 0 TO v\r
+ rtx = tvx * a / v + ntx1\r
+ rty = tvy * a / v + nty1\r
+\r
+ ' Set the pixel color using texture coordinates\r
+ PSET (a + nx1, y), img(rtx, rty)\r
+ NEXT a\r
+\r
+2:\r
END SUB\r
\r
-SUB pline (x1, y1, x2, y2, tx1, ty1, tx2, ty2)\r
-m = ABS(y2 - y1)\r
-IF m = 0 THEN GOTO 1\r
-\r
-vy = y2 - y1\r
-vx = x2 - x1\r
-\r
-tvy = ty2 - ty1\r
-tvx = tx2 - tx1\r
-\r
-FOR a = 0 TO m\r
- rx = vx * a / m + x1\r
- ry = vy * a / m + y1\r
- trx = tvx * a / m + tx1\r
- try = tvy * a / m + ty1\r
-' PSET (rx, ry), 14\r
- IF bufx(ry) = -1 THEN\r
- bufx(ry) = rx\r
- buftx(ry) = trx\r
- bufty(ry) = try\r
- ELSE\r
- hline bufx(ry), ry, rx, buftx(ry), bufty(ry), trx, try\r
- END IF\r
-NEXT a\r
-\r
-1\r
+SUB PLine(x1, y1, x2, y2, tx1, ty1, tx2, ty2)\r
+\r
+ ' Calculate the number of vertical steps\r
+ m = ABS(y2 - y1)\r
+\r
+ IF m = 0 THEN GOTO 1\r
+\r
+ vy = y2 - y1\r
+ vx = x2 - x1\r
+\r
+ tvy = ty2 - ty1\r
+ tvx = tx2 - tx1\r
+\r
+ FOR a = 0 TO m\r
+ rx = vx * a / m + x1\r
+ ry = vy * a / m + y1\r
+ trx = tvx * a / m + tx1\r
+ try = tvy * a / m + ty1\r
+\r
+ ' Check if the buffer is empty for this row\r
+ IF bufx(ry) = -1 THEN\r
+ bufx(ry) = rx\r
+ buftx(ry) = trx\r
+ bufty(ry) = try\r
+ ELSE\r
+ HLine bufx(ry), ry, rx, buftx(ry), bufty(ry), trx, try\r
+ END IF\r
+ NEXT a\r
+\r
+1:\r
END SUB\r
\r
-SUB polygon (x1, y1, x2, y2, x3, y3, tx1, ty1, tx2, ty2, tx3, ty3)\r
+SUB Polygon(x1, y1, x2, y2, x3, y3, tx1, ty1, tx2, ty2, tx3, ty3)\r
\r
-FOR a = 0 TO 199\r
- bufx(a) = -1\r
-NEXT a\r
+ ' Initialize the buffer\r
+ FOR a = 0 TO 199\r
+ bufx(a) = -1\r
+ NEXT a\r
\r
-pline x1, y1, x2, y2, tx1, ty1, tx2, ty2\r
-pline x1, y1, x3, y3, tx1, ty1, tx3, ty3\r
-pline x3, y3, x2, y2, tx3, ty3, tx2, ty2\r
+ ' Draw three lines connecting the vertices of the polygon\r
+ PLine x1, y1, x2, y2, tx1, ty1, tx2, ty2\r
+ PLine x1, y1, x3, y3, tx1, ty1, tx3, ty3\r
+ PLine x3, y3, x2, y2, tx3, ty3, tx2, ty2\r
\r
END SUB\r
\r
-SUB start\r
+SUB Start\r
\r
-SCREEN 13\r
+ ' Set the screen mode to 320x200 with 256 colors\r
+ SCREEN 13\r
\r
-FOR a = 1 TO 100\r
- x = RND * 150\r
- y = RND * 150\r
- c = RND * 255\r
- CIRCLE (x, y), RND * 20 + 3, c\r
- PAINT (x, y), c\r
-NEXT a\r
+ ' Draw random circles on the screen\r
+ FOR a = 1 TO 100\r
+ x = RND * 150\r
+ y = RND * 150\r
+ c = RND * 255\r
+ CIRCLE (x, y), RND * 20 + 3, c\r
+ PAINT (x, y), c\r
+ NEXT a\r
\r
-LOCATE 8, 8\r
-PRINT "Test!"\r
-a$ = INPUT$(1)\r
+ ' Display "Test!" on the screen\r
+ LOCATE 8, 8\r
+ PRINT "Test!"\r
\r
-FOR y = 0 TO 100\r
- FOR x = 0 TO 100\r
- img(x, y) = POINT(x + 20, y + 20)\r
- PSET (x + 20, y + 20), 0\r
- NEXT x\r
-NEXT y\r
-CLS\r
+ ' Wait for user input\r
+ a$ = INPUT$(1)\r
\r
-END SUB\r
+ ' Copy the screen content to the image array and clear the screen\r
+ FOR y = 0 TO 100\r
+ FOR x = 0 TO 100\r
+ img(x, y) = POINT(x + 20, y + 20)\r
+ PSET (x + 20, y + 20), 0\r
+ NEXT x\r
+ NEXT y\r
+\r
+ CLS\r
\r
+END SUB\r
' Render tree that starts with single root and then branches out.\r
-' made by Svjatoslav Agejenko\r
-' in 2001\r
-' H-Page: svjatoslav.eu\r
-' E-Mail: svjatoslav@svjatoslav.eu\r
- \r
-DECLARE SUB start ()\r
-DECLARE SUB show (d%)\r
-DECLARE SUB setpal ()\r
-DECLARE SUB showpal ()\r
-DEFINT A-Y\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2001, Initial version\r
+' 2024.08, Improved program readability using AI\r
\r
\r
+DECLARE SUB start()\r
+DECLARE SUB show(d%)\r
+DECLARE SUB setpal()\r
+DECLARE SUB showpal()\r
+DEFINT A - Y\r
+\r
DIM SHARED x(1 TO 500)\r
DIM SHARED y(1 TO 500)\r
DIM SHARED s(1 TO 500)\r
\r
DIM SHARED x4(1 TO 500)\r
DIM SHARED y4(1 TO 500)\r
- \r
+\r
DIM SHARED z(1 TO 500)\r
DIM SHARED mitu\r
\r
y(1) = 340\r
s(1) = 70 * 100\r
z(1) = 1\r
- \r
+\r
+' Main loop to render the tree branches\r
FOR tr = 1 TO 6\r
-FOR b = 1 TO 50\r
-FOR a = 1 TO mitu\r
-show a\r
-NEXT a\r
-NEXT b\r
-\r
-FOR a = 1 TO mitu\r
-x(mitu + a) = x(a)\r
-y(mitu + a) = y(a)\r
-s(mitu + a) = s(a)\r
-z(mitu + a) = z(a)\r
-x4(mitu + a) = RND * 4 - 2\r
-y4(mitu + a) = RND * 4 - 2\r
-NEXT a\r
-mitu = mitu * 2\r
+ FOR b = 1 TO 50\r
+ FOR a = 1 TO mitu\r
+ show a\r
+ NEXT a\r
+ NEXT b\r
+\r
+ ' Duplicate existing branches and add randomness\r
+ FOR a = 1 TO mitu\r
+ x(mitu + a) = x(a)\r
+ y(mitu + a) = y(a)\r
+ s(mitu + a) = s(a)\r
+ z(mitu + a) = z(a)\r
+ x4(mitu + a) = RND * 4 - 2\r
+ y4(mitu + a) = RND * 4 - 2\r
+ NEXT a\r
+ mitu = mitu * 2\r
\r
NEXT tr\r
+\r
+' Wait for user input before exiting\r
a$ = INPUT$(1)\r
SYSTEM\r
\r
SUB setpal\r
-FOR a = 0 TO 16\r
-' OUT &H3C7, a\r
- OUT &H3C8, a\r
- OUT &H3C9, a * 4\r
- OUT &H3C9, a * 4\r
- OUT &H3C9, a * 4\r
-NEXT\r
+ ' Set the palette colors\r
+ FOR a = 0 TO 16\r
+ OUT &H3C8, a\r
+ OUT &H3C9, a * 4\r
+ OUT &H3C9, a * 4\r
+ OUT &H3C9, a * 4\r
+ NEXT\r
END SUB\r
\r
-SUB show (d)\r
- \r
-x1 = x(d)\r
-y1 = y(d)\r
-s1 = s(d)\r
-z1 = z(d)\r
+SUB show(d)\r
+ ' Retrieve current branch properties\r
+ x1 = x(d)\r
+ y1 = y(d)\r
+ s1 = s(d)\r
+ z1 = z(d)\r
+\r
+ ' Calculate color based on angle\r
+ c = SIN(z1) * 7 + 9\r
\r
+ ' Draw and fill the circle representing the branch\r
+ CIRCLE (x1, y1), s1 / 100, c\r
+ PAINT (x1, y1), c\r
\r
-c = SIN(z1) * 7 + 9\r
-CIRCLE (x1, y1), s1 / 100, c\r
-PAINT (x1, y1), c\r
-x(d) = x(d) + (SIN(z1) * 1000) / (s1 + 15)\r
-y(d) = y(d) + (COS(z1) * 1000) / (s1 + 15)\r
+ ' Update position based on current angle and size\r
+ x(d) = x(d) + (SIN(z1) * 1000) / (s1 + 15)\r
+ y(d) = y(d) + (COS(z1) * 1000) / (s1 + 15)\r
\r
-s(d) = s(d) / 1.01\r
-IF x4(d) >= 0 THEN z(d) = z(d) + .1 ELSE z(d) = z(d) - .1\r
-x(d) = x(d) + x4(d)\r
-y(d) = y(d) + y4(d)\r
+ ' Decay the size slightly\r
+ s(d) = s(d) / 1.01\r
+\r
+ ' Update angle based on direction\r
+ IF x4(d) >= 0 THEN z(d) = z(d) + .1 ELSE z(d) = z(d) - .1\r
+\r
+ ' Move branch in its random direction\r
+ x(d) = x(d) + x4(d)\r
+ y(d) = y(d) + y4(d)\r
END SUB\r
\r
SUB showpal\r
-FOR a = 1 TO 16\r
-LINE (a * 10, 1)-(a * 10 + 10, 100), a, BF\r
-NEXT a\r
+ ' Display the color palette at the top of the screen\r
+ FOR a = 1 TO 16\r
+ LINE (a * 10, 1) - (a * 10 + 10, 100), a, BF\r
+ NEXT a\r
END SUB\r
\r
SUB start\r
-\r
-SCREEN 12\r
-setpal\r
-REM showpal\r
-RANDOMIZE TIMER\r
+ ' Initialize graphics mode and set palette\r
+ SCREEN 12\r
+ setpal\r
+ REM showpal\r
+ RANDOMIZE TIMER\r
END SUB\r
-\r
' Program simulates interference between two slightly different frequencies\r
-\r
-DECLARE SUB getfreq ()\r
-DECLARE SUB start ()\r
-DECLARE FUNCTION gety! (t!)\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' ?, Initial version\r
+' 2024.08, Improved program readability using AI\r
+\r
+DECLARE SUB GetFrequency ()\r
+DECLARE SUB Start ()\r
+DECLARE FUNCTION GetY! (t!)\r
DIM SHARED freq(1 TO 100)\r
DIM SHARED phase(1 TO 100)\r
\r
-start\r
+Start\r
1\r
-frm = frm + 1\r
+frame = frame + 1\r
PSET (0, 0)\r
FOR x = 0 TO 639\r
- \r
- oy1 = y1\r
- oy2 = y2\r
- oy3 = y3\r
\r
- y1 = gety(frm + x / 4) * 20 + 150\r
- y2 = gety(frm + x / 4 + (x / 50)) * 20 + 150\r
- y3 = y1 + y2\r
+ oldY1 = y1\r
+ oldY2 = y2\r
+ oldY3 = y3\r
+\r
+ y1 = GetY(frame + x / 4) * 20 + 150\r
+ y2 = GetY(frame + x / 4 + (x / 50)) * 20 + 150\r
+ y3 = y1 + y2\r
\r
- ' LINE (x + 1, 0)-(x + 1, 479), 12\r
- LINE (x, 0)-(x, 479), 0\r
+ ' LINE (x + 1, 0)-(x + 1, 479), 12\r
+ LINE (x, 0)-(x, 479), 0\r
\r
- LINE (x - 1, oy1)-(x, y1), 1\r
- LINE (x - 1, oy2)-(x, y2), 2\r
- LINE (x - 1, oy3)-(x, y3), 15\r
+ LINE (x - 1, oldY1)-(x, y1), 1\r
+ LINE (x - 1, oldY2)-(x, y2), 2\r
+ LINE (x - 1, oldY3)-(x, y3), 15\r
\r
NEXT x\r
GOTO 1\r
\r
-SUB diplay\r
+SUB Display\r
END SUB\r
\r
-SUB getfreq\r
+SUB GetFrequency\r
\r
FOR a = 1 TO 100\r
- freq(a) = RND / 2 + 1\r
+ freq(a) = RND / 2 + 1\r
NEXT a\r
\r
FOR a = 1 TO 100\r
- phase(a) = RND * 100\r
+ phase(a) = RND * 100\r
NEXT a\r
\r
-\r
END SUB\r
\r
-FUNCTION gety (t)\r
+FUNCTION GetY (t)\r
\r
y = 0\r
FOR a = 1 TO 1\r
- y = y + SIN(t * freq(a) + phase(a))\r
+ y = y + SIN(t * freq(a) + phase(a))\r
NEXT a\r
\r
-gety = y\r
+GetY = y\r
\r
END FUNCTION\r
\r
-SUB start\r
+SUB Start\r
SCREEN 12\r
-getfreq\r
+GetFrequency\r
\r
END SUB\r
-\r
' Program simulates lot of frequencies interfering with itself.\r
' As a result, interferogram is produced.\r
+'\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' ?, Initial version\r
+' 2024.08, Improved program readability using AI\r
\r
-DIM SHARED freq(1 TO 100)\r
-DIM SHARED phase(1 TO 100)\r
+\r
+DIM SHARED frequency(1 TO 100)\r
+DIM SHARED phaseAngle(1 TO 100)\r
\r
SCREEN 12\r
\r
PSET (0, 0)\r
-FOR x = 0 TO 639\r
-\r
- fs = (x - 320) / 5000 + 1\r
-' fs = (x - 320) / 50 + 1\r
+FOR xPos = 0 TO 639\r
\r
- y = 0\r
- FOR t = 1 TO 5000 STEP 5\r
- y1 = SIN(t)\r
- y2 = SIN(t * fs)\r
- y = y + ABS(y1 + y2)\r
- NEXT t\r
+ fs = (xPos - 320) / 5000 + 1\r
+ ' fs = (xPos - 320) / 50 + 1\r
\r
- y = y / 5\r
- IF y > 470 THEN y = 470\r
- IF y < 0 THEN y = 0\r
+ yVal = 0\r
+ FOR timeStep = 1 TO 5000 STEP 5\r
+ y1 = SIN(timeStep)\r
+ y2 = SIN(timeStep * fs)\r
+ yVal = yVal + ABS(y1 + y2)\r
+ NEXT timeStep\r
\r
- LINE -(x, 479 - y), 15\r
+ yVal = yVal / 5\r
+ IF yVal > 470 THEN yVal = 470\r
+ IF yVal < 0 THEN yVal = 0\r
\r
-NEXT x\r
+ LINE -(xPos, 479 - yVal), 15\r
\r
-SUB getfreq\r
+NEXT xPos\r
\r
-FOR a = 1 TO 100\r
- freq(a) = RND / 7 + 1\r
-NEXT a\r
+SUB getFrequencies\r
\r
-FOR a = 1 TO 100\r
- phase(a) = RND * 100\r
-NEXT a\r
+ ' Generates random frequencies and phase angles\r
+ FOR index = 1 TO 100\r
+ frequency(index) = RND / 7 + 1\r
+ NEXT index\r
\r
+ FOR index = 1 TO 100\r
+ phaseAngle(index) = RND * 100\r
+ NEXT index\r
\r
END SUB\r
\r
-SUB gety (t)\r
-\r
-y = 0\r
-FOR a = 1 TO 100\r
- y = y + SIN(t * freq(a) + phase(a))\r
-NEXT a\r
+SUB getYVal (timeStep)\r
\r
+ yVal = 0\r
+ ' Sum of sinusoids with different frequencies and phases\r
+ FOR index = 1 TO 100\r
+ yVal = yVal + SIN(timeStep * frequency(index) + phaseAngle(index))\r
+ NEXT index\r
\r
END SUB\r
-\r
' Program simulates water spill and subsequent surface tension that\r
' tries to round out the sharp edges.\r
'\r
-' made by Svjatoslav Agejenko\r
-' in 2003.12\r
-' homepage: svjatoslav.eu\r
-' email: svjatoslav@svjatoslav.eu\r
- \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
DEFINT A-Z\r
WIDTH 80, 50\r
VIEW PRINT 1 TO 50\r
RANDOMIZE TIMER\r
CLS\r
-DIM SHARED buf1(1 TO 80, 1 TO 50)\r
-DIM SHARED buf2(1 TO 80, 1 TO 50)\r
+DIM SHARED buffer1(1 TO 80, 1 TO 50)\r
+DIM SHARED buffer2(1 TO 80, 1 TO 50)\r
\r
+' Initialize the buffers with random values (0 or 1)\r
FOR y = 1 TO 50\r
FOR x = 1 TO 80\r
- buf1(x, y) = INT(RND * 2)\r
+ buffer1(x, y) = INT(RND * 2)\r
NEXT x\r
NEXT y\r
\r
+' Main simulation loop\r
1\r
FOR y = 2 TO 49\r
FOR x = 2 TO 79\r
- c = buf1(x - 1, y - 1)\r
- c = c + buf1(x, y - 1)\r
- c = c + buf1(x + 1, y - 1)\r
- c = c + buf1(x - 1, y)\r
- c = c + buf1(x + 1, y)\r
- c = c + buf1(x - 1, y + 1)\r
- c = c + buf1(x, y + 1)\r
- c = c + buf1(x + 1, y + 1)\r
- IF buf1(x, y) = 1 THEN\r
- IF c > 3 THEN buf2(x, y) = 1 ELSE buf2(x, y) = 0\r
+ ' Calculate the sum of neighboring cells\r
+ cellSum = buffer1(x - 1, y - 1)\r
+ cellSum = cellSum + buffer1(x, y - 1)\r
+ cellSum = cellSum + buffer1(x + 1, y - 1)\r
+ cellSum = cellSum + buffer1(x - 1, y)\r
+ cellSum = cellSum + buffer1(x + 1, y)\r
+ cellSum = cellSum + buffer1(x - 1, y + 1)\r
+ cellSum = cellSum + buffer1(x, y + 1)\r
+ cellSum = cellSum + buffer1(x + 1, y + 1)\r
+\r
+ ' Apply the surface tension rules\r
+ IF buffer1(x, y) = 1 THEN\r
+ IF cellSum > 3 THEN\r
+ buffer2(x, y) = 1\r
+ ELSE\r
+ buffer2(x, y) = 0\r
+ END IF\r
ELSE\r
- IF c > 4 THEN buf2(x, y) = 1 ELSE buf2(x, y) = 0\r
+ IF cellSum > 4 THEN\r
+ buffer2(x, y) = 1\r
+ ELSE\r
+ buffer2(x, y) = 0\r
+ END IF\r
END IF\r
NEXT x\r
NEXT y\r
\r
+' Update the display and swap buffers\r
FOR y = 1 TO 50\r
FOR x = 1 TO 80\r
- b = buf2(x, y)\r
- buf1(x, y) = b\r
+ cellValue = buffer2(x, y)\r
+ buffer1(x, y) = cellValue\r
+\r
+ ' Print the cell value on screen\r
LOCATE y, x\r
- IF b = 0 THEN PRINT "."; ELSE PRINT "#"\r
+ IF cellValue = 0 THEN\r
+ PRINT ".";\r
+ ELSE\r
+ PRINT "#"\r
+ END IF\r
NEXT x\r
NEXT y\r
+\r
SOUND 0, 3\r
GOTO 1\r
-\r