This repository has been archived on 2025-05-08. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
animations/pydrocsid.py
2021-12-06 18:13:38 +01:00

119 lines
3 KiB
Python

from math import pi
import pygame
from animations import Animation, rotate
BACKGROUND = (24, 25, 28)
GREEN1 = (178, 229, 203)
GREEN2 = (102, 204, 152)
GREEN3 = (50, 153, 101)
SIZE = 512
PADDING = 2 / 21
RECORD = True
FPS = 60
class PyDrocsid(Animation):
def __init__(self):
super().__init__(SIZE, SIZE, "pydrocsid", FPS, RECORD)
def render_frame(self, r):
self.win.fill(BACKGROUND)
size = SIZE / (1 + 2 * PADDING)
padding = size * PADDING
def draw_polygon(_color, *_points):
pygame.draw.polygon(
self.win,
_color,
[(round(padding + (x + 1) / 2 * size), round(padding + (y + 1) / 2 * size)) for x, y in _points],
)
for i in range(4):
p1 = 0.5, 0
p2 = 0, -0.5
p3 = 0.5, -0.5
orig = p1, p2, p3
k = (r - 3) * 1
if k > 0:
p1 = p1[0] + k, p1[1] + k
p2 = p2[0] + k, p2[1] + k
p3 = p3[0] + k, p3[1] + k
draw_polygon(
GREEN3, *[rotate(*rotate(*p, min(0.5, max(0, r - i / 6)) * pi, *p1), i * pi / 2) for p in [p1, p2, p3]]
)
if k > 0:
p1, p2, p3 = orig
p1 = p1[0] - k, p1[1] + k
p2 = p2[0] - k, p2[1] + k
p3 = p3[0] - k, p3[1] + k
draw_polygon(
GREEN3, *[rotate(*rotate(*p, min(1, max(0, r - i / 6)) * pi, *p1), i * pi / 2) for p in [p1, p2, p3]]
)
if r - i / 6 < 1:
continue
k = max(0, min(1, (r - i / 6 - 1) * 2))
p1 = 0.5, 0.5
p2 = 1, 0.5
p3 = 1, 0.5 + k * 0.25
if r > 3:
k = (r - 3) * 1
p1 = p1[0] + k, p1[1] + k
p2 = p2[0] + k, p2[1] + k
p3 = p3[0] + k, p3[1] + k
draw_polygon(GREEN1, *[rotate(*p, i * pi / 2) for p in [p1, p2, p3]])
draw_polygon(GREEN2, (-0.5, -0.5), (-0.5, 0.5), (0.5, 0.5), (0.5, -0.5))
r -= 1.25
if r < 0 or r > 2.2:
return
for i in range(4):
p1 = 0.3, -0.3
p2 = 0.3, -0.05
p3 = 0.05, (p1[1] + p2[1]) / 2
m = [sum(p[i] for p in [p1, p2, p3]) / 3 for i in range(2)]
s = max(0, min(1, (r - i / 6) * 4))
if r > 1.75:
k = (r - 1.75) * 2
p1 = p1[0] - k, p1[1]
p2 = p2[0] - k, p2[1]
p3 = p3[0] - k, p3[1]
draw_polygon(
BACKGROUND, *[rotate(*[p[k] * s + m[k] * (1 - s) for k in range(2)], -i * pi / 2) for p in [p1, p2, p3]]
)
def render(self):
r = 2.75
dr = 0.025
while r < 4.5:
self.render_frame(r)
r += dr
yield
r = 0
while r < 2:
self.render_frame(r)
r += dr
yield
for _ in range(self.fps // 2):
yield
animation = PyDrocsid()
animation.run()