From e6728703943b0f0506a5c6da0a214314848bcbdd Mon Sep 17 00:00:00 2001
From: Sebastian Willenborg <comawill@wlnbrg.de>
Date: Sat, 1 Apr 2023 18:01:18 +0200
Subject: [PATCH] Migrate dodecahedra.py to python3

---
 python/dodecahedra.py | 133 +++++++++++++++++++++---------------------
 1 file changed, 67 insertions(+), 66 deletions(-)
 mode change 100644 => 100755 python/dodecahedra.py

diff --git a/python/dodecahedra.py b/python/dodecahedra.py
old mode 100644
new mode 100755
index 705b0bb..1fdd441
--- a/python/dodecahedra.py
+++ b/python/dodecahedra.py
@@ -1,5 +1,6 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Raoul, Hackover 2014, GPL v2
+from typing import Any, List
 import client
 import time
 from numpy import sin, cos, pi, array, clip, linspace, dot
@@ -17,6 +18,7 @@ xmax = client.WIDTH - sigma * B
 ymax = client.HEIGHT - tau * B - 2
 NT = 12
 
+
 def cube(a=10):
     vert = [(-a, -a, -a),
             (-a, a, -a),
@@ -46,26 +48,26 @@ edge_map_cube = [(0, 1),
 def dode(a=15):
     p = 1.618033
     q = 1.0
-    vert = [(-q, -q, -q), # 0
+    vert = [(-q, -q, -q),  # 0
             (-q, q, -q),
             (q, q, -q),
             (q, -q, -q),
-            (-q, -q, q), # 4
+            (-q, -q, q),  # 4
             (-q, q, q),
             (q, q, q),
             (q, -q, q),
-            (0, 1/p, p), # 8
-            (0, -1/p, p),
-            (0, 1/p, -p),
-            (0, -1/p, -p),
-            (p, 0, 1/p), # 12
-            (-p, 0, 1/p),
-            (p, 0, -1/p),
-            (-p, 0, -1/p),
-            (1/p, p, 0), # 16
-            (-1/p, p, 0),
-            (1/p, -p, 0),
-            (-1/p, -p, 0)]
+            (0, 1 / p, p),  # 8
+            (0, -1 / p, p),
+            (0, 1 / p, -p),
+            (0, -1 / p, -p),
+            (p, 0, 1 / p),  # 12
+            (-p, 0, 1 / p),
+            (p, 0, -1 / p),
+            (-p, 0, -1 / p),
+            (1 / p, p, 0),  # 16
+            (-1 / p, p, 0),
+            (1 / p, -p, 0),
+            (-1 / p, -p, 0)]
     #
     #          5---------6
     #         /    8    /
@@ -79,7 +81,7 @@ def dode(a=15):
     #       |Y   11    /
     #       0-X-------3
     #
-    return a*array(vert)
+    return a * array(vert)
 
 
 edge_map_dode = [(3, 14),
@@ -92,11 +94,11 @@ edge_map_dode = [(3, 14),
                  (4, 13),
                  (5, 13),
                  (13, 15),
-                 (1,10),
-                 (2,10),
+                 (1, 10),
+                 (2, 10),
                  (0, 11),
                  (3, 11),
-                 (10,11),
+                 (10, 11),
                  (4, 9),
                  (7, 9),
                  (5, 8),
@@ -114,28 +116,28 @@ edge_map_dode = [(3, 14),
                  (17, 16)]
 
 
-def rotatex(vertl, phi = pi/3):
-    Rx = array([[1,         0,        0],
-                [0,  cos(phi), sin(phi)],
+def rotatex(vertl, phi=pi / 3):
+    Rx = array([[1, 0, 0],
+                [0, cos(phi), sin(phi)],
                 [0, -sin(phi), cos(phi)]])
     return dot(Rx, vertl.T).T
 
 
-def rotatey(vertl, phi = pi/3):
-    Ry = array([[ cos(phi), 0, sin(phi)],
-                [        0, 1,        0],
+def rotatey(vertl, phi=pi / 3):
+    Ry = array([[cos(phi), 0, sin(phi)],
+                [0, 1, 0],
                 [-sin(phi), 0, cos(phi)]])
     return dot(Ry, vertl.T).T
 
 
-def rotatez(vertl, phi = pi/3):
-    Rz = array([[ cos(phi), sin(phi), 0],
+def rotatez(vertl, phi=pi / 3):
+    Rz = array([[cos(phi), sin(phi), 0],
                 [-sin(phi), cos(phi), 0],
-                [        0,        0, 1]])
+                [0, 0, 1]])
     return dot(Rz, vertl.T).T
 
 
-def propagate(x, v):
+def propagate(x, v) -> None:
     ti = x[:] + v[:]
     x[:] = ti
     if abs(ti[0]) < xmin or abs(ti[0]) > xmax:
@@ -159,8 +161,8 @@ def project(vertlist):
 
 
 def reflect(v1, v2, n):
-    v1n = v1 - 2*dot(v1, n) * n
-    v2n = v2 - 2*dot(v2, n) * n
+    v1n = v1 - 2 * dot(v1, n) * n
+    v2n = v2 - 2 * dot(v2, n) * n
     return v1n, v2n
 
 
@@ -168,32 +170,31 @@ def line(u, v):
     xd = v[0] - u[0]
     yd = v[1] - u[1]
     t = linspace(0, 1, NT)
-    lx = u[0] + xd*t
-    ly = u[1] + yd*t
+    lx = u[0] + xd * t
+    ly = u[1] + yd * t
     return lx.round(), ly.round()
 
 
 def show(vl, el):
-    pixels = []
-    pixelsold = []
+    pixels: list[tuple[int, int, int]] = []
+    pixelsold: list[tuple[int, int, int]] = []
     for e in el:
         lx, ly = line(vl[e[0]], vl[e[1]])
-        for lxi, lyi in zip(lx, ly):
-            pixels.append( (lxi, lyi, 255) )
-            pixelsold.append( (lxi, lyi, 0) )
-
+        for lxi, lyi in zip(map(int, lx), map(int, ly)):
+            pixels.append((lxi, lyi, 255))
+            pixelsold.append((lxi, lyi, 0))
     return pixels, pixelsold
 
 
-def clear():
-    pixels = [0] * client.HEIGHT * client.WIDTH
+def clear() -> None:
+    pixels = bytes(client.HEIGHT * client.WIDTH)
     client.blit(0, 0, client.WIDTH, client.HEIGHT, pixels)
 
 
-if __name__=="__main__":
-    x1 = array([CENX-100, CENY, 0])
+if __name__ == "__main__":
+    x1 = array([CENX - 100, CENY, 0])
     v1 = array([1.5, 0.75, 0])
-    x2 = array([CENX+100, CENY, 0])
+    x2 = array([CENX + 100, CENY, 0])
     v2 = array([-2.5, -0.25, 0])
 
     c1 = dode(16)
@@ -201,22 +202,22 @@ if __name__=="__main__":
     m = edge_map_dode
 
     offset = len(c1)
-    m += [(mi[0]+offset, mi[1]+offset) for mi in m]
+    m += [(mi[0] + offset, mi[1] + offset) for mi in m]
 
-    c1 = rotatez(c1, pi/4.0)
-    c1 = rotatex(c1, pi/3.0)
-    c2 = rotatez(c2, pi/4.0)
-    c2 = rotatex(c2, pi/3.0)
+    c1 = rotatez(c1, pi / 4.0)
+    c1 = rotatex(c1, pi / 3.0)
+    c2 = rotatez(c2, pi / 4.0)
+    c2 = rotatex(c2, pi / 3.0)
 
-    r1y = pi/50
-    r1z = pi/30
-    r2y = -pi/30
-    r2z = -pi/50
+    r1y = pi / 50
+    r1z = pi / 30
+    r2y = -pi / 30
+    r2z = -pi / 50
 
     ti = 0
-    pixold = []
+    pixold: list[tuple[int, int, int]] = []
     clear()
-    while(True):
+    while (True):
         c1 = rotatey(c1, r1y)
         c1 = rotatez(c1, r1z)
         c2 = rotatey(c2, r2y)
@@ -227,28 +228,28 @@ if __name__=="__main__":
 
         n = x1 - x2
         if norm(n) < 54:
-            v1, v2 = reflect(v1, v2, n/norm(n))
-            ry = clip(2*random.uniform(), -1.5, 1.5)
-            rz = clip(2*random.uniform(), -1.5, 1.5)
-            r1y = clip(r1y*ry, -0.28, 0.28)
-            r1z = clip(r1z*rz, -0.28, 0.28)
-            r2y = clip(r2y*ry, -0.28, 0.28)
-            r2z = clip(r2z*rz, -0.28, 0.28)
+            v1, v2 = reflect(v1, v2, n / norm(n))
+            ry = clip(2 * random.uniform(), -1.5, 1.5)
+            rz = clip(2 * random.uniform(), -1.5, 1.5)
+            r1y = clip(r1y * ry, -0.28, 0.28)
+            r1z = clip(r1z * rz, -0.28, 0.28)
+            r2y = clip(r2y * ry, -0.28, 0.28)
+            r2z = clip(r2z * rz, -0.28, 0.28)
 
         cc1 = project(move(c1, x1))
         cc2 = project(move(c2, x2))
 
-        pix, pixoldn = show(cc1+cc2, m)
-        client.set_pixels(pixold+pix)
+        pix, pixoldn = show(cc1 + cc2, m)
+        client.set_pixels(pixold + pix)
         pixold = pixoldn
 
         ti += 1
         if ti > 2000:
             ti = 0
             pixold = []
-            x1 = array([CENX-100, CENY, 0])
+            x1 = array([CENX - 100, CENY, 0])
             v1 = array([1.5, 0.75, 0])
-            x2 = array([CENX+100, CENY, 0])
+            x2 = array([CENX + 100, CENY, 0])
             v2 = array([-2.5, -0.25, 0])
             clear()
 
-- 
GitLab