From 26c91ea093811c35822367b5478009c6e48a7cd6 Mon Sep 17 00:00:00 2001 From: Looki2000 Date: Sat, 13 May 2023 22:35:56 +0200 Subject: [PATCH] first commit --- logo.png | Bin 0 -> 610 bytes logo_new.png | Bin 0 -> 11167 bytes main.py | 288 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 288 insertions(+) create mode 100644 logo.png create mode 100644 logo_new.png create mode 100644 main.py diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..12d63e7952d96e03d4c306db647434ecefee0bc7 GIT binary patch literal 610 zcmV-o0-gPdP)EX>4Tx04R}tkv&MmKp2MKrk09S9PA+CkfG|J1yK=4sbUcO$^z3+Xw`wkEq6{eb96M(8& zMk*c?v$<6<_=*5RG{-P1F;h>Z7c=l2U-$6w{VvM0yzBlPy-MC>fKMczW4d7xZxGLH zS~}-_;xH>o3h_DdxIq^re&o9B@*C%(!vfC?8=2HRahO;vcCg&RtYoOf)5H-))hJ)c zx~y>C;;dF`taVTR!cbmYNpqdn5aL)u0!fIFQ9~IOScuZDkzyi6=P?iepyN-HOD0zt zj2sK7LWSh`!T;cQZ_UEgq?;6q0f86W{ul;=yFjyU+uz5w-8=#O&%l+|_E#Ig>?i5< zwiY=8`nG|K>$WEE0hc?#z>_W+k|X(P355dien#Jv1Nv`)o;9~`t#h0{02%7l@(pls z2#gddd)?#R-JN~=x2DyPx# literal 0 HcmV?d00001 diff --git a/logo_new.png b/logo_new.png new file mode 100644 index 0000000000000000000000000000000000000000..5725ec8f93f12e24dbf0d89b46fe7c819c3d49d5 GIT binary patch literal 11167 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 0: + if rot_zoom_delay > 0: + rot_zoom_delay -= target_delta_time + else: # zooming more and rotating + rot_speed += rot_speed_increase * target_delta_time + zoom_speed += zoom_speed_increase * target_delta_time + + angle += rot_speed * target_delta_time + + # rotate and zoom + rot_cos = cos(angle) + rot_sin = sin(angle) + + if not can_rot: + can_rot = True + + # fade + if fade_delay > 0: + fade_delay -= target_delta_time + else: + fade_val -= fade_speed * target_delta_time + if fade_val < 0: + continue + + zoom *= 1 + zoom_speed * target_delta_time + + # calculate pixel points positions + scaled_pixel_size_px = pixel_size_px * zoom + half_scaled_pixel_size_px = round(scaled_pixel_size_px / 2) + scaled_pixel_size_px = round(scaled_pixel_size_px) + + pixel_points = ( + (0, 0), + (scaled_pixel_size_px, 0), + (scaled_pixel_size_px, scaled_pixel_size_px), + (0, scaled_pixel_size_px) + ) + + pixel_points = tuple( + ( + pixel_point[0] - half_scaled_pixel_size_px, + pixel_point[1] - half_scaled_pixel_size_px + ) + for pixel_point in pixel_points + ) + + # rotate pixel points + if can_rot: + pixel_points = tuple( + ( + pixel_point[0] * rot_cos - pixel_point[1] * rot_sin, + pixel_point[0] * rot_sin + pixel_point[1] * rot_cos + ) + for pixel_point in pixel_points + ) + + + # draw pixels + for pixel_idx, pixel in enumerate(pixels_pos_and_vel): + # check if delay is over + if pixel[2] > 0: + pixel[2] -= target_delta_time + continue + + ## simulation (take target_delta_time into account) + + # get pixel pos and vel + pos = pixel[0] + vel = pixel[1] + + # delta pos (target pos - current pos) + delta_pos = [pixels_target_pos[pixel_idx][0] - pos[0], pixels_target_pos[pixel_idx][1] - pos[1]] + + # update velocity + vel[0] += delta_pos[0] * stiffness * target_delta_time + vel[1] += delta_pos[1] * stiffness * target_delta_time + + # damping + vel[0] *= damping_multiplier + vel[1] *= damping_multiplier + + # update pos + pos[0] += vel[0] * target_delta_time + pos[1] += vel[1] * target_delta_time + + # update pixel pos and vel + pixels_pos_and_vel[pixel_idx][0:2] = [pos, vel] + + + ## draw pixel + + # rotate + if can_rot: + pixel_draw_pos = ( + pos[0] * rot_cos - pos[1] * rot_sin, + pos[0] * rot_sin + pos[1] * rot_cos + ) + else: + pixel_draw_pos = pos + + # zoom + perceived_zoom = zoom + pixel_draw_pos = (pixel_draw_pos[0] * perceived_zoom, pixel_draw_pos[1] * perceived_zoom) + + # convert to screen space + pixel_draw_pos = ( + pixel_draw_pos[0] * window_size[1] + half_window_size[0], + pixel_draw_pos[1] * window_size[1] + half_window_size[1] + ) + + + # DEBUG draw sphere + #pygame.draw.circle(window, (255, 255, 255), (round(pixel_draw_pos[0]), round(pixel_draw_pos[1])), 200, 5) + + # DEBUG draw dot + #pygame.draw.circle(window, (255, 0, 0), (round(pixel_draw_pos[0]), round(pixel_draw_pos[1])), 1) + + # draw pixel + points = tuple( + (round(pixel_draw_pos[0] + pixel_point[0]), + round(pixel_draw_pos[1] + pixel_point[1])) for pixel_point in pixel_points + ) + + pygame.gfxdraw.aapolygon( + window, + points, + (fade_val,)*3 + ) + + pygame.gfxdraw.filled_polygon( + window, + points, + (fade_val,)*3 + ) + + + + # update + pygame.display.update() + clock.tick(60) \ No newline at end of file