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