diff --git a/src/main/java/sma/SEIRS_SMA.java b/src/main/java/sma/SEIRS_SMA.java index 4dac58ec9365e7c1275e210671aaad2e44a046e6..86216b54e1f0ca3e99dddec8142fce9f6ea73854 100644 --- a/src/main/java/sma/SEIRS_SMA.java +++ b/src/main/java/sma/SEIRS_SMA.java @@ -34,17 +34,18 @@ public class SEIRS_SMA implements SMA{ private StatisticsCanvas statisticsCanvas; private DisplaySquaredEnvironment display; private Random r; + private FrameBuilder fb = new FrameBuilder(); private HashMap<String,Integer> stats; private void initGraphics() { - statisticsCanvas = new StatisticsCanvas(500,500); + statisticsCanvas = new StatisticsCanvas(300,parameters.getSize()); display = new DisplaySquaredEnvironment(environment,agents); - FrameBuilder frameBuilder = new FrameBuilder(); - frameBuilder.addComponent(display,FrameBuilder.TOP); - frameBuilder.addComponent(statisticsCanvas,FrameBuilder.RIGHT); - frameBuilder.buildWindow(); + fb.setSimulationCanvas(display); + fb.setStatsCanvas(statisticsCanvas); + + fb.buildWindow(); statisticsCanvas.updateValues(environment.getAgentsStatus()); statisticsCanvas.repaint(); } diff --git a/src/main/java/utils/Pair.java b/src/main/java/utils/Pair.java deleted file mode 100644 index f204cf8de8fbcbb28aeb8eb0586361a43ca36864..0000000000000000000000000000000000000000 --- a/src/main/java/utils/Pair.java +++ /dev/null @@ -1,37 +0,0 @@ -package utils; - -public record Pair<A, B>(A first, B second) { - - public int hashCode() { - int hashFirst = first != null ? first.hashCode() : 0; - int hashSecond = second != null ? second.hashCode() : 0; - - return (hashFirst + hashSecond) * hashSecond + hashFirst; - } - - public boolean equals(Object other) { - if (other instanceof Pair otherPair) { - return - ((this.first == otherPair.first || - (this.first != null && otherPair.first != null && - this.first.equals(otherPair.first))) && - (this.second == otherPair.second || - (this.second != null && otherPair.second != null && - this.second.equals(otherPair.second)))); - } - - return false; - } - - public String toString() { - return "(" + first + ", " + second + ")"; - } - - public A getFirst() { - return first; - } - - public B getSecond() { - return second; - } -} diff --git a/src/main/java/view/FrameBuilder.java b/src/main/java/view/FrameBuilder.java index e2ee26674535c1df2308203facc3306ad36e180a..53a726b2f904dbc7948d61d45838fed947cb8415 100644 --- a/src/main/java/view/FrameBuilder.java +++ b/src/main/java/view/FrameBuilder.java @@ -1,68 +1,53 @@ package view; -import utils.Pair; - import javax.swing.*; import java.awt.*; -import java.util.ArrayList; -import java.util.List; public class FrameBuilder { - public final static int LEFT = 0; - public final static int RIGHT = 1; - public final static int TOP = 2; - public final static int BOTTOM = 3; - - private int windowWidth = 0; - private int windowHeight = 0; - - private List<Pair<JComponent,Integer>> components; + private JPanel simulation; + private JPanel stats; public FrameBuilder() { resetWindow(); } public void resetWindow() { - components = new ArrayList<>(); + simulation = null; + stats = null; } + public void setSimulationCanvas(JPanel canvas) { + this.simulation = canvas; + } - public void addComponent(JComponent c,int p) { - var pair = new Pair<>(c,p); + public void setStatsCanvas(JPanel canvas) { + this.stats = canvas; + } + + public void buildWindow() { - switch (p) { - case LEFT,RIGHT -> { - windowWidth+=c.getWidth(); - if (c.getHeight()>windowHeight) - windowHeight = c.getHeight(); - } - case TOP,BOTTOM -> { - windowHeight+=c.getHeight(); - if (c.getWidth()>windowWidth) - windowWidth = c.getWidth(); - } + if (simulation == null || stats == null) { + throw new IllegalStateException("Cannot create windows : one of the canvas is not initialized."); } - components.add(pair); - } + Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); + + if (simulation.getWidth()+stats.getWidth() > screenDimension.getWidth() || + simulation.getHeight() > screenDimension.getHeight()) { + System.err.println("WARNING : screen size is smaller than the simulation window. The simulation will " + + "still work but won't display properly."); + } - public void buildWindow() { JFrame frame = new JFrame(); - frame.setLayout(new java.awt.GridLayout()); + JSplitPane panel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, simulation, stats); + panel.setDividerLocation(simulation.getWidth()); + panel.setDividerSize(0); + frame.setSize(simulation.getWidth()+stats.getWidth(),simulation.getHeight()); + frame.getContentPane().add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - for (Pair<JComponent,Integer> pair : components ) { - switch (pair.getSecond()) { - case TOP -> frame.add(pair.getFirst(),BorderLayout.NORTH); - case BOTTOM -> frame.add(pair.getFirst(),BorderLayout.SOUTH); - case LEFT -> frame.add(pair.getFirst(),BorderLayout.WEST); - case RIGHT -> frame.add(pair.getFirst(),BorderLayout.EAST); - default -> throw new IllegalStateException("Wrong position value"); - } - } - frame.setSize(windowWidth,windowHeight); frame.setResizable(false); + frame.setVisible(true); } } diff --git a/src/main/java/view/StatisticsCanvas.java b/src/main/java/view/StatisticsCanvas.java index 78a8ee0c8b7fb03668e9bb8d95a2705d46d90565..0aff6b279c5e080d8a4003e4d79de2acb39a51f9 100644 --- a/src/main/java/view/StatisticsCanvas.java +++ b/src/main/java/view/StatisticsCanvas.java @@ -9,15 +9,11 @@ import java.util.HashMap; public class StatisticsCanvas extends JPanel { - private final int canvasWidth; - private final int canvasHeight; private HashMap<String,Integer> values; private final int total; public StatisticsCanvas(int width,int height) { this.setDoubleBuffered(false); - canvasHeight = height; - canvasWidth = width; values = new HashMap<>(); total = YamlReader.getParams().getPopulation(); setSize(width, height); @@ -43,15 +39,14 @@ public class StatisticsCanvas extends JPanel { int start = 0; g.clearRect(0,0,getWidth(),getHeight()); for (int i=0 ; i <values.keySet().size();i++) { - String state = (String) values.keySet().toArray()[i]; + String state = values.keySet().toArray()[i].toString(); int value = values.get(state); g.setColor(stringToColor(state)); - float height = ((float)value/total)*canvasHeight; - g.fillRect(10,start,canvasWidth/4,start+(int)height); + float height = ((float)value/total)*getHeight(); + g.fillRect(10,start,getWidth()/4,start+(int)height); start +=height; g.setColor(Color.BLACK); - g.drawString(state + " : "+value,canvasWidth/2,canvasHeight/values.keySet().size()*(1+i)-100); + g.drawString(state + " : "+value,getWidth()/2,getHeight()/values.keySet().size()*(1+i)-100); } - } } diff --git a/src/main/resources/output.png b/src/main/resources/output.png index 004aa96b5e62e1af6815f0f962db7eb37d0d515e..9e9ed57bd7f7b957f9c77d2d984f237a29fcfc28 100644 Binary files a/src/main/resources/output.png and b/src/main/resources/output.png differ diff --git a/src/main/resources/parameters.yaml b/src/main/resources/parameters.yaml index 241988b53dbb854417d77388cfe81fbffc2dacbd..d85b817cdad88272de26dcc0a419caea7b75f634 100644 --- a/src/main/resources/parameters.yaml +++ b/src/main/resources/parameters.yaml @@ -1,13 +1,13 @@ -graphicalMode: false +graphicalMode: true incubationRate: 0.3 -infectionRate: 0.2 -looseImmunityRate: 0.09 -recoveryRate: 0.6 -nbOfCycles: 300 -nbOfPatientZero: 10 -population: 5000 +infectionRate: 0.75 +looseImmunityRate: 0.008 +recoveryRate: 0.1429 +nbOfCycles: 2000 +nbOfPatientZero: 1 +population: 3000 seed: 120 -size: 500 -synchronousMode: true +size: 1000 +synchronousMode: false timeBetweenCycles: 0 -infectionStacks : false \ No newline at end of file +infectionStacks : true \ No newline at end of file