-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathsimulation.h
More file actions
54 lines (45 loc) · 1.93 KB
/
simulation.h
File metadata and controls
54 lines (45 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#pragma once
// Corona Simulation - basic simulation of a human transmissable virus
// Copyright (C) 2020 wbrinksma
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <vector>
#include <memory>
#include "subject.h"
#include "canvas.h"
#include "statistics_handler.h"
namespace corsim
{
/**
* The simulation class controls the simulation. It has a list of all the subjects that being simulated and
* can be run. Its constructor takes a canvas to draw the simulation on and a statistics handler to give an
* update of the number of infected every second during the simulation.
*/
class Simulation
{
public:
Simulation(int width, int height, std::unique_ptr<Canvas> canvas, std::unique_ptr<StatisticsHandler> sh);
void add_subject(Subject&& s);
void run(); //This method starts the simulation but locks execution because theading is not supported in WASM
private:
void wall_collision(Subject& s);
void subject_collision(Subject& s1, Subject& s2);
void static_collision(Subject& s1, Subject& s2, bool emergency);
void tick();
void draw_to_canvas();
std::unique_ptr<Canvas> _canvas;
std::vector<Subject> _subjects;
std::unique_ptr<StatisticsHandler> _sh;
bool running = false;
int tick_speed = 1000/30;
int _sim_width = 800, _sim_height = 500;
};
}