Better file names
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sat, 26 Oct 2024 19:18:07 +0000 (22:18 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sat, 26 Oct 2024 19:18:07 +0000 (22:18 +0300)
Graphics/3D/04vann2.bas [deleted file]
Graphics/3D/3D game of life/3d life.bas [new file with mode: 0755]
Graphics/3D/3D game of life/3dlife.dat [new file with mode: 0644]
Graphics/3D/3D text.bas [new file with mode: 0755]
Graphics/3D/3dlife.bas [deleted file]
Graphics/3D/3dlife.dat [deleted file]
Graphics/3D/3dtext.bas [deleted file]
Graphics/3D/tiled room.bas [new file with mode: 0755]

diff --git a/Graphics/3D/04vann2.bas b/Graphics/3D/04vann2.bas
deleted file mode 100755 (executable)
index 45eeba2..0000000
+++ /dev/null
@@ -1,501 +0,0 @@
-' Program renders 3D room with various decorative tiles on the wall and on the floor.\r
-' User can freely fly around and look at the room from different angles.\r
-'\r
-' By Svjatoslav Agejenko.\r
-' Email: svjatoslav@svjatoslav.eu\r
-' Homepage: http://www.svjatoslav.eu\r
-'\r
-' Changelog:\r
-' ?, Initial version\r
-' 2024, Improved program readability using AI\r
-'\r
-' Keyboard controls:\r
-' <left>, <right>, <up>, <down> - move around\r
-' 2, 6, 4, 8 - look around (number pad)\r
-' <SPACE> - speed down\r
-' q - quit\r
-' + / - - move up / down\r
-'\r
-\r
-\r
-DECLARE SUB renderSquare2 (x!, y!, z!, s!)\r
-DECLARE SUB renderSquare (x%, y%, z%, s%)\r
-DECLARE SUB renderHexagon (x!, y!, z!, s!)\r
-DECLARE SUB generateCube ()\r
-\r
-DECLARE SUB start ()\r
-DECLARE SUB addSquare (x1%, y1%, z1%)\r
-DECLARE SUB getCornerVertices ()\r
-DECLARE SUB multiplyCoordinates ()\r
-DECLARE SUB calculateSine ()\r
-DIM SHARED xVertex(4000), yVertex(4000), zVertex(4000)\r
-DIM SHARED xCoordinate(4000), yCoordinate(4000), zCoordinate(4000)\r
-\r
-DIM SHARED xOriginal(4000), yOriginal(4000), zOriginal(4000)\r
-DIM SHARED point1Vertex(4000), point2Vertex(4000)\r
-DIM SHARED col(4000)\r
-DIM SHARED vertexCount, edgeCount\r
-DIM SHARED myx, myy, myz, mye, myk\r
-\r
-myx = 0\r
-myy = 0\r
-myz = -1000\r
-\r
-start\r
-\r
-nait3d\r
-\r
-SUB addSquare (x1%, y1%, z1%)\r
-    c = 1\r
-\r
-    ' Define the vertices of a square in 3D space\r
-    xVertex(vertexCount + 1) = -100 + x1\r
-    yVertex(vertexCount + 1) = y1\r
-    zVertex(vertexCount + 1) = -100 + z1\r
-\r
-    xVertex(vertexCount + 2) = 100 + x1\r
-    yVertex(vertexCount + 2) = y1\r
-    zVertex(vertexCount + 2) = -100 + z1\r
-\r
-    xVertex(vertexCount + 3) = 100 + x1\r
-    yVertex(vertexCount + 3) = y1\r
-    zVertex(vertexCount + 3) = 100 + z1\r
-\r
-    xVertex(vertexCount + 4) = -100 + x1\r
-    yVertex(vertexCount + 4) = y1\r
-    zVertex(vertexCount + 4) = 100 + z1\r
-\r
-    ' Define the edges of the square\r
-    point1Vertex(edgeCount + 1) = vertexCount + 1\r
-    point2Vertex(edgeCount + 1) = vertexCount + 2\r
-    col(edgeCount + 1) = c\r
-\r
-    point1Vertex(edgeCount + 2) = vertexCount + 2\r
-    point2Vertex(edgeCount + 2) = vertexCount + 3\r
-    col(edgeCount + 2) = c\r
-\r
-    point1Vertex(edgeCount + 3) = vertexCount + 3\r
-    point2Vertex(edgeCount + 3) = vertexCount + 4\r
-    col(edgeCount + 3) = c\r
-\r
-    point1Vertex(edgeCount + 4) = vertexCount + 4\r
-    point2Vertex(edgeCount + 4) = vertexCount + 1\r
-    col(edgeCount + 4) = c\r
-\r
-    ' Update the counters for the next square\r
-    vertexCount = vertexCount + 4\r
-    edgeCount = edgeCount + 4\r
-\r
-END SUB\r
-\r
-SUB getCornerVertices\r
-\r
-    ' Define the vertices of a square in 3D space\r
-    xVertex(vertexCount + 1) = -150\r
-    yVertex(vertexCount + 1) = -125\r
-    zVertex(vertexCount + 1) = -200\r
-\r
-    xVertex(vertexCount + 2) = 150\r
-    yVertex(vertexCount + 2) = -125\r
-    zVertex(vertexCount + 2) = -200\r
-\r
-    xVertex(vertexCount + 3) = 150\r
-    yVertex(vertexCount + 3) = 125\r
-    zVertex(vertexCount + 3) = -200\r
-\r
-    xVertex(vertexCount + 4) = -150\r
-    yVertex(vertexCount + 4) = 125\r
-    zVertex(vertexCount + 4) = -200\r
-\r
-    ' Define the edges of the square\r
-    point1Vertex(edgeCount + 1) = vertexCount + 1\r
-    point2Vertex(edgeCount + 1) = vertexCount + 2\r
-\r
-    point1Vertex(edgeCount + 2) = vertexCount + 2\r
-    point2Vertex(edgeCount + 2) = vertexCount + 3\r
-\r
-    point1Vertex(edgeCount + 3) = vertexCount + 3\r
-    point2Vertex(edgeCount + 3) = vertexCount + 4\r
-\r
-    point1Vertex(edgeCount + 4) = vertexCount + 4\r
-    point2Vertex(edgeCount + 4) = vertexCount + 1\r
-\r
-    ' Define the vertices of another square in 3D space\r
-    xVertex(vertexCount + 5) = -150\r
-    yVertex(vertexCount + 5) = -125\r
-    zVertex(vertexCount + 5) = 200\r
-\r
-    xVertex(vertexCount + 6) = 150\r
-    yVertex(vertexCount + 6) = -125\r
-    zVertex(vertexCount + 6) = 200\r
-\r
-    xVertex(vertexCount + 7) = 150\r
-    yVertex(vertexCount + 7) = 125\r
-    zVertex(vertexCount + 7) = 200\r
-\r
-    xVertex(vertexCount + 8) = -150\r
-    yVertex(vertexCount + 8) = 125\r
-    zVertex(vertexCount + 8) = 200\r
-\r
-    ' Define the edges of the second square\r
-    point1Vertex(edgeCount + 5) = vertexCount + 5\r
-    point2Vertex(edgeCount + 5) = vertexCount + 6\r
-\r
-    point1Vertex(edgeCount + 6) = vertexCount + 6\r
-    point2Vertex(edgeCount + 6) = vertexCount + 7\r
-\r
-    point1Vertex(edgeCount + 7) = vertexCount + 7\r
-    point2Vertex(edgeCount + 7) = vertexCount + 8\r
-\r
-    point1Vertex(edgeCount + 8) = vertexCount + 8\r
-    point2Vertex(edgeCount + 8) = vertexCount + 5\r
-\r
-    ' Define the edges connecting the two squares into cube\r
-    point1Vertex(edgeCount + 9) = vertexCount + 5\r
-    point2Vertex(edgeCount + 9) = vertexCount + 1\r
-\r
-    point1Vertex(edgeCount + 10) = vertexCount + 6\r
-    point2Vertex(edgeCount + 10) = vertexCount + 2\r
-\r
-    point1Vertex(edgeCount + 11) = vertexCount + 7\r
-    point2Vertex(edgeCount + 11) = vertexCount + 3\r
-\r
-    point1Vertex(edgeCount + 12) = vertexCount + 8\r
-    point2Vertex(edgeCount + 12) = vertexCount + 4\r
-\r
-    ' Update the counters for the next set of vertices and edges\r
-    vertexCount = vertexCount + 8\r
-    edgeCount = edgeCount + 12\r
-\r
-    ' Define a pyramid in 3D space\r
-    xVertex(vertexCount + 1) = -150\r
-    yVertex(vertexCount + 1) = -125 + 201\r
-    zVertex(vertexCount + 1) = 0\r
-\r
-    xVertex(vertexCount + 2) = -150\r
-    yVertex(vertexCount + 2) = -125 + 201\r
-    zVertex(vertexCount + 2) = 89\r
-\r
-    xVertex(vertexCount + 3) = -150\r
-    yVertex(vertexCount + 3) = -125\r
-    zVertex(vertexCount + 3) = 89\r
-\r
-    xVertex(vertexCount + 4) = -150\r
-    yVertex(vertexCount + 4) = -125\r
-    zVertex(vertexCount + 4) = 0\r
-\r
-    ' Define the edges of the pyramid\r
-    point1Vertex(edgeCount + 1) = vertexCount + 1\r
-    point2Vertex(edgeCount + 1) = vertexCount + 2\r
-\r
-    point1Vertex(edgeCount + 2) = vertexCount + 2\r
-    point2Vertex(edgeCount + 2) = vertexCount + 3\r
-\r
-    point1Vertex(edgeCount + 3) = vertexCount + 3\r
-    point2Vertex(edgeCount + 3) = vertexCount + 4\r
-\r
-    point1Vertex(edgeCount + 4) = vertexCount + 4\r
-    point2Vertex(edgeCount + 4) = vertexCount + 1\r
-\r
-    ' Update the counters for the next set of vertices and edges\r
-    vertexCount = vertexCount + 4\r
-    edgeCount = edgeCount + 4\r
-\r
-porand\r
-\r
-END SUB\r
-\r
-SUB renderHexagon (x, y, z, s)\r
-\r
-b = 0\r
-f = .3925\r
-' Calculate the vertices of a hexagon in 3D space\r
-FOR a = 0 + f TO 6 + f STEP 6.28 / 8\r
-    x1 = SIN(a) * s\r
-    y1 = COS(a) * s\r
-    b = b + 1\r
-\r
-    xVertex(vertexCount + b) = x + x1\r
-    yVertex(vertexCount + b) = y\r
-    zVertex(vertexCount + b) = z + y1\r
-\r
-NEXT a\r
-\r
-' Define the edges of the hexagon\r
-point1Vertex(edgeCount + 1) = vertexCount + 1\r
-point2Vertex(edgeCount + 1) = vertexCount + 2\r
-col(edgeCount + 1) = 12\r
-\r
-point1Vertex(edgeCount + 2) = vertexCount + 2\r
-point2Vertex(edgeCount + 2) = vertexCount + 3\r
-col(edgeCount + 2) = 12\r
-\r
-point1Vertex(edgeCount + 3) = vertexCount + 3\r
-point2Vertex(edgeCount + 3) = vertexCount + 4\r
-col(edgeCount + 3) = 12\r
-\r
-point1Vertex(edgeCount + 4) = vertexCount + 4\r
-point2Vertex(edgeCount + 4) = vertexCount + 5\r
-col(edgeCount + 4) = 12\r
-\r
-point1Vertex(edgeCount + 5) = vertexCount + 5\r
-point2Vertex(edgeCount + 5) = vertexCount + 6\r
-col(edgeCount + 5) = 12\r
-\r
-point1Vertex(edgeCount + 6) = vertexCount + 6\r
-point2Vertex(edgeCount + 6) = vertexCount + 7\r
-col(edgeCount + 6) = 12\r
-\r
-point1Vertex(edgeCount + 7) = vertexCount + 7\r
-point2Vertex(edgeCount + 7) = vertexCount + 8\r
-col(edgeCount + 7) = 12\r
-\r
-point1Vertex(edgeCount + 8) = vertexCount + 8\r
-point2Vertex(edgeCount + 8) = vertexCount + 1\r
-col(edgeCount + 8) = 12\r
-\r
-' Update the counters for the next set of vertices and edges\r
-vertexCount = vertexCount + b\r
-edgeCount = edgeCount + 8\r
-\r
-END SUB\r
-\r
-SUB nait3d\r
-\r
-    ' Main loop to render the 3D scene\r
-1\r
-\r
-    ' Update the position based on rotation\r
-    myx = myx + SIN(deg1) * mye\r
-    myz = myz + COS(deg1) * mye\r
-\r
-    myx = myx + COS(deg1) * myk\r
-    myz = myz - SIN(deg1) * myk\r
-\r
-    ' Update the rotation angles\r
-    deg1 = deg1 + d1\r
-    Deg2 = Deg2 + d2\r
-\r
-    ' Calculate the rotation matrices\r
-    C1 = COS(deg1): S1 = SIN(deg1)\r
-    C2 = COS(Deg2): S2 = SIN(Deg2)\r
-\r
-    ' Apply the rotation to each vertex\r
-    FOR a = 1 TO vertexCount\r
-        xo = xVertex(a) - myx\r
-        yo = -yVertex(a) - myy\r
-        zo = zVertex(a) - myz\r
-\r
-        x1 = (xo * C1 - zo * S1)\r
-        z1 = (xo * S1 + zo * C1)\r
-\r
-        y1 = (yo * C2 - z1 * S2)\r
-        z2 = (yo * S2 + z1 * C2)\r
-\r
-        ' Project the vertex onto the 2D screen\r
-        xOriginal(a) = xCoordinate(a)\r
-        yOriginal(a) = yCoordinate(a)\r
-        IF z2 < 20 THEN\r
-            xCoordinate(a) = -1\r
-        ELSE\r
-            xCoordinate(a) = 320 + (x1 / z2 * 500)\r
-            yCoordinate(a) = 240 + (y1 / z2 * 500)\r
-        END IF\r
-    NEXT\r
-\r
-    ' Draw the edges of each shape\r
-    FOR a = 1 TO edgeCount\r
-        p1 = point1Vertex(a)\r
-        p2 = point2Vertex(a)\r
-        IF xOriginal(p1) = -1 OR xOriginal(p2) = -1 THEN\r
-            ' Skip drawing if the vertex is off-screen\r
-        ELSE\r
-            ' erase edge on old coordinates\r
-            LINE (xOriginal(p1), yOriginal(p1))-(xOriginal(p2), yOriginal(p2)), 0\r
-        END IF\r
-\r
-        IF xCoordinate(p1) = -1 OR xCoordinate(p2) = -1 THEN\r
-            ' Skip drawing if the vertex is off-screen\r
-        ELSE\r
-            ' draw edge on new coordinates\r
-            LINE (xCoordinate(p1), yCoordinate(p1))-(xCoordinate(p2), yCoordinate(p2)), col(a)\r
-        END IF\r
-    NEXT\r
-\r
-    ' Handle user input\r
-    K$ = INKEY$\r
-    IF K$ <> "" THEN\r
-\r
-        SELECT CASE K$\r
-\r
-            CASE CHR$(0) + "P"\r
-                mye = mye - 3\r
-\r
-            CASE CHR$(0) + "H"\r
-                mye = mye + 3\r
-\r
-            CASE CHR$(0) + "M"\r
-                myk = myk + 3\r
-\r
-            CASE CHR$(0) + "K"\r
-                myk = myk - 3\r
-\r
-            CASE "+"\r
-                myy = myy + 3\r
-\r
-            CASE "-"\r
-                myy = myy - 3\r
-\r
-            CASE "6"\r
-                d1 = d1 + .01\r
-\r
-            CASE "4"\r
-                d1 = d1 - .01\r
-\r
-            CASE "8"\r
-                d2 = d2 - .01\r
-\r
-            CASE "2"\r
-                d2 = d2 + .01\r
-\r
-            CASE " "\r
-                d1 = d1 / 2\r
-                d2 = d2 / 2\r
-                d3 = d3 / 2\r
-                mye = mye / 2\r
-                myk = myk / 2\r
-\r
-            CASE "q"\r
-                SYSTEM\r
-\r
-            CASE CHR$(27)\r
-                SYSTEM\r
-        END SELECT\r
-    END IF\r
-\r
-    ' Continue the main loop\r
-    GOTO 1\r
-END SUB\r
-\r
-SUB porand\r
-\r
-    ' Generate a grid of shapes in 3D space\r
-    FOR x = -100 TO 0 STEP 12.067 + .3\r
-        FOR z = -100 TO 0 STEP 12.067 + .3\r
-            renderHexagon x, -125, z, 6.53\r
-            renderSquare x + 6.033 + .15, -125, z + 6.033 + .15, 3.111 + .3\r
-        NEXT z\r
-    NEXT x\r
-\r
-    ' Generate another grid of shapes in 3D space\r
-    FOR y = -100 TO 0 STEP 20.3\r
-        FOR x = -100 TO 0 STEP 20.3\r
-            renderSquare2 x, y, 200, 10\r
-        NEXT x\r
-    NEXT y\r
-\r
-END SUB\r
-\r
-SUB renderSquare (x%, y%, z%, s%)\r
-\r
-    ' Define the vertices of a square in 3D space\r
-    xVertex(vertexCount + 1) = x%\r
-    yVertex(vertexCount + 1) = y%\r
-    zVertex(vertexCount + 1) = z% + s%\r
-\r
-    xVertex(vertexCount + 2) = x% + s%\r
-    yVertex(vertexCount + 2) = y%\r
-    zVertex(vertexCount + 2) = z%\r
-\r
-    xVertex(vertexCount + 3) = x%\r
-    yVertex(vertexCount + 3) = y%\r
-    zVertex(vertexCount + 3) = z% - s%\r
-\r
-    xVertex(vertexCount + 4) = x% - s%\r
-    yVertex(vertexCount + 4) = y%\r
-    zVertex(vertexCount + 4) = z%\r
-\r
-    ' Define the edges of the square\r
-    point1Vertex(edgeCount + 1) = vertexCount + 1\r
-    point2Vertex(edgeCount + 1) = vertexCount + 2\r
-    col(edgeCount + 1) = 10\r
-\r
-    point1Vertex(edgeCount + 2) = vertexCount + 2\r
-    point2Vertex(edgeCount + 2) = vertexCount + 3\r
-    col(edgeCount + 2) = 10\r
-\r
-    point1Vertex(edgeCount + 3) = vertexCount + 3\r
-    point2Vertex(edgeCount + 3) = vertexCount + 4\r
-    col(edgeCount + 3) = 10\r
-\r
-    point1Vertex(edgeCount + 4) = vertexCount + 4\r
-    point2Vertex(edgeCount + 4) = vertexCount + 1\r
-    col(edgeCount + 4) = 10\r
-\r
-    ' Update the counters for the next square\r
-    vertexCount = vertexCount + 4\r
-    edgeCount = edgeCount + 4\r
-\r
-END SUB\r
-\r
-SUB renderSquare2 (x, y, z, s)\r
-\r
-    ' Define the vertices of a square in 3D space\r
-    xVertex(vertexCount + 1) = x - s\r
-    yVertex(vertexCount + 1) = y - s\r
-    zVertex(vertexCount + 1) = z\r
-\r
-    xVertex(vertexCount + 2) = x + s\r
-    yVertex(vertexCount + 2) = y - s\r
-    zVertex(vertexCount + 2) = z\r
-\r
-    xVertex(vertexCount + 3) = x + s\r
-    yVertex(vertexCount + 3) = y + s\r
-    zVertex(vertexCount + 3) = z\r
-\r
-    xVertex(vertexCount + 4) = x - s\r
-    yVertex(vertexCount + 4) = y + s\r
-    zVertex(vertexCount + 4) = z\r
-\r
-    ' Define the edges of the square\r
-    point1Vertex(edgeCount + 1) = vertexCount + 1\r
-    point2Vertex(edgeCount + 1) = vertexCount + 2\r
-    col(edgeCount + 1) = 14\r
-\r
-    point1Vertex(edgeCount + 2) = vertexCount + 2\r
-    point2Vertex(edgeCount + 2) = vertexCount + 3\r
-    col(edgeCount + 2) = 14\r
-\r
-    point1Vertex(edgeCount + 3) = vertexCount + 3\r
-    point2Vertex(edgeCount + 3) = vertexCount + 4\r
-    col(edgeCount + 3) = 14\r
-\r
-    point1Vertex(edgeCount + 4) = vertexCount + 4\r
-    point2Vertex(edgeCount + 4) = vertexCount + 1\r
-    col(edgeCount + 4) = 14\r
-\r
-    ' Update the counters for the next square\r
-    vertexCount = vertexCount + 4\r
-    edgeCount = edgeCount + 4\r
-\r
-END SUB\r
-\r
-SUB start\r
-\r
-    ' Initialize the screen and clear it\r
-    SCREEN 12\r
-    CLS\r
-\r
-    ' Set the initial color of all shapes\r
-    FOR a = 1 TO 4000\r
-        col(a) = 15\r
-    NEXT a\r
-\r
-    ' Initialize counters for vertices and edges\r
-    vertexCount = 0\r
-    edgeCount = 0\r
-\r
-    ' Generate the initial set of shapes\r
-    getCornerVertices\r
-\r
-END SUB\r
diff --git a/Graphics/3D/3D game of life/3d life.bas b/Graphics/3D/3D game of life/3d life.bas
new file mode 100755 (executable)
index 0000000..e7f8bef
--- /dev/null
@@ -0,0 +1,360 @@
+' Program renders rotating 3D animation from cubes.
+' Cubes appear and disappear according to Conway's Game of Life rules.
+'
+' By Svjatoslav Agejenko.
+' Email: svjatoslav@svjatoslav.eu
+' Homepage: http://www.svjatoslav.eu
+'
+' Changelog:
+' ?, Initial version
+' 2024, Improved program readability using AI
+
+DECLARE SUB PlaceCube (x!, y!, z!)
+DECLARE SUB DrawCube (x!, y!, z!)
+
+DECLARE SUB CreateCollisionData ()
+DECLARE SUB UpdateCollisionData ()
+DECLARE SUB RenderScene ()
+DECLARE SUB InitializeEnvironment ()
+DECLARE SUB StartGame ()
+
+DIM SHARED numPoints, numLines, pointCount, lineCount
+DIM SHARED pointsX(1 TO 3000), pointsY(1 TO 3000), pointsZ(1 TO 3000)
+DIM SHARED renderedPointsX(1 TO 7000), renderedPointsY(1 TO 7000)
+DIM SHARED originalRenderedPointsX(0 TO 9000), originalRenderedPointsY(0 TO 9000)
+DIM SHARED oldPointCount, oldLineCount
+DIM SHARED lineVertices1(1 TO 3800), lineVertices2(1 TO 3800), lineColors(1 TO 3800)
+DIM SHARED originalLineVertices1(1 TO 3800), originalLineVertices2(1 TO 3800)
+DIM SHARED myPositionX, myPositionY, myPositionZ
+DIM SHARED myPreviousPositionX, myPreviousPositionY, myPreviousPositionZ
+DIM SHARED angle1, angle2
+DIM SHARED angle1Str, angle2Str
+DIM SHARED frameCount
+
+DIM SHARED gameOfLifeGrid(1 TO 50, 1 TO 50)
+DIM SHARED nextGameOfLifeGrid(1 TO 50, 1 TO 50)
+
+StartGame
+
+angle1 = 1.5
+10
+frameCount = frameCount + 1
+
+CreateCollisionData
+RenderScene
+
+myPositionX = SIN(frameCount / 20) * 12
+myPositionY = SIN(frameCount / 50) * 10 + 15
+myPositionZ = COS(frameCount / 20) * 12
+
+angle1 = angle1 - .05
+angle2 = 2.2 + SIN(frameCount / 50) / 2
+
+inputKey$ = INKEY$
+IF inputKey$ <> "" THEN SYSTEM
+GOTO 10
+
+SUB CreateCollisionData
+pointCount = numPoints
+lineCount = numLines
+
+FOR y = 1 TO 50
+  FOR x = 1 TO 50
+    IF gameOfLifeGrid(x, y) = 1 THEN
+       v = ABS(x - 26) + ABS(y - 26) + frameCount
+       PlaceCube x - 25, SIN(v / 5) * 5, y - 25
+    END IF
+ NEXT x
+NEXT y
+
+IF frameCount \ 10 = frameCount / 10 THEN
+
+FOR y = 2 TO 49
+FOR x = 2 TO 49
+c = gameOfLifeGrid(x - 1, y - 1)
+c = c + gameOfLifeGrid(x, y - 1)
+c = c + gameOfLifeGrid(x + 1, y - 1)
+c = c + gameOfLifeGrid(x - 1, y)
+c = c + gameOfLifeGrid(x + 1, y)
+c = c + gameOfLifeGrid(x - 1, y + 1)
+c = c + gameOfLifeGrid(x, y + 1)
+c = c + gameOfLifeGrid(x + 1, y + 1)
+
+IF gameOfLifeGrid(x, y) = 1 THEN
+  IF (c > 3) OR (c < 2) THEN nextGameOfLifeGrid(x, y) = 0 ELSE nextGameOfLifeGrid(x, y) = 1
+ELSE
+  IF c = 3 THEN nextGameOfLifeGrid(x, y) = 1 ELSE nextGameOfLifeGrid(x, y) = 0
+END IF
+NEXT x
+NEXT y
+
+FOR y = 1 TO 50
+FOR x = 1 TO 50
+  gameOfLifeGrid(x, y) = nextGameOfLifeGrid(x, y)
+NEXT x
+NEXT y
+END IF
+
+END SUB
+
+SUB InitializeEnvironment
+FOR z = -5 TO 5
+FOR x = -5 TO 5
+pointCount = pointCount + 1
+pointsX(pointCount) = x
+pointsY(pointCount) = 0
+pointsZ(pointCount) = z
+IF x > -5 THEN
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount
+lineVertices2(lineCount) = pointCount - 1
+lineColors(lineCount) = 1
+END IF
+IF z > -5 THEN
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount
+lineVertices2(lineCount) = pointCount - 10
+lineColors(lineCount) = 1
+END IF
+NEXT x
+NEXT z
+
+numPoints = pointCount
+numLines = lineCount
+
+END SUB
+
+SUB InitializeEnvironment1
+pointCount = 1
+pointsX(pointCount) = -2
+pointsY(pointCount) = 0
+pointsZ(pointCount) = 0
+pointCount = pointCount + 1
+pointsX(pointCount) = 2
+pointsY(pointCount) = 0
+pointsZ(pointCount) = 0
+
+lineCount = 1
+lineVertices1(lineCount) = 1
+lineVertices2(lineCount) = 2
+lineColors(lineCount) = 14
+
+END SUB
+
+SUB PlaceCube (x, y, z)
+
+v = 3
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 1
+lineVertices2(lineCount) = pointCount + 2
+lineColors(lineCount) = v
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 2
+lineVertices2(lineCount) = pointCount + 3
+lineColors(lineCount) = v
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 3
+lineVertices2(lineCount) = pointCount + 4
+lineColors(lineCount) = v
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 4
+lineVertices2(lineCount) = pointCount + 1
+lineColors(lineCount) = v
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 5
+lineVertices2(lineCount) = pointCount + 6
+lineColors(lineCount) = v
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 6
+lineVertices2(lineCount) = pointCount + 7
+lineColors(lineCount) = v
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 7
+lineVertices2(lineCount) = pointCount + 8
+lineColors(lineCount) = v
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 8
+lineVertices2(lineCount) = pointCount + 5
+lineColors(lineCount) = v
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 1
+lineVertices2(lineCount) = pointCount + 5
+lineColors(lineCount) = v
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 2
+lineVertices2(lineCount) = pointCount + 6
+lineColors(lineCount) = v
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 3
+lineVertices2(lineCount) = pointCount + 7
+lineColors(lineCount) = v
+
+lineCount = lineCount + 1
+lineVertices1(lineCount) = pointCount + 4
+lineVertices2(lineCount) = pointCount + 8
+lineColors(lineCount) = v
+
+pointCount = pointCount + 1
+pointsX(pointCount) = x - .5
+pointsY(pointCount) = y
+pointsZ(pointCount) = z - .5
+
+pointCount = pointCount + 1
+pointsX(pointCount) = x + .5
+pointsY(pointCount) = y
+pointsZ(pointCount) = z - .5
+
+pointCount = pointCount + 1
+pointsX(pointCount) = x + .5
+pointsY(pointCount) = y
+pointsZ(pointCount) = z + .5
+
+pointCount = pointCount + 1
+pointsX(pointCount) = x - .5
+pointsY(pointCount) = y
+pointsZ(pointCount) = z + .5
+
+pointCount = pointCount + 1
+pointsX(pointCount) = x - .5
+pointsY(pointCount) = y + 1
+pointsZ(pointCount) = z - .5
+
+pointCount = pointCount + 1
+pointsX(pointCount) = x + .5
+pointsY(pointCount) = y + 1
+pointsZ(pointCount) = z - .5
+
+pointCount = pointCount + 1
+pointsX(pointCount) = x + .5
+pointsY(pointCount) = y + 1
+pointsZ(pointCount) = z + .5
+
+pointCount = pointCount + 1
+pointsX(pointCount) = x - .5
+pointsY(pointCount) = y + 1
+pointsZ(pointCount) = z + .5
+
+END SUB
+
+SUB RenderScene
+
+sineAngle1 = SIN(angle1)
+cosineAngle1 = COS(angle1)
+sineAngle2 = SIN(angle2)
+cosineAngle2 = COS(angle2)
+
+FOR a = 1 TO pointCount
+x = pointsX(a) + myPositionX
+y = pointsY(a) - myPositionY
+z = pointsZ(a) + myPositionZ
+
+x1 = x * sineAngle1 - z * cosineAngle1
+z1 = x * cosineAngle1 + z * sineAngle1
+y1 = y * sineAngle2 - z1 * cosineAngle2
+z2 = y * cosineAngle2 + z1 * sineAngle2
+
+IF z2 < .5 THEN
+renderedPointsX(a) = -1
+ELSE
+renderedPointsX(a) = 320 + (x1 / z2 * 400)
+renderedPointsY(a) = 240 - (y1 / z2 * 400)
+END IF
+NEXT a
+
+FOR a = 1 TO lineCount
+l1 = originalLineVertices1(a)
+l2 = originalLineVertices2(a)
+
+IF originalRenderedPointsX(l1) = -1 OR originalRenderedPointsX(l2) = -1 THEN
+ELSE
+LINE (originalRenderedPointsX(l1), originalRenderedPointsY(l1))-(originalRenderedPointsX(l2), originalRenderedPointsY(l2)), 0
+END IF
+
+l1 = lineVertices1(a)
+l2 = lineVertices2(a)
+IF renderedPointsX(l1) = -1 OR renderedPointsX(l2) = -1 THEN
+ELSE
+LINE (renderedPointsX(l1), renderedPointsY(l1))-(renderedPointsX(l2), renderedPointsY(l2)), lineColors(a)
+END IF
+NEXT a
+
+IF lineCount < oldLineCount THEN
+FOR a = lineCount + 1 TO oldLineCount
+l1 = originalLineVertices1(a)
+l2 = originalLineVertices2(a)
+IF originalRenderedPointsX(l1) = -1 OR originalRenderedPointsX(l2) = -1 THEN
+ELSE
+LINE (originalRenderedPointsX(l1), originalRenderedPointsY(l1))-(originalRenderedPointsX(l2), originalRenderedPointsY(l2)), 0
+END IF
+NEXT a
+END IF
+
+FOR a = 1 TO pointCount
+originalRenderedPointsX(a) = renderedPointsX(a)
+originalRenderedPointsY(a) = renderedPointsY(a)
+NEXT a
+
+oldPointCount = pointCount
+
+FOR a = 1 TO lineCount
+originalLineVertices1(a) = lineVertices1(a)
+originalLineVertices2(a) = lineVertices2(a)
+NEXT a
+
+oldLineCount = lineCount
+
+END SUB
+
+SUB StartGame
+SCREEN 12
+numPoints = 0
+numLines = 0
+pointCount = numPoints
+lineCount = numLines
+gridSize = 50
+
+myPositionX = 4
+myPositionY = 15
+myPositionZ = 17
+angle1 = ATN(1) / 2 - .29
+angle2 = angle1 + 1
+
+FOR a = 1 TO 1000
+lineColors(a) = 4
+NEXT a
+
+FOR a = 1 TO 1000
+originalLineVertices1(a) = 1
+originalLineVertices2(a) = 1
+NEXT a
+
+OPEN "3dlife.dat" FOR INPUT AS #1
+y = 20
+20
+IF EOF(1) <> 0 THEN GOTO 30
+x = 20
+
+LINE INPUT #1, inputLine$
+FOR b = 1 TO LEN(inputLine$)
+  c$ = RIGHT$(LEFT$(inputLine$, b), 1)
+  IF c$ = "#" THEN gameOfLifeGrid(x, y) = 1
+  x = x + 1
+NEXT b
+
+y = y + 1
+GOTO 20
+30
+CLOSE #1
+
+END SUB
diff --git a/Graphics/3D/3D game of life/3dlife.dat b/Graphics/3D/3D game of life/3dlife.dat
new file mode 100644 (file)
index 0000000..17b0e10
--- /dev/null
@@ -0,0 +1,13 @@
+.....#.#.....\r
+...##...##...\r
+..#.......#..\r
+.#..##.##..#.\r
+.#.#.....#.#.\r
+#..#.###.#..#\r
+.....#.#.....\r
+#..#.###.#..#\r
+.#.#.....#.#.\r
+.#..##.##..#.\r
+..#.......#..\r
+...##...##...\r
+.....#.#.....\r
diff --git a/Graphics/3D/3D text.bas b/Graphics/3D/3D text.bas
new file mode 100755 (executable)
index 0000000..945be4f
--- /dev/null
@@ -0,0 +1,567 @@
+' Renders 3D text within 3D room.\r
+' User can freely fly around the room and observe the text from different angles.\r
+'\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2003, Initial version\r
+' 2024, Improved program readability using AI\r
+'\r
+' Keyboard controls:\r
+'   cursor keys and to z, w - rotate\r
+'   <SPACE> - slow down\r
+'   q and <ESC> - quit program\r
+'   + / - - move up / down\r
+\r
+\r
+\r
+DECLARE SUB prn (x!, y!, a$)\r
+DECLARE SUB pch (x!, y!, a$)\r
+DECLARE SUB readfnt ()\r
+DECLARE SUB ruut2 (x!, y!, z!, s!)\r
+DECLARE SUB ruut (x!, y!, z!, s!)\r
+DECLARE SUB kuus (x, y, z, s)\r
+DECLARE SUB porand ()\r
+DECLARE SUB addp (x, y, z)\r
+\r
+DECLARE SUB start ()\r
+DECLARE SUB addsq (x1%, y1%, z1%)\r
+DECLARE SUB getcor ()\r
+DECLARE SUB mulcor ()\r
+DECLARE SUB nait3d ()\r
+DECLARE SUB calcsin ()\r
+DIM SHARED xn(4000), yn(4000), zn(4000)\r
+DIM SHARED x(4000), y(4000), z(4000)\r
+\r
+DIM SHARED xo(4000), yo(4000), zo(4000)\r
+DIM SHARED point1(4000), point2(4000)\r
+DIM SHARED col(4000)\r
+DIM SHARED nump, numl\r
+DIM SHARED myx, myy, myz, mye, myk\r
+DIM SHARED tpx(0 TO 10, 0 TO 255)\r
+DIM SHARED tpy(0 TO 10, 0 TO 255)\r
+DIM SHARED tl1(0 TO 10, 0 TO 255)\r
+DIM SHARED tl2(0 TO 10, 0 TO 255)\r
+\r
+myx = 0\r
+myy = 0\r
+myz = -100\r
+\r
+start\r
+\r
+nait3d\r
+\r
+SUB getcor\r
+\r
+' Define the corners of a cube\r
+xn(nump + 1) = -150\r
+yn(nump + 1) = -125\r
+zn(nump + 1) = -200\r
+\r
+xn(nump + 2) = 150\r
+yn(nump + 2) = -125\r
+zn(nump + 2) = -200\r
+\r
+xn(nump + 3) = 150\r
+yn(nump + 3) = 125\r
+zn(nump + 3) = -200\r
+\r
+xn(nump + 4) = -150\r
+yn(nump + 4) = 125\r
+zn(nump + 4) = -200\r
+\r
+xn(nump + 5) = -150\r
+yn(nump + 5) = -125\r
+zn(nump + 5) = 200\r
+\r
+xn(nump + 6) = 150\r
+yn(nump + 6) = -125\r
+zn(nump + 6) = 200\r
+\r
+xn(nump + 7) = 150\r
+yn(nump + 7) = 125\r
+zn(nump + 7) = 200\r
+\r
+xn(nump + 8) = -150\r
+yn(nump + 8) = 125\r
+zn(nump + 8) = 200\r
+\r
+' Define the lines connecting the corners\r
+point1(numl + 1) = nump + 1\r
+point2(numl + 1) = nump + 2\r
+\r
+point1(numl + 2) = nump + 2\r
+point2(numl + 2) = nump + 3\r
+\r
+point1(numl + 3) = nump + 3\r
+point2(numl + 3) = nump + 4\r
+\r
+point1(numl + 4) = nump + 4\r
+point2(numl + 4) = nump + 1\r
+\r
+point1(numl + 5) = nump + 5\r
+point2(numl + 5) = nump + 6\r
+\r
+point1(numl + 6) = nump + 6\r
+point2(numl + 6) = nump + 7\r
+\r
+point1(numl + 7) = nump + 7\r
+point2(numl + 7) = nump + 8\r
+\r
+point1(numl + 8) = nump + 8\r
+point2(numl + 8) = nump + 5\r
+\r
+point1(numl + 9) = nump + 5\r
+point2(numl + 9) = nump + 1\r
+\r
+point1(numl + 10) = nump + 6\r
+point2(numl + 10) = nump + 2\r
+\r
+point1(numl + 11) = nump + 7\r
+point2(numl + 11) = nump + 3\r
+\r
+point1(numl + 12) = nump + 8\r
+point2(numl + 12) = nump + 4\r
+\r
+nump = nump + 8\r
+numl = numl + 12\r
+\r
+' Define the corners of rectangle\r
+xn(nump + 1) = -150\r
+yn(nump + 1) = -125 + 201\r
+zn(nump + 1) = 0\r
+\r
+xn(nump + 2) = -150\r
+yn(nump + 2) = -125 + 201\r
+zn(nump + 2) = 89\r
+\r
+xn(nump + 3) = -150\r
+yn(nump + 3) = -125\r
+zn(nump + 3) = 89\r
+\r
+xn(nump + 4) = -150\r
+yn(nump + 4) = -125\r
+zn(nump + 4) = 0\r
+\r
+' Define the lines connecting these corners\r
+point1(numl + 1) = nump + 1\r
+point2(numl + 1) = nump + 2\r
+\r
+point1(numl + 2) = nump + 2\r
+point2(numl + 2) = nump + 3\r
+\r
+point1(numl + 3) = nump + 3\r
+point2(numl + 3) = nump + 4\r
+\r
+point1(numl + 4) = nump + 4\r
+point2(numl + 4) = nump + 1\r
+\r
+nump = nump + 4\r
+numl = numl + 4\r
+\r
+prn 0, 0, "three dimensional "\r
+prn 0, -3, "text example"\r
+prn 0, -6, "etc etc etc"\r
+\r
+END SUB\r
+\r
+SUB kuus (x, y, z, s)\r
+\r
+' Initialize variables\r
+b = 0\r
+f = .3925\r
+\r
+' Loop to create points of the octagon\r
+FOR a = 0 + f TO 6 + f STEP 6.28 / 8\r
+    x1 = SIN(a) * s\r
+    y1 = COS(a) * s\r
+    b = b + 1\r
+\r
+    ' Store the points in the shared arrays\r
+    xn(nump + b) = x1 + x\r
+    yn(nump + b) = y\r
+    zn(nump + b) = y1 + z\r
+NEXT a\r
+\r
+' Define the lines connecting these points\r
+point1(numl + 1) = nump + 1\r
+point2(numl + 1) = nump + 2\r
+col(numl + 1) = 12\r
+\r
+point1(numl + 2) = nump + 2\r
+point2(numl + 2) = nump + 3\r
+col(numl + 2) = 12\r
+\r
+point1(numl + 3) = nump + 3\r
+point2(numl + 3) = nump + 4\r
+col(numl + 3) = 12\r
+\r
+point1(numl + 4) = nump + 4\r
+point2(numl + 4) = nump + 5\r
+col(numl + 4) = 12\r
+\r
+point1(numl + 5) = nump + 5\r
+point2(numl + 5) = nump + 6\r
+col(numl + 5) = 12\r
+\r
+point1(numl + 6) = nump + 6\r
+point2(numl + 6) = nump + 7\r
+col(numl + 6) = 12\r
+\r
+point1(numl + 7) = nump + 7\r
+point2(numl + 7) = nump + 8\r
+col(numl + 7) = 12\r
+\r
+point1(numl + 8) = nump + 8\r
+point2(numl + 8) = nump + 1\r
+col(numl + 8) = 12\r
+\r
+nump = nump + b\r
+numl = numl + 8\r
+\r
+'LOCATE 1, 1\r
+'PRINT b\r
+\r
+END SUB\r
+\r
+SUB nait3d\r
+\r
+' Main loop for the 3D rendering\r
+1\r
+\r
+myx = myx + SIN(deg1) * mye\r
+myz = myz + COS(deg1) * mye\r
+\r
+myx = myx + COS(deg1) * myk\r
+myz = myz - SIN(deg1) * myk\r
+\r
+deg1 = deg1 + d1\r
+Deg2 = Deg2 + d2\r
+\r
+C1 = COS(deg1): S1 = SIN(deg1)\r
+C2 = COS(Deg2): S2 = SIN(Deg2)\r
+\r
+' Transform the coordinates\r
+FOR a = 1 TO nump\r
+    xo = xn(a) - myx\r
+    yo = -yn(a) - myy\r
+    zo = zn(a) - myz\r
+\r
+    x1 = (xo * C1 - zo * S1)\r
+    z1 = (xo * S1 + zo * C1)\r
+\r
+    y1 = (yo * C2 - z1 * S2)\r
+    z2 = (yo * S2 + z1 * C2)\r
+\r
+    ' Store the transformed coordinates\r
+    xo(a) = x(a)\r
+    yo(a) = y(a)\r
+\r
+    ' Check if the point is within the view\r
+    IF z2 < 20 THEN\r
+        x(a) = -1\r
+    ELSE\r
+        ' Apply perspective transformation\r
+        x(a) = 320 + (x1 / z2 * 500)\r
+        y(a) = 240 + (y1 / z2 * 500)\r
+    END IF\r
+NEXT\r
+\r
+' Draw the lines\r
+FOR a = 1 TO numl\r
+    p1 = point1(a)\r
+    p2 = point2(a)\r
+\r
+    ' Check if the points are within the view\r
+    IF xo(p1) = -1 OR xo(p2) = -1 THEN\r
+        ' Do nothing\r
+    ELSE\r
+        ' erase line at old coordinates\r
+        LINE (xo(p1), yo(p1))-(xo(p2), yo(p2)), 0\r
+    END IF\r
+\r
+    IF x(p1) = -1 OR x(p2) = -1 THEN\r
+        ' Do nothing\r
+    ELSE\r
+        ' draw line at new coordinates\r
+        LINE (x(p1), y(p1))-(x(p2), y(p2)), col(a)\r
+    END IF\r
+NEXT\r
+\r
+' Handle user input\r
+K$ = INKEY$\r
+IF K$ <> "" THEN\r
+\r
+    SELECT CASE K$\r
+\r
+        CASE CHR$(0) + "P"\r
+            mye = mye - 1\r
+\r
+        CASE CHR$(0) + "H"\r
+            mye = mye + 1\r
+\r
+        CASE CHR$(0) + "M"\r
+            myk = myk + 1\r
+\r
+        CASE CHR$(0) + "K"\r
+            myk = myk - 1\r
+\r
+        CASE "+"\r
+            myy = myy + 3\r
+\r
+        CASE "-"\r
+            myy = myy - 3\r
+\r
+        CASE "6"\r
+            d1 = d1 + .01\r
+\r
+        CASE "4"\r
+            d1 = d1 - .01\r
+\r
+        CASE "8"\r
+            d2 = d2 - .01\r
+\r
+        CASE "2"\r
+            d2 = d2 + .01\r
+\r
+        CASE " "\r
+            d1 = d1 / 2\r
+            d2 = d2 / 2\r
+            d3 = d3 / 2\r
+            mye = mye / 2\r
+            myk = myk / 2\r
+\r
+        CASE "q"\r
+            SYSTEM\r
+\r
+        CASE CHR$(27)\r
+            SYSTEM\r
+\r
+    END SELECT\r
+END IF\r
+\r
+GOTO 1\r
+\r
+END SUB\r
+\r
+SUB pch (x, y, a$)\r
+\r
+' Initialize variables\r
+b = ASC(a$)\r
+up = 0\r
+ul = 0\r
+\r
+' Loop to create points for the character\r
+FOR c = 0 TO 100\r
+    IF tpx(c, b) = 999 THEN GOTO 4\r
+    up = up + 1\r
+    xn(nump + up) = x + tpx(c, b)\r
+    yn(nump + up) = y - tpy(c, b)\r
+    zn(nump + up) = 0\r
+NEXT c\r
+4\r
+\r
+' Loop to define the lines for the character\r
+FOR c = 0 TO 100\r
+    IF tl1(c, b) = 999 THEN GOTO 5\r
+    ul = ul + 1\r
+    point1(numl + ul) = tl1(c, b) + nump + 1\r
+    point2(numl + ul) = tl2(c, b) + nump + 1\r
+    col(numl + ul) = 4\r
+NEXT c\r
+5\r
+\r
+' Update the counters\r
+nump = nump + up\r
+numl = numl + ul\r
+\r
+END SUB\r
+\r
+SUB porand\r
+' do floor of the 3D room\r
+\r
+' Loop to create floor tiles made of hexagons and squares\r
+FOR x = -100 TO 0 STEP 12.067 + .3\r
+    FOR z = -100 TO 0 STEP 12.067 + .3\r
+        kuus x, -125, z, 6.53\r
+        ruut x + 6.033 + .15, -125, z + 6.033 + .15, 3.111 + .3\r
+    NEXT z\r
+NEXT x\r
+\r
+' Loop to create squares\r
+FOR y = -100 TO 0 STEP 20.3\r
+    FOR x = -100 TO 0 STEP 20.3\r
+        ruut2 x, y, 200, 10\r
+    NEXT x\r
+NEXT y\r
+\r
+END SUB\r
+\r
+SUB prn (x, y, a$)\r
+\r
+' Loop to print each character\r
+FOR b = 1 TO LEN(a$)\r
+    c$ = RIGHT$(LEFT$(a$, b), 1)\r
+    pch x + b * 3, y, c$\r
+NEXT b\r
+\r
+END SUB\r
+\r
+SUB readfnt\r
+\r
+' Open the font file\r
+OPEN "font.dat" FOR INPUT AS #1\r
+\r
+' Loop to read the font data\r
+3\r
+IF EOF(1) <> 0 THEN GOTO 2\r
+LINE INPUT #1, a$\r
+\r
+IF LEFT$(a$, 1) = "#" THEN\r
+  chr = ASC(RIGHT$(LEFT$(a$, 3), 1))\r
+\r
+  ' Initialize counters\r
+  pp = 0\r
+  lp = 0\r
+END IF\r
+\r
+' read the points for the character\r
+IF LEFT$(a$, 1) = "p" THEN\r
+    tpx(pp, chr) = VAL(RIGHT$(LEFT$(a$, 3), 1))\r
+    tpy(pp, chr) = VAL(RIGHT$(LEFT$(a$, 5), 1))\r
+    pp = pp + 1\r
+END IF\r
+\r
+' read the lines for the character\r
+IF LEFT$(a$, 1) = "l" THEN\r
+    tl1(lp, chr) = VAL(RIGHT$(LEFT$(a$, 3), 1))\r
+    tl2(lp, chr) = VAL(RIGHT$(LEFT$(a$, 5), 1))\r
+    lp = lp + 1\r
+END IF\r
+\r
+GOTO 3\r
+\r
+' Close the font file\r
+2\r
+CLOSE #1\r
+\r
+END SUB\r
+\r
+SUB ruut (x, y, z, s)\r
+\r
+' Define the corners of the rectangle\r
+xn(nump + 1) = x\r
+yn(nump + 1) = y\r
+zn(nump + 1) = z + s\r
+\r
+xn(nump + 2) = x + s\r
+yn(nump + 2) = y\r
+zn(nump + 2) = z\r
+\r
+xn(nump + 3) = x\r
+yn(nump + 3) = y\r
+zn(nump + 3) = z - s\r
+\r
+xn(nump + 4) = x - s\r
+yn(nump + 4) = y\r
+zn(nump + 4) = z\r
+\r
+' Define the lines connecting these corners\r
+point1(numl + 1) = nump + 1\r
+point2(numl + 1) = nump + 2\r
+col(numl + 1) = 10\r
+\r
+point1(numl + 2) = nump + 2\r
+point2(numl + 2) = nump + 3\r
+col(numl + 2) = 10\r
+\r
+point1(numl + 3) = nump + 3\r
+point2(numl + 3) = nump + 4\r
+col(numl + 3) = 10\r
+\r
+point1(numl + 4) = nump + 4\r
+point2(numl + 4) = nump + 1\r
+col(numl + 4) = 10\r
+\r
+' Update the counters\r
+nump = nump + 4\r
+numl = numl + 4\r
+\r
+END SUB\r
+\r
+SUB ruut2 (x, y, z, s)\r
+\r
+' Define the corners of the rectangle\r
+xn(nump + 1) = x - s\r
+yn(nump + 1) = y - s\r
+zn(nump + 1) = z\r
+\r
+xn(nump + 2) = x + s\r
+yn(nump + 2) = y - s\r
+zn(nump + 2) = z\r
+\r
+xn(nump + 3) = x + s\r
+yn(nump + 3) = y + s\r
+zn(nump + 3) = z\r
+\r
+xn(nump + 4) = x - s\r
+yn(nump + 4) = y + s\r
+zn(nump + 4) = z\r
+\r
+' Define the lines connecting these corners\r
+point1(numl + 1) = nump + 1\r
+point2(numl + 1) = nump + 2\r
+col(numl + 1) = 14\r
+\r
+point1(numl + 2) = nump + 2\r
+point2(numl + 2) = nump + 3\r
+col(numl + 2) = 14\r
+\r
+point1(numl + 3) = nump + 3\r
+point2(numl + 3) = nump + 4\r
+col(numl + 3) = 14\r
+\r
+point1(numl + 4) = nump + 4\r
+point2(numl + 4) = nump + 1\r
+col(numl + 4) = 14\r
+\r
+' Update the counters\r
+nump = nump + 4\r
+numl = numl + 4\r
+\r
+END SUB\r
+\r
+SUB start\r
+\r
+' Initialize the screen and clear it\r
+SCREEN 12\r
+CLS\r
+\r
+' Set the default color for all points\r
+FOR a = 1 TO 4000\r
+    col(a) = 15\r
+NEXT a\r
+\r
+' Initialize counters\r
+nump = 0\r
+numl = 0\r
+\r
+' Initialize font data\r
+FOR a = 0 TO 255\r
+    FOR b = 0 TO 10\r
+        tpx(b, a) = 999\r
+        tpy(b, a) = 999\r
+        tl1(b, a) = 999\r
+        tl2(b, a) = 999\r
+    NEXT b\r
+NEXT a\r
+\r
+' Read the font data\r
+readfnt\r
+\r
+' Define the corners of the cubes\r
+getcor\r
+\r
+END SUB\r
diff --git a/Graphics/3D/3dlife.bas b/Graphics/3D/3dlife.bas
deleted file mode 100755 (executable)
index 274a345..0000000
+++ /dev/null
@@ -1,352 +0,0 @@
-' Program renders rotating 3D animation from cubes.
-' Cubes appear and disappear according to Conway's Game of Life rules.
-
-DECLARE SUB PlaceCube (x!, y!, z!)
-DECLARE SUB DrawCube (x!, y!, z!)
-
-DECLARE SUB CreateCollisionData ()
-DECLARE SUB UpdateCollisionData ()
-DECLARE SUB RenderScene ()
-DECLARE SUB InitializeEnvironment ()
-DECLARE SUB StartGame ()
-
-DIM SHARED numPoints, numLines, pointCount, lineCount
-DIM SHARED pointsX(1 TO 3000), pointsY(1 TO 3000), pointsZ(1 TO 3000)
-DIM SHARED renderedPointsX(1 TO 7000), renderedPointsY(1 TO 7000)
-DIM SHARED originalRenderedPointsX(0 TO 9000), originalRenderedPointsY(0 TO 9000)
-DIM SHARED oldPointCount, oldLineCount
-DIM SHARED lineVertices1(1 TO 3800), lineVertices2(1 TO 3800), lineColors(1 TO 3800)
-DIM SHARED originalLineVertices1(1 TO 3800), originalLineVertices2(1 TO 3800)
-DIM SHARED myPositionX, myPositionY, myPositionZ
-DIM SHARED myPreviousPositionX, myPreviousPositionY, myPreviousPositionZ
-DIM SHARED angle1, angle2
-DIM SHARED angle1Str, angle2Str
-DIM SHARED frameCount
-
-DIM SHARED gameOfLifeGrid(1 TO 50, 1 TO 50)
-DIM SHARED nextGameOfLifeGrid(1 TO 50, 1 TO 50)
-
-StartGame
-
-angle1 = 1.5
-10
-frameCount = frameCount + 1
-
-CreateCollisionData
-RenderScene
-
-myPositionX = SIN(frameCount / 20) * 12
-myPositionY = SIN(frameCount / 50) * 10 + 15
-myPositionZ = COS(frameCount / 20) * 12
-
-angle1 = angle1 - .05
-angle2 = 2.2 + SIN(frameCount / 50) / 2
-
-inputKey$ = INKEY$
-IF inputKey$ <> "" THEN SYSTEM
-GOTO 10
-
-SUB CreateCollisionData
-pointCount = numPoints
-lineCount = numLines
-
-FOR y = 1 TO 50
-  FOR x = 1 TO 50
-    IF gameOfLifeGrid(x, y) = 1 THEN
-       v = ABS(x - 26) + ABS(y - 26) + frameCount
-       PlaceCube x - 25, SIN(v / 5) * 5, y - 25
-    END IF
- NEXT x
-NEXT y
-
-IF frameCount \ 10 = frameCount / 10 THEN
-
-FOR y = 2 TO 49
-FOR x = 2 TO 49
-c = gameOfLifeGrid(x - 1, y - 1)
-c = c + gameOfLifeGrid(x, y - 1)
-c = c + gameOfLifeGrid(x + 1, y - 1)
-c = c + gameOfLifeGrid(x - 1, y)
-c = c + gameOfLifeGrid(x + 1, y)
-c = c + gameOfLifeGrid(x - 1, y + 1)
-c = c + gameOfLifeGrid(x, y + 1)
-c = c + gameOfLifeGrid(x + 1, y + 1)
-
-IF gameOfLifeGrid(x, y) = 1 THEN
-  IF (c > 3) OR (c < 2) THEN nextGameOfLifeGrid(x, y) = 0 ELSE nextGameOfLifeGrid(x, y) = 1
-ELSE
-  IF c = 3 THEN nextGameOfLifeGrid(x, y) = 1 ELSE nextGameOfLifeGrid(x, y) = 0
-END IF
-NEXT x
-NEXT y
-
-FOR y = 1 TO 50
-FOR x = 1 TO 50
-  gameOfLifeGrid(x, y) = nextGameOfLifeGrid(x, y)
-NEXT x
-NEXT y
-END IF
-
-END SUB
-
-SUB InitializeEnvironment
-FOR z = -5 TO 5
-FOR x = -5 TO 5
-pointCount = pointCount + 1
-pointsX(pointCount) = x
-pointsY(pointCount) = 0
-pointsZ(pointCount) = z
-IF x > -5 THEN
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount
-lineVertices2(lineCount) = pointCount - 1
-lineColors(lineCount) = 1
-END IF
-IF z > -5 THEN
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount
-lineVertices2(lineCount) = pointCount - 10
-lineColors(lineCount) = 1
-END IF
-NEXT x
-NEXT z
-
-numPoints = pointCount
-numLines = lineCount
-
-END SUB
-
-SUB InitializeEnvironment1
-pointCount = 1
-pointsX(pointCount) = -2
-pointsY(pointCount) = 0
-pointsZ(pointCount) = 0
-pointCount = pointCount + 1
-pointsX(pointCount) = 2
-pointsY(pointCount) = 0
-pointsZ(pointCount) = 0
-
-lineCount = 1
-lineVertices1(lineCount) = 1
-lineVertices2(lineCount) = 2
-lineColors(lineCount) = 14
-
-END SUB
-
-SUB PlaceCube (x, y, z)
-
-v = 3
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 1
-lineVertices2(lineCount) = pointCount + 2
-lineColors(lineCount) = v
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 2
-lineVertices2(lineCount) = pointCount + 3
-lineColors(lineCount) = v
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 3
-lineVertices2(lineCount) = pointCount + 4
-lineColors(lineCount) = v
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 4
-lineVertices2(lineCount) = pointCount + 1
-lineColors(lineCount) = v
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 5
-lineVertices2(lineCount) = pointCount + 6
-lineColors(lineCount) = v
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 6
-lineVertices2(lineCount) = pointCount + 7
-lineColors(lineCount) = v
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 7
-lineVertices2(lineCount) = pointCount + 8
-lineColors(lineCount) = v
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 8
-lineVertices2(lineCount) = pointCount + 5
-lineColors(lineCount) = v
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 1
-lineVertices2(lineCount) = pointCount + 5
-lineColors(lineCount) = v
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 2
-lineVertices2(lineCount) = pointCount + 6
-lineColors(lineCount) = v
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 3
-lineVertices2(lineCount) = pointCount + 7
-lineColors(lineCount) = v
-
-lineCount = lineCount + 1
-lineVertices1(lineCount) = pointCount + 4
-lineVertices2(lineCount) = pointCount + 8
-lineColors(lineCount) = v
-
-pointCount = pointCount + 1
-pointsX(pointCount) = x - .5
-pointsY(pointCount) = y
-pointsZ(pointCount) = z - .5
-
-pointCount = pointCount + 1
-pointsX(pointCount) = x + .5
-pointsY(pointCount) = y
-pointsZ(pointCount) = z - .5
-
-pointCount = pointCount + 1
-pointsX(pointCount) = x + .5
-pointsY(pointCount) = y
-pointsZ(pointCount) = z + .5
-
-pointCount = pointCount + 1
-pointsX(pointCount) = x - .5
-pointsY(pointCount) = y
-pointsZ(pointCount) = z + .5
-
-pointCount = pointCount + 1
-pointsX(pointCount) = x - .5
-pointsY(pointCount) = y + 1
-pointsZ(pointCount) = z - .5
-
-pointCount = pointCount + 1
-pointsX(pointCount) = x + .5
-pointsY(pointCount) = y + 1
-pointsZ(pointCount) = z - .5
-
-pointCount = pointCount + 1
-pointsX(pointCount) = x + .5
-pointsY(pointCount) = y + 1
-pointsZ(pointCount) = z + .5
-
-pointCount = pointCount + 1
-pointsX(pointCount) = x - .5
-pointsY(pointCount) = y + 1
-pointsZ(pointCount) = z + .5
-
-END SUB
-
-SUB RenderScene
-
-sineAngle1 = SIN(angle1)
-cosineAngle1 = COS(angle1)
-sineAngle2 = SIN(angle2)
-cosineAngle2 = COS(angle2)
-
-FOR a = 1 TO pointCount
-x = pointsX(a) + myPositionX
-y = pointsY(a) - myPositionY
-z = pointsZ(a) + myPositionZ
-
-x1 = x * sineAngle1 - z * cosineAngle1
-z1 = x * cosineAngle1 + z * sineAngle1
-y1 = y * sineAngle2 - z1 * cosineAngle2
-z2 = y * cosineAngle2 + z1 * sineAngle2
-
-IF z2 < .5 THEN
-renderedPointsX(a) = -1
-ELSE
-renderedPointsX(a) = 320 + (x1 / z2 * 400)
-renderedPointsY(a) = 240 - (y1 / z2 * 400)
-END IF
-NEXT a
-
-FOR a = 1 TO lineCount
-l1 = originalLineVertices1(a)
-l2 = originalLineVertices2(a)
-
-IF originalRenderedPointsX(l1) = -1 OR originalRenderedPointsX(l2) = -1 THEN
-ELSE
-LINE (originalRenderedPointsX(l1), originalRenderedPointsY(l1))-(originalRenderedPointsX(l2), originalRenderedPointsY(l2)), 0
-END IF
-
-l1 = lineVertices1(a)
-l2 = lineVertices2(a)
-IF renderedPointsX(l1) = -1 OR renderedPointsX(l2) = -1 THEN
-ELSE
-LINE (renderedPointsX(l1), renderedPointsY(l1))-(renderedPointsX(l2), renderedPointsY(l2)), lineColors(a)
-END IF
-NEXT a
-
-IF lineCount < oldLineCount THEN
-FOR a = lineCount + 1 TO oldLineCount
-l1 = originalLineVertices1(a)
-l2 = originalLineVertices2(a)
-IF originalRenderedPointsX(l1) = -1 OR originalRenderedPointsX(l2) = -1 THEN
-ELSE
-LINE (originalRenderedPointsX(l1), originalRenderedPointsY(l1))-(originalRenderedPointsX(l2), originalRenderedPointsY(l2)), 0
-END IF
-NEXT a
-END IF
-
-FOR a = 1 TO pointCount
-originalRenderedPointsX(a) = renderedPointsX(a)
-originalRenderedPointsY(a) = renderedPointsY(a)
-NEXT a
-
-oldPointCount = pointCount
-
-FOR a = 1 TO lineCount
-originalLineVertices1(a) = lineVertices1(a)
-originalLineVertices2(a) = lineVertices2(a)
-NEXT a
-
-oldLineCount = lineCount
-
-END SUB
-
-SUB StartGame
-SCREEN 12
-numPoints = 0
-numLines = 0
-pointCount = numPoints
-lineCount = numLines
-gridSize = 50
-
-myPositionX = 4
-myPositionY = 15
-myPositionZ = 17
-angle1 = ATN(1) / 2 - .29
-angle2 = angle1 + 1
-
-FOR a = 1 TO 1000
-lineColors(a) = 4
-NEXT a
-
-FOR a = 1 TO 1000
-originalLineVertices1(a) = 1
-originalLineVertices2(a) = 1
-NEXT a
-
-OPEN "3dlife.dat" FOR INPUT AS #1
-y = 20
-20
-IF EOF(1) <> 0 THEN GOTO 30
-x = 20
-
-LINE INPUT #1, inputLine$
-FOR b = 1 TO LEN(inputLine$)
-  c$ = RIGHT$(LEFT$(inputLine$, b), 1)
-  IF c$ = "#" THEN gameOfLifeGrid(x, y) = 1
-  x = x + 1
-NEXT b
-
-y = y + 1
-GOTO 20
-30
-CLOSE #1
-
-END SUB
diff --git a/Graphics/3D/3dlife.dat b/Graphics/3D/3dlife.dat
deleted file mode 100644 (file)
index 17b0e10..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-.....#.#.....\r
-...##...##...\r
-..#.......#..\r
-.#..##.##..#.\r
-.#.#.....#.#.\r
-#..#.###.#..#\r
-.....#.#.....\r
-#..#.###.#..#\r
-.#.#.....#.#.\r
-.#..##.##..#.\r
-..#.......#..\r
-...##...##...\r
-.....#.#.....\r
diff --git a/Graphics/3D/3dtext.bas b/Graphics/3D/3dtext.bas
deleted file mode 100755 (executable)
index 945be4f..0000000
+++ /dev/null
@@ -1,567 +0,0 @@
-' Renders 3D text within 3D room.\r
-' User can freely fly around the room and observe the text from different angles.\r
-'\r
-' By Svjatoslav Agejenko.\r
-' Email: svjatoslav@svjatoslav.eu\r
-' Homepage: http://www.svjatoslav.eu\r
-'\r
-' Changelog:\r
-' 2003, Initial version\r
-' 2024, Improved program readability using AI\r
-'\r
-' Keyboard controls:\r
-'   cursor keys and to z, w - rotate\r
-'   <SPACE> - slow down\r
-'   q and <ESC> - quit program\r
-'   + / - - move up / down\r
-\r
-\r
-\r
-DECLARE SUB prn (x!, y!, a$)\r
-DECLARE SUB pch (x!, y!, a$)\r
-DECLARE SUB readfnt ()\r
-DECLARE SUB ruut2 (x!, y!, z!, s!)\r
-DECLARE SUB ruut (x!, y!, z!, s!)\r
-DECLARE SUB kuus (x, y, z, s)\r
-DECLARE SUB porand ()\r
-DECLARE SUB addp (x, y, z)\r
-\r
-DECLARE SUB start ()\r
-DECLARE SUB addsq (x1%, y1%, z1%)\r
-DECLARE SUB getcor ()\r
-DECLARE SUB mulcor ()\r
-DECLARE SUB nait3d ()\r
-DECLARE SUB calcsin ()\r
-DIM SHARED xn(4000), yn(4000), zn(4000)\r
-DIM SHARED x(4000), y(4000), z(4000)\r
-\r
-DIM SHARED xo(4000), yo(4000), zo(4000)\r
-DIM SHARED point1(4000), point2(4000)\r
-DIM SHARED col(4000)\r
-DIM SHARED nump, numl\r
-DIM SHARED myx, myy, myz, mye, myk\r
-DIM SHARED tpx(0 TO 10, 0 TO 255)\r
-DIM SHARED tpy(0 TO 10, 0 TO 255)\r
-DIM SHARED tl1(0 TO 10, 0 TO 255)\r
-DIM SHARED tl2(0 TO 10, 0 TO 255)\r
-\r
-myx = 0\r
-myy = 0\r
-myz = -100\r
-\r
-start\r
-\r
-nait3d\r
-\r
-SUB getcor\r
-\r
-' Define the corners of a cube\r
-xn(nump + 1) = -150\r
-yn(nump + 1) = -125\r
-zn(nump + 1) = -200\r
-\r
-xn(nump + 2) = 150\r
-yn(nump + 2) = -125\r
-zn(nump + 2) = -200\r
-\r
-xn(nump + 3) = 150\r
-yn(nump + 3) = 125\r
-zn(nump + 3) = -200\r
-\r
-xn(nump + 4) = -150\r
-yn(nump + 4) = 125\r
-zn(nump + 4) = -200\r
-\r
-xn(nump + 5) = -150\r
-yn(nump + 5) = -125\r
-zn(nump + 5) = 200\r
-\r
-xn(nump + 6) = 150\r
-yn(nump + 6) = -125\r
-zn(nump + 6) = 200\r
-\r
-xn(nump + 7) = 150\r
-yn(nump + 7) = 125\r
-zn(nump + 7) = 200\r
-\r
-xn(nump + 8) = -150\r
-yn(nump + 8) = 125\r
-zn(nump + 8) = 200\r
-\r
-' Define the lines connecting the corners\r
-point1(numl + 1) = nump + 1\r
-point2(numl + 1) = nump + 2\r
-\r
-point1(numl + 2) = nump + 2\r
-point2(numl + 2) = nump + 3\r
-\r
-point1(numl + 3) = nump + 3\r
-point2(numl + 3) = nump + 4\r
-\r
-point1(numl + 4) = nump + 4\r
-point2(numl + 4) = nump + 1\r
-\r
-point1(numl + 5) = nump + 5\r
-point2(numl + 5) = nump + 6\r
-\r
-point1(numl + 6) = nump + 6\r
-point2(numl + 6) = nump + 7\r
-\r
-point1(numl + 7) = nump + 7\r
-point2(numl + 7) = nump + 8\r
-\r
-point1(numl + 8) = nump + 8\r
-point2(numl + 8) = nump + 5\r
-\r
-point1(numl + 9) = nump + 5\r
-point2(numl + 9) = nump + 1\r
-\r
-point1(numl + 10) = nump + 6\r
-point2(numl + 10) = nump + 2\r
-\r
-point1(numl + 11) = nump + 7\r
-point2(numl + 11) = nump + 3\r
-\r
-point1(numl + 12) = nump + 8\r
-point2(numl + 12) = nump + 4\r
-\r
-nump = nump + 8\r
-numl = numl + 12\r
-\r
-' Define the corners of rectangle\r
-xn(nump + 1) = -150\r
-yn(nump + 1) = -125 + 201\r
-zn(nump + 1) = 0\r
-\r
-xn(nump + 2) = -150\r
-yn(nump + 2) = -125 + 201\r
-zn(nump + 2) = 89\r
-\r
-xn(nump + 3) = -150\r
-yn(nump + 3) = -125\r
-zn(nump + 3) = 89\r
-\r
-xn(nump + 4) = -150\r
-yn(nump + 4) = -125\r
-zn(nump + 4) = 0\r
-\r
-' Define the lines connecting these corners\r
-point1(numl + 1) = nump + 1\r
-point2(numl + 1) = nump + 2\r
-\r
-point1(numl + 2) = nump + 2\r
-point2(numl + 2) = nump + 3\r
-\r
-point1(numl + 3) = nump + 3\r
-point2(numl + 3) = nump + 4\r
-\r
-point1(numl + 4) = nump + 4\r
-point2(numl + 4) = nump + 1\r
-\r
-nump = nump + 4\r
-numl = numl + 4\r
-\r
-prn 0, 0, "three dimensional "\r
-prn 0, -3, "text example"\r
-prn 0, -6, "etc etc etc"\r
-\r
-END SUB\r
-\r
-SUB kuus (x, y, z, s)\r
-\r
-' Initialize variables\r
-b = 0\r
-f = .3925\r
-\r
-' Loop to create points of the octagon\r
-FOR a = 0 + f TO 6 + f STEP 6.28 / 8\r
-    x1 = SIN(a) * s\r
-    y1 = COS(a) * s\r
-    b = b + 1\r
-\r
-    ' Store the points in the shared arrays\r
-    xn(nump + b) = x1 + x\r
-    yn(nump + b) = y\r
-    zn(nump + b) = y1 + z\r
-NEXT a\r
-\r
-' Define the lines connecting these points\r
-point1(numl + 1) = nump + 1\r
-point2(numl + 1) = nump + 2\r
-col(numl + 1) = 12\r
-\r
-point1(numl + 2) = nump + 2\r
-point2(numl + 2) = nump + 3\r
-col(numl + 2) = 12\r
-\r
-point1(numl + 3) = nump + 3\r
-point2(numl + 3) = nump + 4\r
-col(numl + 3) = 12\r
-\r
-point1(numl + 4) = nump + 4\r
-point2(numl + 4) = nump + 5\r
-col(numl + 4) = 12\r
-\r
-point1(numl + 5) = nump + 5\r
-point2(numl + 5) = nump + 6\r
-col(numl + 5) = 12\r
-\r
-point1(numl + 6) = nump + 6\r
-point2(numl + 6) = nump + 7\r
-col(numl + 6) = 12\r
-\r
-point1(numl + 7) = nump + 7\r
-point2(numl + 7) = nump + 8\r
-col(numl + 7) = 12\r
-\r
-point1(numl + 8) = nump + 8\r
-point2(numl + 8) = nump + 1\r
-col(numl + 8) = 12\r
-\r
-nump = nump + b\r
-numl = numl + 8\r
-\r
-'LOCATE 1, 1\r
-'PRINT b\r
-\r
-END SUB\r
-\r
-SUB nait3d\r
-\r
-' Main loop for the 3D rendering\r
-1\r
-\r
-myx = myx + SIN(deg1) * mye\r
-myz = myz + COS(deg1) * mye\r
-\r
-myx = myx + COS(deg1) * myk\r
-myz = myz - SIN(deg1) * myk\r
-\r
-deg1 = deg1 + d1\r
-Deg2 = Deg2 + d2\r
-\r
-C1 = COS(deg1): S1 = SIN(deg1)\r
-C2 = COS(Deg2): S2 = SIN(Deg2)\r
-\r
-' Transform the coordinates\r
-FOR a = 1 TO nump\r
-    xo = xn(a) - myx\r
-    yo = -yn(a) - myy\r
-    zo = zn(a) - myz\r
-\r
-    x1 = (xo * C1 - zo * S1)\r
-    z1 = (xo * S1 + zo * C1)\r
-\r
-    y1 = (yo * C2 - z1 * S2)\r
-    z2 = (yo * S2 + z1 * C2)\r
-\r
-    ' Store the transformed coordinates\r
-    xo(a) = x(a)\r
-    yo(a) = y(a)\r
-\r
-    ' Check if the point is within the view\r
-    IF z2 < 20 THEN\r
-        x(a) = -1\r
-    ELSE\r
-        ' Apply perspective transformation\r
-        x(a) = 320 + (x1 / z2 * 500)\r
-        y(a) = 240 + (y1 / z2 * 500)\r
-    END IF\r
-NEXT\r
-\r
-' Draw the lines\r
-FOR a = 1 TO numl\r
-    p1 = point1(a)\r
-    p2 = point2(a)\r
-\r
-    ' Check if the points are within the view\r
-    IF xo(p1) = -1 OR xo(p2) = -1 THEN\r
-        ' Do nothing\r
-    ELSE\r
-        ' erase line at old coordinates\r
-        LINE (xo(p1), yo(p1))-(xo(p2), yo(p2)), 0\r
-    END IF\r
-\r
-    IF x(p1) = -1 OR x(p2) = -1 THEN\r
-        ' Do nothing\r
-    ELSE\r
-        ' draw line at new coordinates\r
-        LINE (x(p1), y(p1))-(x(p2), y(p2)), col(a)\r
-    END IF\r
-NEXT\r
-\r
-' Handle user input\r
-K$ = INKEY$\r
-IF K$ <> "" THEN\r
-\r
-    SELECT CASE K$\r
-\r
-        CASE CHR$(0) + "P"\r
-            mye = mye - 1\r
-\r
-        CASE CHR$(0) + "H"\r
-            mye = mye + 1\r
-\r
-        CASE CHR$(0) + "M"\r
-            myk = myk + 1\r
-\r
-        CASE CHR$(0) + "K"\r
-            myk = myk - 1\r
-\r
-        CASE "+"\r
-            myy = myy + 3\r
-\r
-        CASE "-"\r
-            myy = myy - 3\r
-\r
-        CASE "6"\r
-            d1 = d1 + .01\r
-\r
-        CASE "4"\r
-            d1 = d1 - .01\r
-\r
-        CASE "8"\r
-            d2 = d2 - .01\r
-\r
-        CASE "2"\r
-            d2 = d2 + .01\r
-\r
-        CASE " "\r
-            d1 = d1 / 2\r
-            d2 = d2 / 2\r
-            d3 = d3 / 2\r
-            mye = mye / 2\r
-            myk = myk / 2\r
-\r
-        CASE "q"\r
-            SYSTEM\r
-\r
-        CASE CHR$(27)\r
-            SYSTEM\r
-\r
-    END SELECT\r
-END IF\r
-\r
-GOTO 1\r
-\r
-END SUB\r
-\r
-SUB pch (x, y, a$)\r
-\r
-' Initialize variables\r
-b = ASC(a$)\r
-up = 0\r
-ul = 0\r
-\r
-' Loop to create points for the character\r
-FOR c = 0 TO 100\r
-    IF tpx(c, b) = 999 THEN GOTO 4\r
-    up = up + 1\r
-    xn(nump + up) = x + tpx(c, b)\r
-    yn(nump + up) = y - tpy(c, b)\r
-    zn(nump + up) = 0\r
-NEXT c\r
-4\r
-\r
-' Loop to define the lines for the character\r
-FOR c = 0 TO 100\r
-    IF tl1(c, b) = 999 THEN GOTO 5\r
-    ul = ul + 1\r
-    point1(numl + ul) = tl1(c, b) + nump + 1\r
-    point2(numl + ul) = tl2(c, b) + nump + 1\r
-    col(numl + ul) = 4\r
-NEXT c\r
-5\r
-\r
-' Update the counters\r
-nump = nump + up\r
-numl = numl + ul\r
-\r
-END SUB\r
-\r
-SUB porand\r
-' do floor of the 3D room\r
-\r
-' Loop to create floor tiles made of hexagons and squares\r
-FOR x = -100 TO 0 STEP 12.067 + .3\r
-    FOR z = -100 TO 0 STEP 12.067 + .3\r
-        kuus x, -125, z, 6.53\r
-        ruut x + 6.033 + .15, -125, z + 6.033 + .15, 3.111 + .3\r
-    NEXT z\r
-NEXT x\r
-\r
-' Loop to create squares\r
-FOR y = -100 TO 0 STEP 20.3\r
-    FOR x = -100 TO 0 STEP 20.3\r
-        ruut2 x, y, 200, 10\r
-    NEXT x\r
-NEXT y\r
-\r
-END SUB\r
-\r
-SUB prn (x, y, a$)\r
-\r
-' Loop to print each character\r
-FOR b = 1 TO LEN(a$)\r
-    c$ = RIGHT$(LEFT$(a$, b), 1)\r
-    pch x + b * 3, y, c$\r
-NEXT b\r
-\r
-END SUB\r
-\r
-SUB readfnt\r
-\r
-' Open the font file\r
-OPEN "font.dat" FOR INPUT AS #1\r
-\r
-' Loop to read the font data\r
-3\r
-IF EOF(1) <> 0 THEN GOTO 2\r
-LINE INPUT #1, a$\r
-\r
-IF LEFT$(a$, 1) = "#" THEN\r
-  chr = ASC(RIGHT$(LEFT$(a$, 3), 1))\r
-\r
-  ' Initialize counters\r
-  pp = 0\r
-  lp = 0\r
-END IF\r
-\r
-' read the points for the character\r
-IF LEFT$(a$, 1) = "p" THEN\r
-    tpx(pp, chr) = VAL(RIGHT$(LEFT$(a$, 3), 1))\r
-    tpy(pp, chr) = VAL(RIGHT$(LEFT$(a$, 5), 1))\r
-    pp = pp + 1\r
-END IF\r
-\r
-' read the lines for the character\r
-IF LEFT$(a$, 1) = "l" THEN\r
-    tl1(lp, chr) = VAL(RIGHT$(LEFT$(a$, 3), 1))\r
-    tl2(lp, chr) = VAL(RIGHT$(LEFT$(a$, 5), 1))\r
-    lp = lp + 1\r
-END IF\r
-\r
-GOTO 3\r
-\r
-' Close the font file\r
-2\r
-CLOSE #1\r
-\r
-END SUB\r
-\r
-SUB ruut (x, y, z, s)\r
-\r
-' Define the corners of the rectangle\r
-xn(nump + 1) = x\r
-yn(nump + 1) = y\r
-zn(nump + 1) = z + s\r
-\r
-xn(nump + 2) = x + s\r
-yn(nump + 2) = y\r
-zn(nump + 2) = z\r
-\r
-xn(nump + 3) = x\r
-yn(nump + 3) = y\r
-zn(nump + 3) = z - s\r
-\r
-xn(nump + 4) = x - s\r
-yn(nump + 4) = y\r
-zn(nump + 4) = z\r
-\r
-' Define the lines connecting these corners\r
-point1(numl + 1) = nump + 1\r
-point2(numl + 1) = nump + 2\r
-col(numl + 1) = 10\r
-\r
-point1(numl + 2) = nump + 2\r
-point2(numl + 2) = nump + 3\r
-col(numl + 2) = 10\r
-\r
-point1(numl + 3) = nump + 3\r
-point2(numl + 3) = nump + 4\r
-col(numl + 3) = 10\r
-\r
-point1(numl + 4) = nump + 4\r
-point2(numl + 4) = nump + 1\r
-col(numl + 4) = 10\r
-\r
-' Update the counters\r
-nump = nump + 4\r
-numl = numl + 4\r
-\r
-END SUB\r
-\r
-SUB ruut2 (x, y, z, s)\r
-\r
-' Define the corners of the rectangle\r
-xn(nump + 1) = x - s\r
-yn(nump + 1) = y - s\r
-zn(nump + 1) = z\r
-\r
-xn(nump + 2) = x + s\r
-yn(nump + 2) = y - s\r
-zn(nump + 2) = z\r
-\r
-xn(nump + 3) = x + s\r
-yn(nump + 3) = y + s\r
-zn(nump + 3) = z\r
-\r
-xn(nump + 4) = x - s\r
-yn(nump + 4) = y + s\r
-zn(nump + 4) = z\r
-\r
-' Define the lines connecting these corners\r
-point1(numl + 1) = nump + 1\r
-point2(numl + 1) = nump + 2\r
-col(numl + 1) = 14\r
-\r
-point1(numl + 2) = nump + 2\r
-point2(numl + 2) = nump + 3\r
-col(numl + 2) = 14\r
-\r
-point1(numl + 3) = nump + 3\r
-point2(numl + 3) = nump + 4\r
-col(numl + 3) = 14\r
-\r
-point1(numl + 4) = nump + 4\r
-point2(numl + 4) = nump + 1\r
-col(numl + 4) = 14\r
-\r
-' Update the counters\r
-nump = nump + 4\r
-numl = numl + 4\r
-\r
-END SUB\r
-\r
-SUB start\r
-\r
-' Initialize the screen and clear it\r
-SCREEN 12\r
-CLS\r
-\r
-' Set the default color for all points\r
-FOR a = 1 TO 4000\r
-    col(a) = 15\r
-NEXT a\r
-\r
-' Initialize counters\r
-nump = 0\r
-numl = 0\r
-\r
-' Initialize font data\r
-FOR a = 0 TO 255\r
-    FOR b = 0 TO 10\r
-        tpx(b, a) = 999\r
-        tpy(b, a) = 999\r
-        tl1(b, a) = 999\r
-        tl2(b, a) = 999\r
-    NEXT b\r
-NEXT a\r
-\r
-' Read the font data\r
-readfnt\r
-\r
-' Define the corners of the cubes\r
-getcor\r
-\r
-END SUB\r
diff --git a/Graphics/3D/tiled room.bas b/Graphics/3D/tiled room.bas
new file mode 100755 (executable)
index 0000000..45eeba2
--- /dev/null
@@ -0,0 +1,501 @@
+' Program renders 3D room with various decorative tiles on the wall and on the floor.\r
+' User can freely fly around and look at the room from different angles.\r
+'\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' ?, Initial version\r
+' 2024, Improved program readability using AI\r
+'\r
+' Keyboard controls:\r
+' <left>, <right>, <up>, <down> - move around\r
+' 2, 6, 4, 8 - look around (number pad)\r
+' <SPACE> - speed down\r
+' q - quit\r
+' + / - - move up / down\r
+'\r
+\r
+\r
+DECLARE SUB renderSquare2 (x!, y!, z!, s!)\r
+DECLARE SUB renderSquare (x%, y%, z%, s%)\r
+DECLARE SUB renderHexagon (x!, y!, z!, s!)\r
+DECLARE SUB generateCube ()\r
+\r
+DECLARE SUB start ()\r
+DECLARE SUB addSquare (x1%, y1%, z1%)\r
+DECLARE SUB getCornerVertices ()\r
+DECLARE SUB multiplyCoordinates ()\r
+DECLARE SUB calculateSine ()\r
+DIM SHARED xVertex(4000), yVertex(4000), zVertex(4000)\r
+DIM SHARED xCoordinate(4000), yCoordinate(4000), zCoordinate(4000)\r
+\r
+DIM SHARED xOriginal(4000), yOriginal(4000), zOriginal(4000)\r
+DIM SHARED point1Vertex(4000), point2Vertex(4000)\r
+DIM SHARED col(4000)\r
+DIM SHARED vertexCount, edgeCount\r
+DIM SHARED myx, myy, myz, mye, myk\r
+\r
+myx = 0\r
+myy = 0\r
+myz = -1000\r
+\r
+start\r
+\r
+nait3d\r
+\r
+SUB addSquare (x1%, y1%, z1%)\r
+    c = 1\r
+\r
+    ' Define the vertices of a square in 3D space\r
+    xVertex(vertexCount + 1) = -100 + x1\r
+    yVertex(vertexCount + 1) = y1\r
+    zVertex(vertexCount + 1) = -100 + z1\r
+\r
+    xVertex(vertexCount + 2) = 100 + x1\r
+    yVertex(vertexCount + 2) = y1\r
+    zVertex(vertexCount + 2) = -100 + z1\r
+\r
+    xVertex(vertexCount + 3) = 100 + x1\r
+    yVertex(vertexCount + 3) = y1\r
+    zVertex(vertexCount + 3) = 100 + z1\r
+\r
+    xVertex(vertexCount + 4) = -100 + x1\r
+    yVertex(vertexCount + 4) = y1\r
+    zVertex(vertexCount + 4) = 100 + z1\r
+\r
+    ' Define the edges of the square\r
+    point1Vertex(edgeCount + 1) = vertexCount + 1\r
+    point2Vertex(edgeCount + 1) = vertexCount + 2\r
+    col(edgeCount + 1) = c\r
+\r
+    point1Vertex(edgeCount + 2) = vertexCount + 2\r
+    point2Vertex(edgeCount + 2) = vertexCount + 3\r
+    col(edgeCount + 2) = c\r
+\r
+    point1Vertex(edgeCount + 3) = vertexCount + 3\r
+    point2Vertex(edgeCount + 3) = vertexCount + 4\r
+    col(edgeCount + 3) = c\r
+\r
+    point1Vertex(edgeCount + 4) = vertexCount + 4\r
+    point2Vertex(edgeCount + 4) = vertexCount + 1\r
+    col(edgeCount + 4) = c\r
+\r
+    ' Update the counters for the next square\r
+    vertexCount = vertexCount + 4\r
+    edgeCount = edgeCount + 4\r
+\r
+END SUB\r
+\r
+SUB getCornerVertices\r
+\r
+    ' Define the vertices of a square in 3D space\r
+    xVertex(vertexCount + 1) = -150\r
+    yVertex(vertexCount + 1) = -125\r
+    zVertex(vertexCount + 1) = -200\r
+\r
+    xVertex(vertexCount + 2) = 150\r
+    yVertex(vertexCount + 2) = -125\r
+    zVertex(vertexCount + 2) = -200\r
+\r
+    xVertex(vertexCount + 3) = 150\r
+    yVertex(vertexCount + 3) = 125\r
+    zVertex(vertexCount + 3) = -200\r
+\r
+    xVertex(vertexCount + 4) = -150\r
+    yVertex(vertexCount + 4) = 125\r
+    zVertex(vertexCount + 4) = -200\r
+\r
+    ' Define the edges of the square\r
+    point1Vertex(edgeCount + 1) = vertexCount + 1\r
+    point2Vertex(edgeCount + 1) = vertexCount + 2\r
+\r
+    point1Vertex(edgeCount + 2) = vertexCount + 2\r
+    point2Vertex(edgeCount + 2) = vertexCount + 3\r
+\r
+    point1Vertex(edgeCount + 3) = vertexCount + 3\r
+    point2Vertex(edgeCount + 3) = vertexCount + 4\r
+\r
+    point1Vertex(edgeCount + 4) = vertexCount + 4\r
+    point2Vertex(edgeCount + 4) = vertexCount + 1\r
+\r
+    ' Define the vertices of another square in 3D space\r
+    xVertex(vertexCount + 5) = -150\r
+    yVertex(vertexCount + 5) = -125\r
+    zVertex(vertexCount + 5) = 200\r
+\r
+    xVertex(vertexCount + 6) = 150\r
+    yVertex(vertexCount + 6) = -125\r
+    zVertex(vertexCount + 6) = 200\r
+\r
+    xVertex(vertexCount + 7) = 150\r
+    yVertex(vertexCount + 7) = 125\r
+    zVertex(vertexCount + 7) = 200\r
+\r
+    xVertex(vertexCount + 8) = -150\r
+    yVertex(vertexCount + 8) = 125\r
+    zVertex(vertexCount + 8) = 200\r
+\r
+    ' Define the edges of the second square\r
+    point1Vertex(edgeCount + 5) = vertexCount + 5\r
+    point2Vertex(edgeCount + 5) = vertexCount + 6\r
+\r
+    point1Vertex(edgeCount + 6) = vertexCount + 6\r
+    point2Vertex(edgeCount + 6) = vertexCount + 7\r
+\r
+    point1Vertex(edgeCount + 7) = vertexCount + 7\r
+    point2Vertex(edgeCount + 7) = vertexCount + 8\r
+\r
+    point1Vertex(edgeCount + 8) = vertexCount + 8\r
+    point2Vertex(edgeCount + 8) = vertexCount + 5\r
+\r
+    ' Define the edges connecting the two squares into cube\r
+    point1Vertex(edgeCount + 9) = vertexCount + 5\r
+    point2Vertex(edgeCount + 9) = vertexCount + 1\r
+\r
+    point1Vertex(edgeCount + 10) = vertexCount + 6\r
+    point2Vertex(edgeCount + 10) = vertexCount + 2\r
+\r
+    point1Vertex(edgeCount + 11) = vertexCount + 7\r
+    point2Vertex(edgeCount + 11) = vertexCount + 3\r
+\r
+    point1Vertex(edgeCount + 12) = vertexCount + 8\r
+    point2Vertex(edgeCount + 12) = vertexCount + 4\r
+\r
+    ' Update the counters for the next set of vertices and edges\r
+    vertexCount = vertexCount + 8\r
+    edgeCount = edgeCount + 12\r
+\r
+    ' Define a pyramid in 3D space\r
+    xVertex(vertexCount + 1) = -150\r
+    yVertex(vertexCount + 1) = -125 + 201\r
+    zVertex(vertexCount + 1) = 0\r
+\r
+    xVertex(vertexCount + 2) = -150\r
+    yVertex(vertexCount + 2) = -125 + 201\r
+    zVertex(vertexCount + 2) = 89\r
+\r
+    xVertex(vertexCount + 3) = -150\r
+    yVertex(vertexCount + 3) = -125\r
+    zVertex(vertexCount + 3) = 89\r
+\r
+    xVertex(vertexCount + 4) = -150\r
+    yVertex(vertexCount + 4) = -125\r
+    zVertex(vertexCount + 4) = 0\r
+\r
+    ' Define the edges of the pyramid\r
+    point1Vertex(edgeCount + 1) = vertexCount + 1\r
+    point2Vertex(edgeCount + 1) = vertexCount + 2\r
+\r
+    point1Vertex(edgeCount + 2) = vertexCount + 2\r
+    point2Vertex(edgeCount + 2) = vertexCount + 3\r
+\r
+    point1Vertex(edgeCount + 3) = vertexCount + 3\r
+    point2Vertex(edgeCount + 3) = vertexCount + 4\r
+\r
+    point1Vertex(edgeCount + 4) = vertexCount + 4\r
+    point2Vertex(edgeCount + 4) = vertexCount + 1\r
+\r
+    ' Update the counters for the next set of vertices and edges\r
+    vertexCount = vertexCount + 4\r
+    edgeCount = edgeCount + 4\r
+\r
+porand\r
+\r
+END SUB\r
+\r
+SUB renderHexagon (x, y, z, s)\r
+\r
+b = 0\r
+f = .3925\r
+' Calculate the vertices of a hexagon in 3D space\r
+FOR a = 0 + f TO 6 + f STEP 6.28 / 8\r
+    x1 = SIN(a) * s\r
+    y1 = COS(a) * s\r
+    b = b + 1\r
+\r
+    xVertex(vertexCount + b) = x + x1\r
+    yVertex(vertexCount + b) = y\r
+    zVertex(vertexCount + b) = z + y1\r
+\r
+NEXT a\r
+\r
+' Define the edges of the hexagon\r
+point1Vertex(edgeCount + 1) = vertexCount + 1\r
+point2Vertex(edgeCount + 1) = vertexCount + 2\r
+col(edgeCount + 1) = 12\r
+\r
+point1Vertex(edgeCount + 2) = vertexCount + 2\r
+point2Vertex(edgeCount + 2) = vertexCount + 3\r
+col(edgeCount + 2) = 12\r
+\r
+point1Vertex(edgeCount + 3) = vertexCount + 3\r
+point2Vertex(edgeCount + 3) = vertexCount + 4\r
+col(edgeCount + 3) = 12\r
+\r
+point1Vertex(edgeCount + 4) = vertexCount + 4\r
+point2Vertex(edgeCount + 4) = vertexCount + 5\r
+col(edgeCount + 4) = 12\r
+\r
+point1Vertex(edgeCount + 5) = vertexCount + 5\r
+point2Vertex(edgeCount + 5) = vertexCount + 6\r
+col(edgeCount + 5) = 12\r
+\r
+point1Vertex(edgeCount + 6) = vertexCount + 6\r
+point2Vertex(edgeCount + 6) = vertexCount + 7\r
+col(edgeCount + 6) = 12\r
+\r
+point1Vertex(edgeCount + 7) = vertexCount + 7\r
+point2Vertex(edgeCount + 7) = vertexCount + 8\r
+col(edgeCount + 7) = 12\r
+\r
+point1Vertex(edgeCount + 8) = vertexCount + 8\r
+point2Vertex(edgeCount + 8) = vertexCount + 1\r
+col(edgeCount + 8) = 12\r
+\r
+' Update the counters for the next set of vertices and edges\r
+vertexCount = vertexCount + b\r
+edgeCount = edgeCount + 8\r
+\r
+END SUB\r
+\r
+SUB nait3d\r
+\r
+    ' Main loop to render the 3D scene\r
+1\r
+\r
+    ' Update the position based on rotation\r
+    myx = myx + SIN(deg1) * mye\r
+    myz = myz + COS(deg1) * mye\r
+\r
+    myx = myx + COS(deg1) * myk\r
+    myz = myz - SIN(deg1) * myk\r
+\r
+    ' Update the rotation angles\r
+    deg1 = deg1 + d1\r
+    Deg2 = Deg2 + d2\r
+\r
+    ' Calculate the rotation matrices\r
+    C1 = COS(deg1): S1 = SIN(deg1)\r
+    C2 = COS(Deg2): S2 = SIN(Deg2)\r
+\r
+    ' Apply the rotation to each vertex\r
+    FOR a = 1 TO vertexCount\r
+        xo = xVertex(a) - myx\r
+        yo = -yVertex(a) - myy\r
+        zo = zVertex(a) - myz\r
+\r
+        x1 = (xo * C1 - zo * S1)\r
+        z1 = (xo * S1 + zo * C1)\r
+\r
+        y1 = (yo * C2 - z1 * S2)\r
+        z2 = (yo * S2 + z1 * C2)\r
+\r
+        ' Project the vertex onto the 2D screen\r
+        xOriginal(a) = xCoordinate(a)\r
+        yOriginal(a) = yCoordinate(a)\r
+        IF z2 < 20 THEN\r
+            xCoordinate(a) = -1\r
+        ELSE\r
+            xCoordinate(a) = 320 + (x1 / z2 * 500)\r
+            yCoordinate(a) = 240 + (y1 / z2 * 500)\r
+        END IF\r
+    NEXT\r
+\r
+    ' Draw the edges of each shape\r
+    FOR a = 1 TO edgeCount\r
+        p1 = point1Vertex(a)\r
+        p2 = point2Vertex(a)\r
+        IF xOriginal(p1) = -1 OR xOriginal(p2) = -1 THEN\r
+            ' Skip drawing if the vertex is off-screen\r
+        ELSE\r
+            ' erase edge on old coordinates\r
+            LINE (xOriginal(p1), yOriginal(p1))-(xOriginal(p2), yOriginal(p2)), 0\r
+        END IF\r
+\r
+        IF xCoordinate(p1) = -1 OR xCoordinate(p2) = -1 THEN\r
+            ' Skip drawing if the vertex is off-screen\r
+        ELSE\r
+            ' draw edge on new coordinates\r
+            LINE (xCoordinate(p1), yCoordinate(p1))-(xCoordinate(p2), yCoordinate(p2)), col(a)\r
+        END IF\r
+    NEXT\r
+\r
+    ' Handle user input\r
+    K$ = INKEY$\r
+    IF K$ <> "" THEN\r
+\r
+        SELECT CASE K$\r
+\r
+            CASE CHR$(0) + "P"\r
+                mye = mye - 3\r
+\r
+            CASE CHR$(0) + "H"\r
+                mye = mye + 3\r
+\r
+            CASE CHR$(0) + "M"\r
+                myk = myk + 3\r
+\r
+            CASE CHR$(0) + "K"\r
+                myk = myk - 3\r
+\r
+            CASE "+"\r
+                myy = myy + 3\r
+\r
+            CASE "-"\r
+                myy = myy - 3\r
+\r
+            CASE "6"\r
+                d1 = d1 + .01\r
+\r
+            CASE "4"\r
+                d1 = d1 - .01\r
+\r
+            CASE "8"\r
+                d2 = d2 - .01\r
+\r
+            CASE "2"\r
+                d2 = d2 + .01\r
+\r
+            CASE " "\r
+                d1 = d1 / 2\r
+                d2 = d2 / 2\r
+                d3 = d3 / 2\r
+                mye = mye / 2\r
+                myk = myk / 2\r
+\r
+            CASE "q"\r
+                SYSTEM\r
+\r
+            CASE CHR$(27)\r
+                SYSTEM\r
+        END SELECT\r
+    END IF\r
+\r
+    ' Continue the main loop\r
+    GOTO 1\r
+END SUB\r
+\r
+SUB porand\r
+\r
+    ' Generate a grid of shapes in 3D space\r
+    FOR x = -100 TO 0 STEP 12.067 + .3\r
+        FOR z = -100 TO 0 STEP 12.067 + .3\r
+            renderHexagon x, -125, z, 6.53\r
+            renderSquare x + 6.033 + .15, -125, z + 6.033 + .15, 3.111 + .3\r
+        NEXT z\r
+    NEXT x\r
+\r
+    ' Generate another grid of shapes in 3D space\r
+    FOR y = -100 TO 0 STEP 20.3\r
+        FOR x = -100 TO 0 STEP 20.3\r
+            renderSquare2 x, y, 200, 10\r
+        NEXT x\r
+    NEXT y\r
+\r
+END SUB\r
+\r
+SUB renderSquare (x%, y%, z%, s%)\r
+\r
+    ' Define the vertices of a square in 3D space\r
+    xVertex(vertexCount + 1) = x%\r
+    yVertex(vertexCount + 1) = y%\r
+    zVertex(vertexCount + 1) = z% + s%\r
+\r
+    xVertex(vertexCount + 2) = x% + s%\r
+    yVertex(vertexCount + 2) = y%\r
+    zVertex(vertexCount + 2) = z%\r
+\r
+    xVertex(vertexCount + 3) = x%\r
+    yVertex(vertexCount + 3) = y%\r
+    zVertex(vertexCount + 3) = z% - s%\r
+\r
+    xVertex(vertexCount + 4) = x% - s%\r
+    yVertex(vertexCount + 4) = y%\r
+    zVertex(vertexCount + 4) = z%\r
+\r
+    ' Define the edges of the square\r
+    point1Vertex(edgeCount + 1) = vertexCount + 1\r
+    point2Vertex(edgeCount + 1) = vertexCount + 2\r
+    col(edgeCount + 1) = 10\r
+\r
+    point1Vertex(edgeCount + 2) = vertexCount + 2\r
+    point2Vertex(edgeCount + 2) = vertexCount + 3\r
+    col(edgeCount + 2) = 10\r
+\r
+    point1Vertex(edgeCount + 3) = vertexCount + 3\r
+    point2Vertex(edgeCount + 3) = vertexCount + 4\r
+    col(edgeCount + 3) = 10\r
+\r
+    point1Vertex(edgeCount + 4) = vertexCount + 4\r
+    point2Vertex(edgeCount + 4) = vertexCount + 1\r
+    col(edgeCount + 4) = 10\r
+\r
+    ' Update the counters for the next square\r
+    vertexCount = vertexCount + 4\r
+    edgeCount = edgeCount + 4\r
+\r
+END SUB\r
+\r
+SUB renderSquare2 (x, y, z, s)\r
+\r
+    ' Define the vertices of a square in 3D space\r
+    xVertex(vertexCount + 1) = x - s\r
+    yVertex(vertexCount + 1) = y - s\r
+    zVertex(vertexCount + 1) = z\r
+\r
+    xVertex(vertexCount + 2) = x + s\r
+    yVertex(vertexCount + 2) = y - s\r
+    zVertex(vertexCount + 2) = z\r
+\r
+    xVertex(vertexCount + 3) = x + s\r
+    yVertex(vertexCount + 3) = y + s\r
+    zVertex(vertexCount + 3) = z\r
+\r
+    xVertex(vertexCount + 4) = x - s\r
+    yVertex(vertexCount + 4) = y + s\r
+    zVertex(vertexCount + 4) = z\r
+\r
+    ' Define the edges of the square\r
+    point1Vertex(edgeCount + 1) = vertexCount + 1\r
+    point2Vertex(edgeCount + 1) = vertexCount + 2\r
+    col(edgeCount + 1) = 14\r
+\r
+    point1Vertex(edgeCount + 2) = vertexCount + 2\r
+    point2Vertex(edgeCount + 2) = vertexCount + 3\r
+    col(edgeCount + 2) = 14\r
+\r
+    point1Vertex(edgeCount + 3) = vertexCount + 3\r
+    point2Vertex(edgeCount + 3) = vertexCount + 4\r
+    col(edgeCount + 3) = 14\r
+\r
+    point1Vertex(edgeCount + 4) = vertexCount + 4\r
+    point2Vertex(edgeCount + 4) = vertexCount + 1\r
+    col(edgeCount + 4) = 14\r
+\r
+    ' Update the counters for the next square\r
+    vertexCount = vertexCount + 4\r
+    edgeCount = edgeCount + 4\r
+\r
+END SUB\r
+\r
+SUB start\r
+\r
+    ' Initialize the screen and clear it\r
+    SCREEN 12\r
+    CLS\r
+\r
+    ' Set the initial color of all shapes\r
+    FOR a = 1 TO 4000\r
+        col(a) = 15\r
+    NEXT a\r
+\r
+    ' Initialize counters for vertices and edges\r
+    vertexCount = 0\r
+    edgeCount = 0\r
+\r
+    ' Generate the initial set of shapes\r
+    getCornerVertices\r
+\r
+END SUB\r