From 375e5f966264a25a2606faf32b466e67513ca17d Mon Sep 17 00:00:00 2001 From: Valentin Gehrke Date: Tue, 16 Feb 2016 15:00:26 +0100 Subject: [PATCH] MoSI: Wellen simulation --- game.py | 51 ++++++++++++++++++++++++++++++++++++++++++ water_sim.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 game.py create mode 100644 water_sim.py diff --git a/game.py b/game.py new file mode 100644 index 0000000..77c3ed0 --- /dev/null +++ b/game.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +import pygame +from pygame.locals import * +import math + +class Game: + def __init__(self,width, height,fps): + self._running = True + self._surface = None + self._clock = None + self._width = width + self._height = height + self._fps = fps + + def on_init(self): + pygame.init() + self._surface = pygame.display.set_mode((self._width,self._height), pygame.HWSURFACE | pygame.DOUBLEBUF) + self._clock = pygame.time.Clock() + self._running = True + return True + + def on_event(self,event): + if event.type == pygame.QUIT: + self._running = False + + def on_update(self, dtime): + pass + + def on_render(self, surface): + pass + + def on_draw(self): + self.on_render(self._surface) + pygame.display.flip() + + def on_cleanup(self): + pygame.quit() + + def on_execute(self): + if not self.on_init(): + self._running = False + + while self._running: + self._clock.tick(self._fps) + for event in pygame.event.get(): + self.on_event(event) + self.on_update(1.0 / self._fps) + self.on_draw() + + self.on_cleanup() + diff --git a/water_sim.py b/water_sim.py new file mode 100644 index 0000000..5f4385e --- /dev/null +++ b/water_sim.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python + +from game import * + +class Sim(Game): + def __init__(self,N): + self.N = N + self.init_data(N//2) + self.mousepos = (0,0) + super(Sim, self).__init__( 1000, 600, 120) + + def init_data(self, middle): + self.C = [50] * self.N + for i in range(middle - self.N//4,middle + self.N//4): + if i < 0 or i > self.N: continue + self.C[i] += (1-math.cos(2 * math.pi * (i - middle + self.N//4) / (self.N//2))) * 100 + self.C1 = [0] * self.N + + def on_event(self, event): + if event.type == MOUSEBUTTONDOWN and event.button == 1: + self.init_data( self.N*event.pos[0] // self._width ) + elif event.type == MOUSEMOTION: + self.mousepos = event.pos[:] + else: + super(Sim, self).on_event(event) + + def on_update(self, dtime): + C2 = [0] * self.N + C2[0] = 100 * (self.C[1] - self.C[0]) * 100/self.N + C2[-1] = 100 * (self.C[-2] - self.C[-1]) * 100/self.N + + for i in range(1,self.N-1): + C2[i] = 100 * (self.C[i+1] + self.C[i-1] - 2*self.C[i]) * 0.5 * 100 /(self.N) + + for i in range(0,self.N): + self.C1[i] = (self.C1[i] + C2[i] * dtime) + if i == 0 or i == self.N-1: + self.C1[i] *= 0.98 + else: + self.C1[i] *= 0.9999 + self.C[i] = ( self.C[i] + self.C1[i] * dtime ) + if self.C[i] < 0: + self.C[i] = 0 + + n = self.mousepos[0] * self.N // self._width + alpha = 0.05 + v = self._height - self.mousepos[1] + if self.C[n] > v: + self.C[n] = self.C[n]*(1-alpha) + alpha*v + + def on_render(self,srfc): + BLACK = (0,0,0) + BLUE = (100,100,255) + + srfc.fill(BLACK) + prev_point = ( 0, self._height-int(self.C[0]) ) + for i in range(1,self.N): + new_point = ( (i*self._width)//(self.N-1), self._height - int( self.C[i] ) ) + pygame.draw.line( srfc, BLUE, prev_point, new_point, 3 ) + prev_point = new_point + +if __name__ == '__main__': + Sim(100).on_execute()