+' Program render bump-map animation.\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
+\r
DECLARE SUB makeSurface ()\r
DECLARE SUB animate ()\r
DECLARE SUB makeDot (x!, y!)\r
DECLARE SUB paintImage ()\r
SCREEN 13\r
\r
-DIM SHARED imgh(0 TO 50, 0 TO 50)\r
+' surface height map\r
+DIM SHARED imgHeight(0 TO 50, 0 TO 50)\r
\r
PAINT (0, 0), 1\r
\r
\r
SUB animate\r
\r
-frm = 0\r
+ frame = 0\r
1\r
-frm = frm + 5\r
-lx = SIN(frm / 100) * 20 + 25\r
-ly = SIN(frm / 71.32) * 20 + 25\r
-lx = lx + SIN(frm / 34) * 10\r
-ly = ly + SIN(frm / 45) * 10\r
-\r
-\r
-FOR y = 2 TO 48\r
- FOR x = 2 TO 48\r
- d = SQR((x - lx) ^ 2 + (y - ly) ^ 2)\r
- b = (30 - d) / 4\r
- \r
- v = imgh(x - 1, y) - imgh(x, y)\r
- bpx = (lx - x) * v\r
- \r
- v = imgh(x, y - 1) - imgh(x, y)\r
- bpy = (ly - y) * v\r
- \r
- b = b + (bpx + bpy) / (d / 2)\r
-\r
- IF b < 0 THEN b = 0\r
- IF b > 15 THEN b = 15\r
- PSET (x + 150, y), 16 + b\r
- NEXT x\r
-NEXT y\r
-\r
-CIRCLE (lx + 150, ly), 2, 12\r
+ frame = frame + 5\r
+ lightX = SIN(frame / 100) * 20 + 25\r
+ lightY = SIN(frame / 71.32) * 20 + 25\r
+ lightX = lightX + SIN(frame / 34) * 10\r
+ lightY = lightY + SIN(frame / 45) * 10\r
\r
+ FOR y = 2 TO 48\r
+ FOR x = 2 TO 48\r
+ distance = SQR((x - lightX) ^ 2 + (y - lightY) ^ 2)\r
+ brightness = (30 - distance) / 4\r
\r
-GOTO 1\r
+ value = imgHeight(x - 1, y) - imgHeight(x, y)\r
+ brightnessX = (lightX - x) * value\r
+\r
+ value = imgHeight(x, y - 1) - imgHeight(x, y)\r
+ brightnessY = (lightY - y) * value\r
+\r
+ brightness = brightness + (brightnessX + brightnessY) / (distance / 2)\r
\r
+ IF brightness < 0 THEN brightness = 0\r
+ IF brightness > 15 THEN brightness = 15\r
+ PSET (x + 150, y), 16 + brightness\r
+ NEXT x\r
+ NEXT y\r
+\r
+ CIRCLE (lightX + 150, lightY), 2, 12\r
+\r
+GOTO 1\r
\r
END SUB\r
\r
SUB makeDot (x, y)\r
\r
-FOR x1 = -10 TO 10\r
- FOR y1 = -10 TO 10\r
- dist = SQR(x1 * x1 + y1 * y1)\r
- p = 4 - dist\r
- IF p < 0 THEN p = 0\r
- imgx = x1 + x\r
- imgy = y1 + y\r
- IF imgx < 0 THEN imgx = 0\r
- IF imgy < 0 THEN imgy = 0\r
- IF imgx > 50 THEN imgx = 50\r
- IF imgy > 50 THEN imgy = 50\r
- imgh(imgx, imgy) = imgh(imgx, imgy) + p\r
-\r
- \r
- NEXT y1\r
-NEXT x1\r
+ FOR x1 = -10 TO 10\r
+ FOR y1 = -10 TO 10\r
+ dist = SQR(x1 * x1 + y1 * y1)\r
+ power = 4 - dist\r
+ IF power < 0 THEN power = 0\r
+ imgX = x1 + x\r
+ imgY = y1 + y\r
+ IF imgX < 0 THEN imgX = 0\r
+ IF imgY < 0 THEN imgY = 0\r
+ IF imgX > 50 THEN imgX = 50\r
+ IF imgY > 50 THEN imgY = 50\r
+ imgHeight(imgX, imgY) = imgHeight(imgX, imgY) + power\r
+\r
+ NEXT y1\r
+ NEXT x1\r
\r
END SUB\r
\r
SUB makeSurface\r
-FOR x = 0 TO 10\r
- makeDot RND * 50, RND * 50\r
-NEXT x\r
\r
-FOR x = 0 TO 45 STEP 2\r
- makeDot x, x / 2 + 5\r
-NEXT x\r
+ FOR x = 0 TO 10\r
+ CALL makeDot(RND * 50, RND * 50)\r
+ NEXT x\r
+\r
+ FOR x = 0 TO 45 STEP 2\r
+ CALL makeDot(x, x / 2 + 5)\r
+ NEXT x\r
\r
-FOR x = 5 TO 30 STEP 2\r
- makeDot x, -x / 1.2 + 30\r
-NEXT x\r
+ FOR x = 5 TO 30 STEP 2\r
+ CALL makeDot(x, -x / 1.2 + 30)\r
+ NEXT x\r
\r
END SUB\r
\r
SUB paintImage\r
-FOR x = 0 TO 50\r
- FOR y = 0 TO 50\r
- c = imgh(x, y) + 16\r
- PSET (x, y), c\r
- NEXT y\r
-NEXT x\r
\r
+ FOR x = 0 TO 50\r
+ FOR y = 0 TO 50\r
+ clr = imgHeight(x, y) + 16\r
+ PSET (x, y), clr\r
+ NEXT y\r
+ NEXT x\r
\r
END SUB\r
\r
-' by Svjatoslav Agejenko\r
-' 04.2003\r
+' Animated fractal that is made of size shifting squares.\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 ga (x!, y!, s!)\r
-DIM SHARED depth\r
-DIM SHARED m1, m2, m3, m4\r
+\r
+DECLARE SUB drawFractal (x!, y!, s!)\r
+DIM SHARED recursionDepth\r
+DIM SHARED factor1, factor2, factor3, factor4\r
SCREEN 7, , , 1\r
\r
-depth = 1\r
+recursionDepth = 1\r
+\r
1\r
-frm = frm + 1\r
-m1 = SIN(frm / 19) * 1 + 3\r
-m2 = SIN(frm / 12) * 1 + 3\r
-m3 = SIN(frm / 17) * 1 + 3\r
-m4 = SIN(frm / 22) * 1 + 3\r
+frameCount = frameCount + 1\r
+factor1 = SIN(frameCount / 19) * 1 + 3\r
+factor2 = SIN(frameCount / 12) * 1 + 3\r
+factor3 = SIN(frameCount / 17) * 1 + 3\r
+factor4 = SIN(frameCount / 22) * 1 + 3\r
PCOPY 0, 1\r
CLS\r
-ga 160, 100, 40\r
+drawFractal 160, 100, 40\r
SOUND 0, .4\r
-a$ = INKEY$\r
-IF a$ <> "" THEN SYSTEM\r
+userInput$ = INKEY$\r
+IF userInput$ <> "" THEN SYSTEM\r
GOTO 1\r
\r
-SUB ga (x, y, s)\r
-IF s > 1 THEN\r
- depth = depth + 1\r
- LINE (x - s, y - s)-(x + s, y + s), depth, BF\r
- ga x - s, y - s, s / m1\r
- ga x + s, y - s, s / m2\r
- ga x + s, y + s, s / m3\r
- ga x - s, y + s, s / m4\r
- depth = depth - 1\r
-END IF\r
+SUB drawFractal (x, y, s)\r
+ IF s > 1 THEN\r
+ recursionDepth = recursionDepth + 1\r
+ LINE (x - s, y - s)-(x + s, y + s), recursionDepth, BF\r
+ drawFractal x - s, y - s, s / factor1\r
+ drawFractal x + s, y - s, s / factor2\r
+ drawFractal x + s, y + s, s / factor3\r
+ drawFractal x - s, y + s, s / factor4\r
+ recursionDepth = recursionDepth - 1\r
+ END IF\r
END SUB\r
-\r
-' by Svjatoslav Agejenko\r
-' 04.2003\r
-\r
-DECLARE SUB ga (x!, y!, s!)\r
-DIM SHARED m1, m2, m3\r
-DIM SHARED v11, v12\r
-DIM SHARED v21, v22\r
-DIM SHARED v31, v32\r
+' Animated tree fractal.\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 generateFractal (x!, y!, s!)\r
+\r
+DECLARE SUB generateArt (x!, y!, s!)\r
+DIM SHARED modifier1, modifier2, modifier3\r
+DIM SHARED vector1X, vector1Y\r
+DIM SHARED vector2X, vector2Y\r
+DIM SHARED vector3X, vector3Y\r
SCREEN 7, , , 1\r
\r
1\r
-frm = frm + 1\r
-m1 = SIN(frm / 19) + 3\r
-m2 = SIN(frm / 12) + 3\r
-m3 = SIN(frm / 17) + 3\r
+frame = frame + 1\r
+modifier1 = SIN(frame / 19) + 3\r
+modifier2 = SIN(frame / 12) + 3\r
+modifier3 = SIN(frame / 17) + 3\r
\r
-v11 = SIN(frm / 13) / 3 + 1\r
-v12 = SIN(frm / 18) / 3 + 1\r
+vector1X = SIN(frame / 13) / 3 + 1\r
+vector1Y = SIN(frame / 18) / 3 + 1\r
\r
-v21 = SIN(frm / 20) / 3 + 1\r
-v22 = SIN(frm / 28) / 3 + 1\r
+vector2X = SIN(frame / 20) / 3 + 1\r
+vector2Y = SIN(frame / 28) / 3 + 1\r
\r
-v31 = SIN(frm / 31) / 3 + 1\r
-v32 = SIN(frm / 24) / 3 + 1\r
+vector3X = SIN(frame / 31) / 3 + 1\r
+vector3Y = SIN(frame / 24) / 3 + 1\r
\r
PCOPY 0, 1\r
CLS\r
-ga 160, 180, 80\r
+generateFractal 160, 180, 80\r
SOUND 0, .5\r
-a$ = INKEY$\r
-IF a$ <> "" THEN SYSTEM\r
+inputKey$ = INKEY$\r
+IF inputKey$ <> "" THEN SYSTEM\r
GOTO 1\r
\r
-SUB ga (x, y, s)\r
-IF s > 1 THEN\r
- LINE (x, y)-(x - s * v11, y - s * v12), 15\r
- LINE (x, y)-(x + s * v21, y - s * v22), 15\r
- LINE (x, y)-(x, y - s), 15\r
- ga x - s * v11, y - s * v12, s / m1\r
- ga x + s * v21, y - s * v22, s / m2\r
- ga x, y - s, s / m3\r
-END IF\r
+SUB generateFractal (x, y, s)\r
+ IF s > 1 THEN\r
+ LINE (x, y)-(x - s * vector1X, y - s * vector1Y), 15\r
+ LINE (x, y)-(x + s * vector2X, y - s * vector2Y), 15\r
+ LINE (x, y)-(x, y - s), 15\r
+ generateFractal x - s * vector1X, y - s * vector1Y, s / modifier1\r
+ generateFractal x + s * vector2X, y - s * vector2Y, s / modifier2\r
+ generateFractal x, y - s, s / modifier3\r
+ END IF\r
END SUB\r
\r