# -*- coding: utf-8 -*- # Marian Dovgialo # marian.dovgialo@fuw.edu.pl #WTFPL from __future__ import print_function, division import scipy.constants as c import matplotlib import matplotlib.backends.backend_agg as agg import matplotlib.pyplot as pb class Planet(object): def __init__(self, x, y, vx, vy, m, name='Earth', ): '''inicjacja planety, potrzebuje pierwotne położenie, szybkość i masę położenie w metrach, szybkość, w metrach na sekundę, masa w kilogramach atrybuty: Planet.x - współrzędna x w metrach Planet.y - współrzędna y w metrach Planet.vx - współrzędna szybkości x w metrach na sekundę Planet.vy - współrzędna szybkości y w metrach na sekundę Planet.m - masa planety ''' self.name = name self.x, self.y, self.vx, self.vy, self.m0 = x, y, vx, vy, m self.m=m def __repr__(self): return self.__str__() def __str__(self): return self.name+' x:{}, y:{}, vx:{}, vy:{}'.format(self.x, self.y, self.vx, self.vy) class System(object): def __init__(self, stepfunc=None, *objects): ''' potrzebuje objekty klasy "Planet" oraz funkcję stepfunc typu: stepfunc(listaplanet, dt) - gdzie listaplanet - lista objektów klasy Planet, musi zwracac liste objektow typu Planet''' self.objects = objects self.stepfunc = stepfunc def move(self, dt): ''' wykonać krok symulacji o dt sekund''' self.objects = self.stepfunc(self.objects, dt) def step(obj, dt): for i in obj: i.x = i.x+1e11*dt return obj def main(system, obs, dt, l): pb.ion() f = pb.figure() ax = f.gca() while 1: print ('krok') print (system.objects) observer = system.objects[obs] system.move(dt) ax.clear() x = [i.x for i in system.objects] y = [i.y for i in system.objects] s = [(i.m/1e15)**0.2 for i in system.objects] # s -- wielkość planet, zależna od masy line = ax.scatter(x,y,s, marker= 'o') # rysowanie planet przez #scatter plot pb.ylim([observer.y-l, observer.y+l]) #limit pola widzenia pb.xlim([observer.x-l, observer.x+l]) title = 'following: '+str(observer).split(':')[0][:-1] pb.title(title) pb.draw() #~ canvas = agg.FigureCanvasAgg(f) #~ canvas.draw() ## rysowanie wykresu matplotliba do pamięci if __name__=='__main__': ziemia = Planet((152082392000.+ 147098290000.)/2, 0, 0, 29.78*1000, 5.9742e24) slonce = Planet(0, 0 ,0, 0, 1.98892e30, name = 'Sol') slonce2 = Planet(-670982900000., 20000000 ,30000, 0, 1.98892e30, name = 'Sol2') mars = Planet(-206669000000/3*2, 0, 0, -24.077*1000, 6.4185e23, name='Mars') moon = Planet((152098232000.+ 147098290000.)/2, 362570000, 1.022e3, 29.78*1000, 7.3477e22, name='Moon') system = System(YOURSTEPFUNC, ziemia, mars, slonce, moon, slonce2 ) #krok symulacji w sekundach dt = 60*60*24 l = 35e10 # pole widoku obs = 2 #centrowanie "kamery" na piewszym elemencie list objektów systemu main(system, obs, dt, l)