-' 3D gravitation model\r
-' made by Svjatoslav Agejenko\r
-' in 2003.12\r
-' H-Page: svjatoslav.eu\r
-' E-Mail: svjatoslav@svjatoslav.eu\r
- \r
-DECLARE SUB gravi ()\r
-DECLARE SUB adda (x!, y!, z!, s!)\r
-DECLARE SUB display ()\r
-DIM SHARED atx(1 TO 100)\r
-DIM SHARED aty(1 TO 100)\r
-DIM SHARED atz(1 TO 100)\r
-DIM SHARED atxs(1 TO 100)\r
-DIM SHARED atys(1 TO 100)\r
-DIM SHARED atzs(1 TO 100)\r
-DIM SHARED ats(1 TO 100)\r
-DIM SHARED mitu\r
-DIM SHARED myx, myy, myz\r
-DIM SHARED oax(1 TO 100)\r
-DIM SHARED oay(1 TO 100)\r
-DIM SHARED oas(1 TO 100)\r
-\r
-\r
-myx = 0\r
-myy = 0\r
-myz = -5\r
-mitu = 0\r
+' Program to simulate gravitational forces between atoms.\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
+DECLARE SUB Gravitate ()\r
+DECLARE SUB AddAtom (x AS SINGLE, y AS SINGLE, z AS SINGLE, size AS SINGLE)\r
+DECLARE SUB DisplaySystem ()\r
+\r
+DIM SHARED atomX(1 TO 100)\r
+DIM SHARED atomY(1 TO 100)\r
+DIM SHARED atomZ(1 TO 100)\r
+DIM SHARED atomXSpeed(1 TO 100)\r
+DIM SHARED atomYSpeed(1 TO 100)\r
+DIM SHARED atomZSpeed(1 TO 100)\r
+DIM SHARED atomSize(1 TO 100)\r
+DIM SHARED countOfAtoms\r
+DIM SHARED myX, myY, myZ\r
+DIM SHARED oldAtomX(1 TO 100)\r
+DIM SHARED oldAtomY(1 TO 100)\r
+DIM SHARED oldAtomSize(1 TO 100)\r
+\r
+myX = 0\r
+myY = 0\r
+myZ = -5\r
+countOfAtoms = 0\r
\r
SCREEN 13\r
\r
FOR a = 1 TO 30\r
-adda RND * 6 - 3, RND * 6 - 3, RND * 4, 50\r
+ AddAtom RND * 6 - 3, RND * 6 - 3, RND * 4, 50\r
NEXT a\r
\r
1\r
-display\r
-gravi\r
-IF INKEY$ <> "" THEN SYSTEM\r
+ DisplaySystem\r
+ Gravitate\r
+ IF INKEY$ <> "" THEN SYSTEM\r
GOTO 1\r
\r
-SUB adda (x, y, z, s)\r
-\r
-mitu = mitu + 1\r
-atx(mitu) = x\r
-aty(mitu) = y\r
-atz(mitu) = z\r
-ats(mitu) = s\r
-\r
-atxs(mitu) = 0\r
-atys(mitu) = 0\r
-atzs(mitu) = 0\r
+SUB AddAtom (x, y, z, size)\r
+ countOfAtoms = countOfAtoms + 1\r
+ atomX(countOfAtoms) = x\r
+ atomY(countOfAtoms) = y\r
+ atomZ(countOfAtoms) = z\r
+ atomSize(countOfAtoms) = size\r
\r
+ atomXSpeed(countOfAtoms) = 0\r
+ atomYSpeed(countOfAtoms) = 0\r
+ atomZSpeed(countOfAtoms) = 0\r
END SUB\r
\r
-SUB display\r
-\r
-FOR a = 1 TO mitu\r
-x = atx(a) - myx\r
-y = aty(a) - myy\r
-z = atz(a) - myz\r
-\r
-x1 = x / z * 100 + 160\r
-y1 = y / z * 100 + 100\r
-\r
-CIRCLE (oax(a), oay(a)), oas(a), 0\r
-CIRCLE (x1, y1), ats(a) / z, 15\r
-oax(a) = x1\r
-oay(a) = y1\r
-oas(a) = ats(a) / z\r
-\r
-NEXT a\r
-\r
-\r
+SUB DisplaySystem\r
+ FOR a = 1 TO countOfAtoms\r
+ x = atomX(a) - myX\r
+ y = atomY(a) - myY\r
+ z = atomZ(a) - myZ\r
+\r
+ x1 = x / z * 100 + 160\r
+ y1 = y / z * 100 + 100\r
+\r
+ CIRCLE (oldAtomX(a), oldAtomY(a)), oldAtomSize(a), 0\r
+ CIRCLE (x1, y1), atomSize(a) / z, 15\r
+ oldAtomX(a) = x1\r
+ oldAtomY(a) = y1\r
+ oldAtomSize(a) = atomSize(a) / z\r
+ NEXT a\r
END SUB\r
\r
-SUB gravi\r
-FOR a = 1 TO mitu\r
-x = atx(a)\r
-y = aty(a)\r
-z = atz(a)\r
-pxs = 0\r
-pys = 0\r
-pzs = 0\r
-\r
-\r
-FOR b = 1 TO mitu\r
-IF b = a THEN GOTO 2\r
-v = SQR((atx(b) - x) ^ 2 + (aty(b) - y) ^ 2 + (atz(b) - z) ^ 2)\r
-v2 = 1 / (v - 1)\r
-\r
-pxs = pxs + (atx(b) - x) / v2 / 10000\r
-pys = pys + (aty(b) - y) / v2 / 10000\r
-pzs = pzs + (atz(b) - z) / v2 / 10000\r
-\r
-2\r
-NEXT b\r
-\r
-atxs(a) = atxs(a) / 1.01 + pxs\r
-atys(a) = atys(a) / 1.01 + pys\r
-atzs(a) = atzs(a) / 1.01 + pzs\r
-NEXT a\r
-\r
-FOR a = 1 TO mitu\r
-\r
-atx(a) = atx(a) + atxs(a)\r
-aty(a) = aty(a) + atys(a)\r
-atz(a) = atz(a) + atzs(a)\r
-NEXT a\r
-\r
-\r
-\r
+SUB Gravitate\r
+ DIM pxs, pys, pzs\r
+\r
+ FOR a = 1 TO countOfAtoms\r
+ x = atomX(a)\r
+ y = atomY(a)\r
+ z = atomZ(a)\r
+ pxs = 0\r
+ pys = 0\r
+ pzs = 0\r
+\r
+ FOR b = 1 TO countOfAtoms\r
+ IF b = a THEN GOTO 2\r
+ v = SQR((atomX(b) - x) ^ 2 + (atomY(b) - y) ^ 2 + (atomZ(b) - z) ^ 2)\r
+ v2 = 1 / (v - 1)\r
+\r
+ pxs = pxs + (atomX(b) - x) / v2 / 10000\r
+ pys = pys + (atomY(b) - y) / v2 / 10000\r
+ pzs = pzs + (atomZ(b) - z) / v2 / 10000\r
+\r
+2 NEXT b\r
+\r
+ atomXSpeed(a) = atomXSpeed(a) / 1.01 + pxs\r
+ atomYSpeed(a) = atomYSpeed(a) / 1.01 + pys\r
+ atomZSpeed(a) = atomZSpeed(a) / 1.01 + pzs\r
+ NEXT a\r
+\r
+ FOR a = 1 TO countOfAtoms\r
+ atomX(a) = atomX(a) + atomXSpeed(a)\r
+ atomY(a) = atomY(a) + atomYSpeed(a)\r
+ atomZ(a) = atomZ(a) + atomZSpeed(a)\r
+ NEXT a\r
END SUB\r
\r