-' Fractal\r
-' made by Svjatoslav Agejenko\r
-' in 2003.12\r
-' H-Page: svjatoslav.eu\r
-' E-Mail: svjatoslav@svjatoslav.eu\r
- \r
-DECLARE SUB mo (x!, y!, an!, s!, w!)\r
+' Program to render spiral resembling fractal made out of circles.\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
+DECLARE SUB drawFractal (x!, y!, angle!, size!, w!)\r
DIM SHARED depth\r
DIM SHARED pi\r
\r
-DIM SHARED sh1, sh2, sv1, sv2, hp, vp\r
-\r
+DIM SHARED scaleH1, scaleH2, scaleV1, scaleV2, hp, vp\r
\r
pi = 3.14128\r
\r
SCREEN 12\r
\r
-\r
-sv1 = 5\r
-sv2 = 2\r
+scaleV1 = 5\r
+scaleV2 = 2\r
vp = .2\r
\r
-sh1 = 2\r
-sh2 = 1.4\r
+scaleH1 = 2\r
+scaleH2 = 1.4\r
hp = .2\r
\r
-\r
-mo 320, 240, pi - .9, 50, 0\r
+drawFractal 320, 240, pi - .9, 50, 0\r
\r
a$ = INPUT$(1)\r
SYSTEM\r
\r
-SUB mo (x, y, an, s, w)\r
-depth = depth + 1\r
-IF s < .2 THEN GOTO 1\r
-\r
-IF depth / 2 = depth \ 2 THEN c = 15 ELSE c = 10\r
-\r
-CIRCLE (x, y), s, c\r
-PAINT (x, y), c\r
-\r
-IF w <> 1 THEN\r
-x1 = SIN(an) * s * 2.5 + x\r
-y1 = COS(an) * s * 2.5 + y\r
-IF w = 3 THEN ns = s / sv2 ELSE ns = s / sv1\r
-mo x1, y1, an + vp, ns, 3\r
-END IF\r
-\r
-IF w <> 2 THEN\r
-x1 = SIN(an - pi / 2) * s * 2.5 + x\r
-y1 = COS(an - pi / 2) * s * 2.5 + y\r
-IF w = 4 THEN ns = s / sh2 ELSE ns = s / sh1\r
-mo x1, y1, an + hp, ns, 4\r
-END IF\r
-\r
-IF w <> 3 THEN\r
-x1 = SIN(an - pi) * s * 2.5 + x\r
-y1 = COS(an - pi) * s * 2.5 + y\r
-IF w = 1 THEN ns = s / sv2 ELSE ns = s / sv1\r
-mo x1, y1, an + vp, ns, 1\r
-END IF\r
-\r
-IF w <> 4 THEN\r
-x1 = SIN(an - pi * 1.5) * s * 2.5 + x\r
-y1 = COS(an - pi * 1.5) * s * 2.5 + y\r
-IF w = 2 THEN ns = s / sh2 ELSE ns = s / sh1\r
-mo x1, y1, an + hp, ns, 2\r
-END IF\r
-\r
-1\r
-depth = depth - 1\r
+SUB drawFractal (x, y, angle, size, w)\r
+ depth = depth + 1\r
+ IF size < .2 THEN GOTO 1\r
+\r
+ ' Determine color based on the current depth\r
+ IF depth / 2 = depth \ 2 THEN\r
+ c = 15\r
+ ELSE\r
+ c = 10\r
+ END IF\r
+\r
+ CIRCLE (x, y), size, c\r
+ PAINT (x, y), c\r
+\r
+ ' Recursive calls for different directions\r
+ IF w <> 1 THEN\r
+ x1 = SIN(angle) * size * 2.5 + x\r
+ y1 = COS(angle) * size * 2.5 + y\r
+ IF w = 3 THEN\r
+ newSize = size / scaleV2\r
+ ELSE\r
+ newSize = size / scaleV1\r
+ END IF\r
+ drawFractal x1, y1, angle + vp, newSize, 3\r
+ END IF\r
+\r
+ IF w <> 2 THEN\r
+ x1 = SIN(angle - pi / 2) * size * 2.5 + x\r
+ y1 = COS(angle - pi / 2) * size * 2.5 + y\r
+ IF w = 4 THEN\r
+ newSize = size / scaleH2\r
+ ELSE\r
+ newSize = size / scaleH1\r
+ END IF\r
+ drawFractal x1, y1, angle + hp, newSize, 4\r
+ END IF\r
+\r
+ IF w <> 3 THEN\r
+ x1 = SIN(angle - pi) * size * 2.5 + x\r
+ y1 = COS(angle - pi) * size * 2.5 + y\r
+ IF w = 1 THEN\r
+ newSize = size / scaleV2\r
+ ELSE\r
+ newSize = size / scaleV1\r
+ END IF\r
+ drawFractal x1, y1, angle + vp, newSize, 1\r
+ END IF\r
+\r
+ IF w <> 4 THEN\r
+ x1 = SIN(angle - pi * 1.5) * size * 2.5 + x\r
+ y1 = COS(angle - pi * 1.5) * size * 2.5 + y\r
+ IF w = 2 THEN\r
+ newSize = size / scaleH2\r
+ ELSE\r
+ newSize = size / scaleH1\r
+ END IF\r
+ drawFractal x1, y1, angle + hp, newSize, 2\r
+ END IF\r
+\r
+ 1\r
+ depth = depth - 1\r
END SUB\r
-\r
-' Plygon mapping\r
-' made by Svjatoslav Agejenko\r
-' in 2001\r
-' H-Page: svjatoslav.eu\r
-' E-Mail: svjatoslav@svjatoslav.eu\r
- \r
+' Program to render polygons at random locations and random colors.\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
DEFINT A-Z\r
-DECLARE SUB fp (x1, y1, x2, y2, x3, y3, c)\r
+DECLARE SUB fillPolygon (x1, y1, x2, y2, x3, y3, c)\r
SCREEN 13\r
\r
-2\r
-x1 = RND * 318 + 1\r
-y1 = RND * 198 + 1\r
-\r
-x2 = RND * 318 + 1\r
-y2 = RND * 198 + 1\r
-\r
-x3 = RND * 318 + 1\r
-y3 = RND * 198 + 1\r
-\r
-\r
-fp x1, y1, x2, y2, x3, y3, RND * 255\r
-IF INKEY$ <> "" THEN SYSTEM\r
-GOTO 2\r
-\r
-SUB fp (x1, y1, x2, y2, x3, y3, c)\r
-DIM yb(-10 TO 210)\r
-\r
-mx1 = x1\r
-my1 = y1\r
-mx2 = x2\r
-my2 = y2\r
-GOSUB mkl\r
-mx1 = x1\r
-my1 = y1\r
-mx2 = x3\r
-my2 = y3\r
-GOSUB mkl\r
-mx1 = x3\r
-my1 = y3\r
-mx2 = x2\r
-my2 = y2\r
-GOSUB mkl\r
-GOTO 1\r
-\r
-mkl:\r
-IF my2 < my1 THEN SWAP my1, my2: SWAP mx1, mx2\r
-FOR y = my1 TO my2 - 1\r
-x = mx1 + (mx2 - mx1) * ((y - my1) / (my2 - my1))\r
-IF yb(y) = 0 THEN\r
-yb(y) = x\r
-ELSE\r
-LINE (x, y)-(yb(y), y), c\r
-END IF\r
-NEXT y\r
+MainLoop:\r
+ x1 = RND * 318 + 1\r
+ y1 = RND * 198 + 1\r
+\r
+ x2 = RND * 318 + 1\r
+ y2 = RND * 198 + 1\r
+\r
+ x3 = RND * 318 + 1\r
+ y3 = RND * 198 + 1\r
+\r
+ fillPolygon x1, y1, x2, y2, x3, y3, RND * 255\r
+ IF INKEY$ <> "" THEN SYSTEM\r
+GOTO MainLoop\r
+\r
+SUB fillPolygon (x1, y1, x2, y2, x3, y3, c)\r
+ DIM yBuffer(-10 TO 210)\r
+\r
+ tempX1 = x1\r
+ tempY1 = y1\r
+ tempX2 = x2\r
+ tempY2 = y2\r
+ GOSUB makeLine\r
+\r
+ tempX1 = x1\r
+ tempY1 = y1\r
+ tempX2 = x3\r
+ tempY2 = y3\r
+ GOSUB makeLine\r
+\r
+ tempX1 = x3\r
+ tempY1 = y3\r
+ tempX2 = x2\r
+ tempY2 = y2\r
+ GOSUB makeLine\r
+\r
+GOTO FillEnd\r
+\r
+makeLine:\r
+ IF tempY2 < tempY1 THEN SWAP tempY1, tempY2: SWAP tempX1, tempX2\r
+ FOR yIndex = tempY1 TO tempY2 - 1\r
+ xPos = tempX1 + (tempX2 - tempX1) * ((yIndex - tempY1) / (tempY2 - tempY1))\r
+ IF yBuffer(yIndex) = 0 THEN\r
+ yBuffer(yIndex) = xPos\r
+ ELSE\r
+ LINE (xPos, yIndex)-(yBuffer(yIndex), yIndex), c\r
+ END IF\r
+ NEXT yIndex\r
RETURN\r
-1\r
-END SUB\r
\r
+FillEnd:\r
+END SUB\r