Skip to content

Commit dbf477f

Browse files
authored
Merge pull request ndleah#118 from gideon-ogunbanjo/main
added a Spinning Donut project
2 parents ac2e9ad + a3418a2 commit dbf477f

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed

Spinning Donut/spinningdonut.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import pygame
2+
import math
3+
import colorsys
4+
5+
pygame.init()
6+
7+
white = (255, 255, 255)
8+
black = (0, 0, 0)
9+
hue = 0
10+
11+
WIDTH = 700
12+
HEIGHT = 700
13+
14+
x_start, y_start = 0, 0
15+
16+
x_separator = 10
17+
y_separator = 20
18+
19+
rows = HEIGHT // y_separator
20+
columns = WIDTH // x_separator
21+
screen_size = rows * columns
22+
23+
x_offset = columns / 2
24+
y_offset = rows / 2
25+
26+
A, B = 0, 0 # rotating animation
27+
28+
theta_spacing = 10
29+
phi_spacing = 1 # for faster rotation change to 2, 3 or more, but first change 86, 87 lines as commented
30+
31+
chars = ".,-~:;=!*#$@" # luminance index
32+
33+
screen = pygame.display.set_mode((WIDTH, HEIGHT))
34+
35+
display_surface = pygame.display.set_mode((WIDTH, HEIGHT))
36+
# display_surface = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
37+
pygame.display.set_caption('Donut')
38+
font = pygame.font.SysFont('Arial', 18, bold=True)
39+
40+
def hsv2rgb(h, s, v):
41+
return tuple(round(i * 255) for i in colorsys.hsv_to_rgb(h, s, v))
42+
43+
44+
def text_display(letter, x_start, y_start):
45+
text = font.render(str(letter), True, hsv2rgb(hue, 1, 1))
46+
display_surface.blit(text, (x_start, y_start))
47+
48+
# def text_display(letter, x_start, y_start):
49+
# text = font.render(str(letter), True, white)
50+
# display_surface.blit(text, (x_start, y_start))
51+
52+
53+
run = True
54+
while run:
55+
56+
screen.fill((black))
57+
58+
z = [0] * screen_size # Donut. Fills donut space
59+
b = [' '] * screen_size # Background. Fills empty space
60+
61+
for j in range(0, 628, theta_spacing): # from 0 to 2pi
62+
for i in range(0, 628, phi_spacing): # from 0 to 2pi
63+
c = math.sin(i)
64+
d = math.cos(j)
65+
e = math.sin(A)
66+
f = math.sin(j)
67+
g = math.cos(A)
68+
h = d + 2
69+
D = 1 / (c * h * e + f * g + 5)
70+
l = math.cos(i)
71+
m = math.cos(B)
72+
n = math.sin(B)
73+
t = c * h * g - f * e
74+
x = int(x_offset + 40 * D * (l * h * m - t * n)) # 3D x coordinate after rotation
75+
y = int(y_offset + 20 * D * (l * h * n + t * m)) # 3D y coordinate after rotation
76+
o = int(x + columns * y)
77+
N = int(8 * ((f * e - c * d * g) * m - c * d * e - f * g - l * d * n)) # luminance index
78+
if rows > y and y > 0 and x > 0 and columns > x and D > z[o]:
79+
z[o] = D
80+
b[o] = chars[N if N > 0 else 0]
81+
82+
if y_start == rows * y_separator - y_separator:
83+
y_start = 0
84+
85+
for i in range(len(b)):
86+
A += 0.00004 # for faster rotation change to bigger value
87+
B += 0.00002 # for faster rotation change to bigger value
88+
if i == 0 or i % columns:
89+
text_display(b[i], x_start, y_start)
90+
x_start += x_separator
91+
else:
92+
y_start += y_separator
93+
x_start = 0
94+
text_display(b[i], x_start, y_start)
95+
x_start += x_separator
96+
97+
98+
pygame.display.update()
99+
100+
hue += 0.005
101+
102+
for event in pygame.event.get():
103+
if event.type == pygame.QUIT:
104+
run = False
105+
if event.type == pygame.KEYDOWN:
106+
if event.key == pygame.K_ESCAPE:
107+
run = False

0 commit comments

Comments
 (0)