some new stuff.
idk its all pretty fun! some C++ too!
This commit is contained in:
55
simulations/donut.c/main.py
Normal file
55
simulations/donut.c/main.py
Normal file
@@ -0,0 +1,55 @@
|
||||
import math
|
||||
def render_frame(A, B):
|
||||
cosA = math.cos(A)
|
||||
sinA = math.sin(A)
|
||||
cosB = math.cos(B)
|
||||
sinB = math.sin(B)
|
||||
char_output = []
|
||||
zbuffer = []
|
||||
for i in range(screen_height + 1):
|
||||
char_output.append([' '] * (screen_width + 0))
|
||||
zbuffer.append([0] * (screen_width + 0))
|
||||
theta = 0
|
||||
while (theta < 2* math.pi):
|
||||
theta += theta_spacing
|
||||
costheta = math.cos(theta)
|
||||
sintheta = math.sin(theta)
|
||||
phi = 0
|
||||
while (phi < 2*math.pi):
|
||||
phi += phi_spacing
|
||||
cosphi = math.cos(phi)
|
||||
sinphi = math.sin(phi)
|
||||
circlex = R2 + R1*costheta
|
||||
circley = R1*sintheta
|
||||
x = circlex*(cosB*cosphi + sinA*sinB*sinphi) - circley*cosA*sinB
|
||||
y = circlex*(sinB*cosphi - sinA*cosB*sinphi) + circley*cosA*cosB
|
||||
z = K2 + cosA*circlex*sinphi + circley*sinA
|
||||
ooz = 1/z
|
||||
xp = int(screen_width/2 + K1*ooz*x)
|
||||
yp = int(screen_height/2 - K1*ooz*y)
|
||||
L = cosphi*costheta*sinB - cosA*costheta*sinphi - sinA*sintheta + cosB*(cosA*sintheta - costheta*sinA*sinphi)
|
||||
if L > 0:
|
||||
if ooz > zbuffer[xp][yp]:
|
||||
zbuffer[xp][yp] = ooz
|
||||
luminance_index = L*8
|
||||
char_output[xp][yp] = '.,-~:;=!*#$@'[int(luminance_index)]
|
||||
print('\x1b[H')
|
||||
for i in range(screen_height):
|
||||
for j in range(screen_width):
|
||||
print(char_output[i][j], end='')
|
||||
print()
|
||||
theta_spacing = 0.07
|
||||
phi_spacing = 0.02
|
||||
R1 = 1
|
||||
R2 = 2
|
||||
K2 = 5
|
||||
screen_width = 35
|
||||
screen_height = 35
|
||||
K1 = screen_width*K2*3/(8*(R1+R2))
|
||||
print('\x1b[2J')
|
||||
A = 1.0
|
||||
B = 1.0
|
||||
for i in range(250):
|
||||
render_frame(A, B)
|
||||
A += 0.08
|
||||
B += 0.03
|
||||
Reference in New Issue
Block a user