From 77bc6c4c71fd913be9e8679d30edc821c7057d39 Mon Sep 17 00:00:00 2001 From: Looki2000 Date: Sat, 20 May 2023 20:05:38 +0200 Subject: [PATCH] sus --- .gitignore | 1 + gas_sim.py | 25 ++++++++------------- main.py | 60 +++++++++++++++++++++++++++++++++++++++++--------- particles.npy | Bin 0 -> 5632 bytes 4 files changed, 60 insertions(+), 26 deletions(-) create mode 100644 .gitignore create mode 100644 particles.npy diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed8ebf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ \ No newline at end of file diff --git a/gas_sim.py b/gas_sim.py index 5cc53cf..5f1c567 100644 --- a/gas_sim.py +++ b/gas_sim.py @@ -1,30 +1,23 @@ from math import hypot -class Particle: - def __init__(self, pos, vel): - self.pos = pos - self.vel = vel - - def update(self, dt): - self.pos = (self.pos[0] + self.vel[0] * dt, self.pos[1] + self.vel[1] * dt) - - class GasSim: - def __init__(self, particle_radius, particle_compressibility, substeps): + def __init__(self, particle_radius, particle_compressibility, particle_friction, substeps): self.particle_radius = particle_radius self.particle_compressibility = particle_compressibility + self.particle_friction = particle_friction self.substeps = substeps self.particles = [] + self.walls = [] def add_particle(self, pos, vel = (0, 0)): - self.particles.append(Particle(pos, vel)) - - def return_particles_pos(self): - return tuple(particle.pos for particle in self.particles) + self.particles.append([pos, vel]) def cursor_particle_collide_test(self, cursor_pos, cursor_radius): for particle in self.particles: - if hypot(particle.pos[0] - cursor_pos[0], particle.pos[1] - cursor_pos[1]) <= cursor_radius + self.particle_radius: - return True \ No newline at end of file + if hypot(particle[0][0] - cursor_pos[0], particle[0][1] - cursor_pos[1]) <= cursor_radius + self.particle_radius: + return True + + def add_wall(self, start, end): + self.walls.append((start, end)) \ No newline at end of file diff --git a/main.py b/main.py index 4dbce2e..617eac1 100644 --- a/main.py +++ b/main.py @@ -1,15 +1,18 @@ import pygame import pygame.gfxdraw import gas_sim as gs +import numpy as np ##### CONFIG ##### window_size = (1280, 720) +target_fps = 60 + +particle_radius_ws = 0.025 +particle_compressibility = 0.1 +particle_friction = 0.1 -particle_radius_ws = 0.1 -particle_compressibility = 0.5 - -cursor_radius_ws = 0.1 +cursor_radius_ws = 0.15 substeps = 10 ################## @@ -19,6 +22,7 @@ substeps = 10 window_aspect = window_size[0] / window_size[1] cursor_radius_ss = cursor_radius_ws * window_size[1] +particle_radius_ss = particle_radius_ws * window_size[1] # pygame init @@ -27,9 +31,19 @@ window = pygame.display.set_mode(window_size) clock = pygame.time.Clock() - # gas sim init -gas_sim = gs.GasSim(particle_radius_ws, particle_compressibility, substeps) +gas_sim = gs.GasSim(particle_radius_ws, particle_compressibility, particle_friction, substeps) + + +# add walls +gas_sim.add_wall((0, 0), (window_aspect, 0)) +gas_sim.add_wall((0, 1), (window_aspect, 1)) +gas_sim.add_wall((0, 0), (0, 1)) +gas_sim.add_wall((1, 0), (1, 1)) + + +not_loaded_particles = True +dt = target_fps / 1000 @@ -50,9 +64,35 @@ while True: mouse_pos_ws = (mouse_pos_ss[0] / window_size[1], mouse_pos_ss[1] / window_size[1]) # if not colliding with any particles - if not gas_sim.cursor_particle_collide_test(mouse_pos_ws, cursor_radius_ws): + if not gas_sim.cursor_particle_collide_test(mouse_pos_ws, particle_radius_ws): gas_sim.add_particle(mouse_pos_ws) + # on s key press + if pygame.key.get_pressed()[pygame.K_s]: + # save particles to file + particles = tuple(pos for pos, _ in gas_sim.particles) + np.save("particles.npy", particles) + + print("Saved particles to file") + + # on l key press + if not_loaded_particles and pygame.key.get_pressed()[pygame.K_l]: + # load particles from file + particles = np.load("particles.npy") + for particle in particles: + gas_sim.add_particle(particle) + + print("Loaded particles from file") + + not_loaded_particles = False + + + + # update particles + #gas_sim.update(dt) + + + window.fill((0, 0, 0)) @@ -61,11 +101,11 @@ while True: pygame.gfxdraw.aacircle(window, cursor_pos[0], cursor_pos[1], int(cursor_radius_ss), (255, 255, 255)) # draw particles - for particle_pos in gas_sim.return_particles_pos(): + for particle_pos, _ in gas_sim.particles: particle_pos_ss = (int(particle_pos[0] * window_size[1]), int(particle_pos[1] * window_size[1])) - pygame.gfxdraw.aacircle(window, particle_pos_ss[0], particle_pos_ss[1], int(cursor_radius_ss), (255, 255, 255)) + pygame.gfxdraw.aacircle(window, particle_pos_ss[0], particle_pos_ss[1], int(particle_radius_ss), (255, 255, 255)) # update pygame.display.update() - clock.tick(60) \ No newline at end of file + dt = clock.tick(60) / 1000 \ No newline at end of file diff --git a/particles.npy b/particles.npy new file mode 100644 index 0000000000000000000000000000000000000000..cf35a8fb197375c7a4f4f5cc37b13e5e66517842 GIT binary patch literal 5632 zcmbW5OKenS6vuI)3t73r4U5K2F##9Cq8h`uF(#O(Y*-i;(nuQ@M6?)PC>z-5h7B%2 zLRf&Hk|4wcLV)sWpa_(CGfJ=icx8&N=_{KaV>{ zKi>7x&QD)j_wBmx`}YnV_W4F$~#@%cF6>uBxf8G6!x!W7|b$|1& zedd$y?+*86_s$V-;D~q2)pne!?l={5%S*lMhWpOH60W!F_J-^3eg8_k-4|c({;oOE zmowRAj&9E!EtvdkPffdM^5HGPLtBDnlLyyd-n0I4)nwUUH(Bg%nk?(vFUTE}Wqrr} z+_hqR=B|6iH?-}1_cz{mJ?)3KwA@cW_O5aFy6;%SWLZ~d-MHK8UsaO@zg72P52oq^ zC-!7ryo=tzk%#C_IPv=t&!gb^*!eIIEI9FV0=#G3YN2;cxL=ORUi=WRqcLx4Eb8q<9EOvEF7CYJ|OWd0HI}4sw{0%riEIZ2h8{mCW;NBiE zz6#%Guq%!KGsMfYxClR%O@92ScLm+S>Hh97;QZUcX|qT25gXkM)--6re zC*l)$7BW4;-w^xf;pZZG9C2dDBE0rY79J#7w}{^v@;C%PbMSA$_@H$`_*`UvkoeXN zf2jj?=cnzSIVbsC2frXZY2bed{~F}kvaOf;5oKMCJdJ{5h58l4uM*E=*i|I1F*o7^ zyFy)x;b+cdiE|peV(?D!iIE>3c*Ja<;1C1%2zJNFmnH5V`saz?f4mWVJd3a7foFAj zlTRRx+ZcEzIClzurQmA-J5$`}!8=Vn!|c~Md*pEjTocs&417wFXKDDD#m_YO=1t%E zKYCYz^Hca)=9~mPuE4VdI97>w96s0Fuz$tL%Lcf4Ja6*cgKsVD^}wNxe$R357oJTK*8+TgWamr$9W`0%>qV2Lp9JAUp1v9; zE_sWi%e&WuA+`Go4o=#Ia1>i%>U;@H&jYE9STGBMpvW;u|1N zVd5}FoelH+A%2CyB|?5^|Im6nWA$6-3+b;F{FyNSrH|=6R09W{PgXep5qY3^-@~3L z@5k_W5*%((UvGo^D0p2oS?n1mA4bvp+fA9ni?SfFCvT=sf;6 z!09Y?L+jOPaMbzs1om~{&oOwb^Vc!-Xnvd|-z)fk27I)Cp5=Yf^vgW2b>=Ml^7dYM zl{H!B>6FRR{}unU;HG`}9C;W4w{z5y1^UzPIA8s_XL%xi|IPd{X?K|?#<6=EJEEKuAl@Z-Jj;0%p3lOk zGP3S3)9)To7fRT9mwr(uA4AN073z&=vh(M&zz)vR_Eq4aY%wo(&~@QfeCmL#D3*Z4t&EF7vbL$cukStGn|*9 zUft%LEdJiW{xo=A#lHk`xNP&M^tDUm+amEeihbkAhi}UF^+ode2j0(s=W+B#$@>%N z^QfOEd7r?)Q`Uc^|DK^9rQ!D_@>uzDpXV9k`UF3U#w(d4%Gmpq=N0PIQ|u}kj?zDK ztiOx@FRac+TqP3$aiud^@Dc{Spm z!w&ubL%&mMJlFZW4nK5$RsCt|R)_P`*wH3lS?Y%Nhb(xlkf&Mrue{Umz@q7wIj)M` zIe6FN9Q~i?nVl!~P`}@^*i)y@Wy#wtan6xv0qR!{KbMGSn)UksQ3kzp^wlVJK8l|S zt0VF~u5!roOaAv*g6|>AYw>dqeL?J-BF?k$eGVKv^v`ooasCwX(C;RlNAl$JBoWL+u&ahWA$VTLt^_z&*spVHm3q5KeXLMVrtw$5cXXa@Qn%ya z*)cz5zFf0>lK&+-_CJaKzb5q~%DxVLK8C$*>PUzLCCC literal 0 HcmV?d00001