diff --git a/.classpath b/.classpath index 9aa3736ab285bbaeb493abcb3491869283d4e428..64c55e8a3ee706520c825a3ce1c4de33cd868c6e 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,26 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> - <classpathentry kind="lib" path="C:/Users/guillaume.garbay/workspace/Lib/SimAquaLife/simaqualife-2.0.jar"/> - <classpathentry kind="output" path="bin"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry exported="true" kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" output="target/classes" path="src/main/java"> + <attributes> + <attribute name="optional" value="true"/> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" output="target/test-classes" path="src/test/java"> + <attributes> + <attribute name="optional" value="true"/> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="output" path="target/classes"/> </classpath> diff --git a/.project b/.project index 9dd8a958373526383d3debf4d1b4b0fbf2573d60..6eaedf9a5018bbb7a31943b71fe40f1a9ea3c737 100644 --- a/.project +++ b/.project @@ -10,8 +10,15 @@ <arguments> </arguments> </buildCommand> + <buildCommand> + <name>org.eclipse.m2e.core.maven2Builder</name> + <arguments> + </arguments> + </buildCommand> </buildSpec> <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.m2e.core.maven2Nature</nature> <nature>org.eclipse.jdt.core.javanature</nature> </natures> </projectDescription> diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index e532d9854f267cc2d68d89135fd93258c7025e3b..e5e3279d2661b305656ed6d87f22ec7b575185fb 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,2 +1,5 @@ eclipse.preferences.version=1 -encoding//data/input=ISO-8859-1 +encoding//data/input=ISO-8859-15 +encoding//src/main/java=ISO-8859-15 +encoding//src/test/java=ISO-8859-15 +encoding/<project>=ISO-8859-15 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index bb35fa0a87b032ee9d0b128004c1edbd464f07bf..6472c7cc0af3a3faf6399010e8e2ec85a63d8979 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,11 +1,13 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..14b697b7bbb0d85e8d8ee19141a2a92d9ce211be --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/.settings/org.eclipse.pde.core.prefs b/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..394603ceee708bd43e5a91a5fe79641786f1fcc9 --- /dev/null +++ b/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,2 @@ +BUNDLE_ROOT_PATH=target/classes +eclipse.preferences.version=1 diff --git a/data/input/fish.xml b/data/input/fish.xml index 1e2061e861c63657268facf7c3fa13de120319c1..8f9b0b7e31b7d0c606852b00383d7f89407c97a0 100644 --- a/data/input/fish.xml +++ b/data/input/fish.xml @@ -1,3 +1,5 @@ +<?xml version="1.0" encoding="ISO-8859-15"?> +<!DOCTYPE xml> <list> <pikelake.pikes.PikesGroup> <weightAtAgeThreshold>5.0</weightAtAgeThreshold> diff --git a/data/input/fishLight.xml b/data/input/fishLight.xml index 01584f97eb39f46023570fbda1e79ca7cae9ae08..c3fc52a4a87c7f73797cb670107e7e26badb9501 100644 --- a/data/input/fishLight.xml +++ b/data/input/fishLight.xml @@ -1,28 +1,31 @@ +<?xml version="1.0" encoding="ISO-8859-15"?> +<!DOCTYPE xml> <list> - <pikelake.pikes.PikesGroup> - <weightAtAgeThreshold>5.0</weightAtAgeThreshold> - <monthOfBirth>6</monthOfBirth> - <processes> - <processesAtBegin> - <pikelake.pikes.PikesPopulateProcess> - <initialNumberOfPikes>1</initialNumberOfPikes> - </pikelake.pikes.PikesPopulateProcess> - </processesAtBegin> - <processesEachStep> - <pikelake.pikes.PikeMovement> - <distance>10.0</distance> - </pikelake.pikes.PikeMovement> - <pikelake.pikes.PikeHuntProcess> - <satiety>0.5</satiety> - </pikelake.pikes.PikeHuntProcess> - <pikelake.pikes.PikeGrowthProcess> - <convertionFactor>0.25</convertionFactor> - <slimRate>0.9</slimRate> - </pikelake.pikes.PikeGrowthProcess> - <pikelake.pikes.PikeObservationProcess/> - <fr.cemagref.simaqualife.kernel.processes.FireAquaNismsChangesToObservers/> - </processesEachStep> - </processes> - <useCemetery>false</useCemetery> - </pikelake.pikes.PikesGroup> + <pikelake.pikes.PikesGroup> + <weightAtAgeThreshold>5.0</weightAtAgeThreshold> + <monthOfBirth>6</monthOfBirth> + <processes> + <processesAtBegin> + <pikelake.pikes.PikesPopulateProcess> + <initialNumberOfPikes>10</initialNumberOfPikes> + </pikelake.pikes.PikesPopulateProcess> + </processesAtBegin> + <processesEachStep> + <pikelake.pikes.PikeMovement> + <distance>10</distance> + </pikelake.pikes.PikeMovement> + <pikelake.pikes.PikeHuntProcess> + <satiety>0.5</satiety> + </pikelake.pikes.PikeHuntProcess> + <pikelake.pikes.PikeGrowthProcess> + <convertionFactor>0.25</convertionFactor> + <slimRate>0.9</slimRate> + </pikelake.pikes.PikeGrowthProcess> + <pikelake.pikes.PikeObservationProcess/> + <pikelake.pikes.PikeMovement/> + <fr.cemagref.simaqualife.kernel.processes.FireAquaNismsChangesToObservers /> + </processesEachStep> + </processes> + <useCemetery>false</useCemetery> + </pikelake.pikes.PikesGroup> </list> \ No newline at end of file diff --git a/data/input/grid.xml b/data/input/grid.xml index 58cdec728052d1a6af3c4a319aa173690084eb64..07a5b2b3db65cd541df00d4e5989e23c0a370438 100644 --- a/data/input/grid.xml +++ b/data/input/grid.xml @@ -1,8 +1,12 @@ -<?xml version="1.0" encoding="ISO-8859-1"?> +<?xml version="1.0" encoding="ISO-8859-15"?> <!DOCTYPE xml> <pikelake.Grid> + <!--inputFileName>river2DShape.txt</inputFileName--> + <!--depthCoef >2.3</depthCoef--> + <!--ncFileName>data/SiAM3168.nc</ncFileName--> + <!--sectorFileName>data/shapefile.EstuarySector.txt</sectorFileName--> <torusType>BOTH</torusType> <neighborsType>NEIGHBORHOOD_VON_NEUMANN</neighborsType> - <gridWidth>10</gridWidth> - <gridHeight>10</gridHeight> + <gridWidth>214</gridWidth> + <gridHeight>243</gridHeight> </pikelake.Grid> \ No newline at end of file diff --git a/data/input/observersBatch.xml b/data/input/observersBatch.xml index 54ed95bbc90303ef2bb8bfae08bc284e4c9006f9..7ed857d57b41b5a53aed1422771053937640bd06 100644 --- a/data/input/observersBatch.xml +++ b/data/input/observersBatch.xml @@ -1,3 +1,5 @@ +<?xml version="1.0" encoding="ISO-8859-15"?> +<!DOCTYPE xml> <hashtable> <entry> <java-class>pikeprey.pikes.PikesGroup</java-class> diff --git a/data/input/observersCharts.xml b/data/input/observersCharts.xml index d8381767312783b51d74bf15d6f84054e15df677..3323d888acd01635384b96defc56a62d477a8d80 100644 --- a/data/input/observersCharts.xml +++ b/data/input/observersCharts.xml @@ -1,28 +1,92 @@ +<?xml version="1.0" encoding="ISO-8859-15"?> +<!DOCTYPE xml> <hashtable> - <entry> - <java-class>pikelake.pikes.PikesGroup</java-class> - <fr.cemagref.observation.kernel.ObservablesHandler> - <observers> - <fr.cemagref.observation.observers.jfreechart.TemporalSerieChart> - <graphType>LINE</graphType> - <title>Observation of pikes biomass</title> - <xAxisLabel>Time (month)</xAxisLabel> - <yAxisLabel>pikes biomass</yAxisLabel> - </fr.cemagref.observation.observers.jfreechart.TemporalSerieChart> - </observers> - </fr.cemagref.observation.kernel.ObservablesHandler> - </entry> - <entry> - <java-class>pikelake.pikes.Pike</java-class> - <fr.cemagref.observation.kernel.ObservablesHandler> - <observers> - <fr.cemagref.observation.observers.jfreechart.TemporalSerieChart> - <graphType>LINE</graphType> - <title>Observation of pikes</title> - <xAxisLabel>Time (month)</xAxisLabel> - <yAxisLabel></yAxisLabel> - </fr.cemagref.observation.observers.jfreechart.TemporalSerieChart> - </observers> - </fr.cemagref.observation.kernel.ObservablesHandler> - </entry> + + <entry> + <java-class>pikelake.GridObserver</java-class> + <fr.cemagref.observation.kernel.ObservablesHandler> + <observers> + <fr.cemagref.simaqualife.extensions.spatial2D.Movement2DObserver> + <title>Bariousses</title> + <bgColor> + <red>168</red> + <green>0</green> + <blue>0</blue> + <alpha>255</alpha> + </bgColor> + <pikeColor> + <red>0</red> + <green>0</green> + <blue>255</blue> + <alpha>255</alpha> + </pikeColor> + <envColor> + <red>0</red> + <green>0</green> + <blue>255</blue> + <alpha>255</alpha> + </envColor> + </fr.cemagref.simaqualife.extensions.spatial2D.Movement2DObserver> + </observers> + </fr.cemagref.observation.kernel.ObservablesHandler> + </entry> + + + <!--entry> + <java-class>fr.cemagref.simaqualife.kernel.AquaticWorld</java-class> + <fr.cemagref.observation.kernel.ObservablesHandler> + <observers> + <pikelake.environment.Movement2DWithinShapeObserver> + <title>Bariousses</title> + <bgColor> + <red>168</red> + <green>0</green> + <blue>0</blue> + <alpha>255</alpha> + </bgColor> + <shapeColor> + <red>0</red> + <green>0</green> + <blue>255</blue> + <alpha>255</alpha> + </shapeColor> + <margin>1</margin> + <sizeOfDisplayedIndividuals>2</sizeOfDisplayedIndividuals> + </pikelake.environment.Movement2DWithinShapeObserver> + </observers> + </fr.cemagref.observation.kernel.ObservablesHandler> + </entry--> + + + <!--entry> + <java-class>pikelake.Grid</java-class> + <fr.cemagref.observation.kernel.ObservablesHandler> + <observers> + <fr.cemagref.simaqualife.extensions.spatial2D.Movement2DObserver> + <Pilot></Pilot> + <title>Bariousses</title> + <groupsColors> + <red>255</red> + <green>0</green> + <blue>0</blue> + <alpha>255</alpha> + </groupsColors> + <bgColor> + <red>0</red> + <green>0</green> + <blue>0</blue> + <alpha>255</alpha> + </bgColor> + <envColor> + <red>0</red> + <green>0</green> + <blue>255</blue> + <alpha>255</alpha> + </envColor> + <cellSizeMin>1</cellSizeMin> + </fr.cemagref.simaqualife.extensions.spatial2D.Movement2DObserver> + </observers> + </fr.cemagref.observation.kernel.ObservablesHandler> + </entry--> + </hashtable> diff --git a/src/main/java/pikelake/Cell.java b/src/main/java/pikelake/Cell.java index 95fbff0a7a00930f859862c5be227302f38ec255..848467dd40db00dd4f108fe055c5cb3915f3da10 100644 --- a/src/main/java/pikelake/Cell.java +++ b/src/main/java/pikelake/Cell.java @@ -1,64 +1,39 @@ package pikelake; -import fr.cemagref.simaqualife.extensions.spatial2D.Grid2D; + +//import fr.cemagref.simaqualife.extensions.spatial2D.Grid2D; import fr.cemagref.simaqualife.extensions.spatial2D.IndexedCell; -import fr.cemagref.simaqualife.pilot.Pilot; +//import fr.cemagref.simaqualife.pilot.Pilot; import java.util.ArrayList; import java.util.List; import pikelake.pikes.Pike; -// import predatorprey.preys.Prey; ///////////////////////////////////////////////////////////////// public class Cell extends IndexedCell { - /** - * <code>preyCarryingCapacity</code> number of preys that this place can - * support - */ -// private int preyCarryingCapacity; ///////////////////////////////////////////////////////////////// - /** * <code>habitatQuality</code> The quality of this place (pike point of * view). A high value means that preys are vulnerable for the pikes */ private double habitatQuality; - /** - * <code>preys</code> The list of preys in this place - */ -// private transient List<Prey> preys; ///////////////////////////////////////////////////////////////// - /** * <code>pikes</code> The list of pikes in this place */ private transient List<Pike> pikes; - public Cell(int index, double habitatQuality) { // , int preyCarryingCapacity) { ////////////////////// + public Cell(int index, double habitatQuality) { super(index); this.habitatQuality = habitatQuality; -// this.preyCarryingCapacity = preyCarryingCapacity; ///////////////////////////////////////////////////////////////// -// preys = new ArrayList<Prey>(); ///////////////////////////////////////////////////////////////// pikes = new ArrayList<Pike>(); } -// public List<Prey> getPreys() { ///////////////////////////////////////////////////////////////// -// return preys; ///////////////////////////////////////////////////////////////// -// } ///////////////////////////////////////////////////////////////// - public List<Pike> getPikes() { return pikes; } -// public boolean addPrey(Prey prey) { ///////////////////////////////////////////////////////////////// -// return preys.add(prey); ///////////////////////////////////////////////////////////////// -// } ///////////////////////////////////////////////////////////////// - -// public boolean removePrey(Prey prey) { ///////////////////////////////////////////////////////////////// -// return preys.remove(prey); ///////////////////////////////////////////////////////////////// -// } ///////////////////////////////////////////////////////////////// - public boolean addPike(Pike pike) { return pikes.add(pike); } @@ -71,8 +46,4 @@ public class Cell extends IndexedCell { return habitatQuality; } -// public int getPreyCarryingCapacity() { ///////////////////////////////////////////////////////////////// -// return preyCarryingCapacity; ///////////////////////////////////////////////////////////////// -// } ///////////////////////////////////////////////////////////////// - } diff --git a/src/main/java/pikelake/Grid.java b/src/main/java/pikelake/Grid.java index 288f4a81a3e4cb5d4f0a0418c0dd375c5be5e58f..c610ed27c1d871584ce7bee0b43987ec0fcce303 100644 --- a/src/main/java/pikelake/Grid.java +++ b/src/main/java/pikelake/Grid.java @@ -1,12 +1,14 @@ package pikelake; import fr.cemagref.simaqualife.extensions.spatial2D.Grid2D; -import fr.cemagref.simaqualife.extensions.spatial2D.Grid2D.NeighborsType; +//import fr.cemagref.simaqualife.extensions.spatial2D.Grid2D.NeighborsType; import fr.cemagref.simaqualife.kernel.AquaNismsGroup; import fr.cemagref.simaqualife.kernel.util.TransientParameters.InitTransientParameters; import fr.cemagref.simaqualife.pilot.Pilot; + import java.util.ArrayList; import java.util.List; + import pikelake.pikes.Pike; public class Grid extends Grid2D<Cell, Individual> { @@ -18,25 +20,30 @@ public class Grid extends Grid2D<Cell, Individual> { @InitTransientParameters public void initTransientParameters(Pilot pilot) { - // TODO + // TODO intialisation de chaque maille avec le hsi + // TODO empty grid this.grid = new Cell[]{new Cell(0, 0.0), new Cell(1, 0.0)}; + } - @Override + @SuppressWarnings("rawtypes") + @Override public void addAquaNism(Individual ind, AquaNismsGroup group) { super.addAquaNism(ind, group); ind.getPosition().addPike((Pike) ind); } - @Override + @SuppressWarnings("rawtypes") + @Override public void moveAquaNism(Individual ind, AquaNismsGroup group, Cell dest) { super.moveAquaNism(ind, group, dest); this.removeAquaNism(ind, group); dest.addPike((Pike) ind); } - @Override + @SuppressWarnings("rawtypes") + @Override public void removeAquaNism(Individual ind, AquaNismsGroup group) { super.removeAquaNism(ind, group); ind.getPosition().removePike((Pike) ind); diff --git a/src/main/java/pikelake/GridObserver.java b/src/main/java/pikelake/GridObserver.java index 3df8e09008dfc71b7b376e4cf8a08094ef02295b..6306d7d5967c2827e1c7cdfe0a53f16df1c0dced 100644 --- a/src/main/java/pikelake/GridObserver.java +++ b/src/main/java/pikelake/GridObserver.java @@ -20,6 +20,7 @@ import com.thoughtworks.xstream.io.xml.DomDriver; import fr.cemagref.observation.gui.Configurable; import fr.cemagref.observation.gui.Drawable; +//import fr.cemagref.observation.kernel.Observable; import fr.cemagref.observation.kernel.ObservablesHandler; import fr.cemagref.observation.kernel.ObserverListener; import fr.cemagref.ohoui.annotations.Description; @@ -33,9 +34,11 @@ import fr.cemagref.simaqualife.pilot.Pilot; @SuppressWarnings("serial") @NoRecursive public class GridObserver extends ObserverListener implements Configurable, Drawable, MouseMotionListener { - + private transient JComponent display; + private transient JLabel label; + private transient Grid grid; private String title; @@ -58,11 +61,15 @@ public class GridObserver extends ObserverListener implements Configurable, Draw } public void valueChanged(ObservablesHandler clObservable, Object instance, long t) { - display.repaint(); + // modif pour effectuer les déplacements + + + display.repaint(); } @TransientParameters.InitTransientParameters public void init(Pilot pilot) { + // init display component display = new JPanel(new BorderLayout()); DisplayComponent displayComponent = new DisplayComponent(); @@ -154,7 +161,7 @@ public class GridObserver extends ObserverListener implements Configurable, Draw g.fillRect(0, 0, getWidth(), getHeight()); Rectangle2D.Double cellRect = null; Rectangle2D.Double pikeRect = null; - double preyDiameterX, preyDiameterY, pikeWidth, pikeHeight; + double pikeWidth, pikeHeight; // draw each cell for (int i = 0; i < grid.getCells().length; i++) { // the bounds of a cell diff --git a/src/main/java/pikelake/environment/Movement2DWithinShapeObserver.java b/src/main/java/pikelake/environment/Movement2DWithinShapeObserver.java new file mode 100644 index 0000000000000000000000000000000000000000..da2eefd60f3a81bc31dd19cdbb00c80ea0f4724f --- /dev/null +++ b/src/main/java/pikelake/environment/Movement2DWithinShapeObserver.java @@ -0,0 +1,202 @@ +package pikelake.environment; + +import fr.cemagref.observation.gui.Configurable; +import fr.cemagref.observation.gui.Drawable; +//import fr.cemagref.observation.kernel.ObservablesHandler; +import fr.cemagref.observation.kernel.ObserverListener; +import fr.cemagref.ohoui.swing.OhOUIDialog; +import fr.cemagref.ohoui.swing.OhOUI; +import fr.cemagref.ohoui.annotations.Description; +import fr.cemagref.ohoui.annotations.NoRecursive; +import fr.cemagref.ohoui.filters.NoTransientField; +import fr.cemagref.simaqualife.kernel.AquaNism; +import fr.cemagref.simaqualife.kernel.AquaNismsGroup; +import fr.cemagref.simaqualife.pilot.Pilot; +//import fr.cemagref.simaqualife.pilot.gui.util.FileChooserField; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.GeneralPath; +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import javax.swing.JComponent; + +@SuppressWarnings({ "serial" }) +@NoRecursive +public abstract class Movement2DWithinShapeObserver extends ObserverListener implements Configurable, Drawable { + +// private transient FileChooserField modulesChooser; + private transient JComponent display; + + private transient GeneralPath generalPath; + private transient List<AquaNismsGroup<? extends AquaNism<? extends Point2D,?>,?>> groups; + + private String title; + + // TODO supress transient when list will be supported by AutOUI + @Description (name="Groups colors",tooltip="Colors af aquanisms groups") + private transient List<Color> groupsColors; + @Description (name="Background color",tooltip="Background color") + private Color bgColor; + @Description (name="River color",tooltip="River color") + private Color shapeColor; + + private int margin; + private int sizeOfDisplayedIndividuals; + // use for determine if generalPath must be rescaled + private transient int displayWidthBak,displayHeightBak; + // used for coordinates rescaling + private transient double repositioningTranslateX,repositioningTranslateY; + private transient double shapeOriginalWidth, shapeOriginalHeight; + private transient double shapeAspectRatio; + private transient double rescaleFactorWithOriginal; + + public Movement2DWithinShapeObserver(int margin) { + this(margin,Color.BLACK,Color.BLUE); + } + + public Movement2DWithinShapeObserver() { + this(Color.BLACK,Color.BLUE); + } + + public Movement2DWithinShapeObserver(Color bgColor,Color shapeColor) { + this(0,bgColor,shapeColor); + } + + public Movement2DWithinShapeObserver(int margin,Color bgColor,Color shapeColor) { + this.margin = margin; + this.bgColor = bgColor; + this.shapeColor = shapeColor; + } + + public String getTitle() { + return title; + } + + public JComponent getDisplay() { + return display; + } + + public void valueChanged(ObserverListener clObservable, Object instance, int t) { + display.repaint(); + } + + @SuppressWarnings("unchecked") + public void init() { + Pilot pilot = new Pilot(); + + display = new DisplayComponent(); + display.setVisible(false); + display.setDoubleBuffered(true); + + displayWidthBak = 0; + displayHeightBak = 0; + // init shape + this.generalPath = new GeneralPath(((AsShapeConvertible)pilot.getAquaticWorld().getEnvironment()).getShape()); + // original dimension storage + this.shapeOriginalWidth = this.generalPath.getBounds().getWidth(); + this.shapeOriginalHeight = this.generalPath.getBounds().getHeight(); + this.shapeAspectRatio = shapeOriginalWidth / shapeOriginalHeight; + // repositionning the shape to (0,0) + this.repositioningTranslateX = - this.generalPath.getBounds().getX(); + this.repositioningTranslateY = - this.generalPath.getBounds().getY(); + this.generalPath.transform(AffineTransform.getTranslateInstance(this.margin+repositioningTranslateX,this.margin+repositioningTranslateY)); + // vertical flip + this.generalPath.transform(AffineTransform.getScaleInstance(1,-1)); + this.generalPath.transform(AffineTransform.getTranslateInstance(0,shapeOriginalHeight)); + + groups = new ArrayList<AquaNismsGroup<? extends AquaNism<? extends Point2D,?>,?>>((Collection<? extends AquaNismsGroup<? extends AquaNism<? extends Point2D, ?>, ?>>)pilot.getAquaticWorld().getAquaNismsGroupsList()); + if (groups!=null) { + display.setVisible(true); + } + groupsColors = new ArrayList<Color>(); + groupsColors.add(Color.RED); + groupsColors.add(Color.GREEN); + groupsColors.add(Color.YELLOW); + groupsColors.add(Color.CYAN); + groupsColors.add(Color.GRAY); + display.repaint(); + } + + public void disable() { + display.setVisible(false); + } + + public static interface AsShapeConvertible { + public Shape getShape(); + } + + public void configure() { + OhOUIDialog dialog = OhOUI.getDialog(null,this,new NoTransientField()); + dialog.setSize(new Dimension(480, 200)); + dialog.setVisible(true); + display.repaint(); + } + + public void addObservable(ObserverListener classObservable) { + // nothing to do + } + + public void close() { + // nothing to do + + } + + private class DisplayComponent extends JComponent { + + @Override + protected synchronized void paintComponent(Graphics g) { + super.paintComponents(g); + Graphics2D g2d = (Graphics2D)g; + // determine if generalPath must be rescaled + if ( (this.getWidth() != displayWidthBak) || (this.getHeight() != displayHeightBak) ) { + // backup for comparaison in the next loop + displayWidthBak = this.getWidth(); + displayHeightBak = this.getHeight(); + // compute the rescale factor with keeping the aspect ratio + double rescaleFactor; + // TODO calcul faux quand margin > 0 + if ( ((double)displayWidthBak/displayHeightBak) < shapeAspectRatio ) { + rescaleFactor = displayWidthBak / (generalPath.getBounds().getWidth()); + rescaleFactorWithOriginal = displayWidthBak / shapeOriginalWidth; + } else { + rescaleFactor = displayHeightBak / (generalPath.getBounds().getHeight()); + rescaleFactorWithOriginal = displayHeightBak / shapeOriginalHeight; + } + // rescale the generalPath + generalPath.transform( + AffineTransform.getScaleInstance(rescaleFactor,rescaleFactor) + ); + + } + // Draw Background + g.setColor(bgColor); + g.fillRect(0, 0, getWidth(), getHeight()); + // Draw the generalPath + g.setColor(shapeColor); + g2d.fill(generalPath); + //g.setColor(aquanismsColor); + Iterator<Color> colorsIterator = groupsColors.iterator(); + // Draw aquanisms + for (AquaNismsGroup<? extends AquaNism<? extends Point2D,?>,?> group : groups) { + if (colorsIterator.hasNext()) g.setColor(colorsIterator.next()); + for (AquaNism<? extends Point2D,?> aquanism : group.getAquaNismsList()) { + Rectangle rect=new Rectangle((int)((aquanism.getPosition().getX()+repositioningTranslateX) * rescaleFactorWithOriginal), + (int)(generalPath.getBounds().getHeight() /*flip vertically*/ - (aquanism.getPosition().getY()+repositioningTranslateY) * rescaleFactorWithOriginal), + sizeOfDisplayedIndividuals,sizeOfDisplayedIndividuals); + // draw the individuals after repositioning and rescaling the position + g2d.fill(rect); + } + } + } + } +} diff --git a/src/main/java/pikelake/pikes/PikeHuntProcess.java b/src/main/java/pikelake/pikes/PikeHuntProcess.java index b2321e2090a1df773147c7fafc593440d6f2b112..84d7c4ad7e6a7ac9fd82566f6786e6c0f921c8ef 100644 --- a/src/main/java/pikelake/pikes/PikeHuntProcess.java +++ b/src/main/java/pikelake/pikes/PikeHuntProcess.java @@ -1,12 +1,10 @@ package pikelake.pikes; -import java.util.Collections; +//import java.util.Collections; import java.util.Comparator; -import java.util.List; +//import java.util.List; import pikelake.Cell; -// import predatorprey.preys.Prey; //////////////////////////////////////////////////////////// -// import predatorprey.preys.PreysGroup; //////////////////////////////////////////////////// import umontreal.iro.lecuyer.probdist.UniformDist; import umontreal.iro.lecuyer.randvar.UniformGen; import fr.cemagref.simaqualife.kernel.AquaNismsGroup; diff --git a/src/main/java/pikelake/pikes/PikeMovement.java b/src/main/java/pikelake/pikes/PikeMovement.java index 3d8cf4d33bfea50b73a3e0cf2d884e542250a894..9c7ea8e88bf929eec55aceb49ad74fae10d7481d 100644 --- a/src/main/java/pikelake/pikes/PikeMovement.java +++ b/src/main/java/pikelake/pikes/PikeMovement.java @@ -57,4 +57,4 @@ public class PikeMovement extends LoopAquaNismsGroupProcess<Pike, PikesGroup> { pike.moveTo(group.getPilot(), possibilities.get(idx), group); } } -} +} \ No newline at end of file diff --git a/src/main/java/pikelake/pikes/PikeObservationProcess.java b/src/main/java/pikelake/pikes/PikeObservationProcess.java index 8d20846e9ca93fa4a2b7562aecfea4304ef5593a..c7c24b2d0aafc275514d95f5ec9289239391b148 100644 --- a/src/main/java/pikelake/pikes/PikeObservationProcess.java +++ b/src/main/java/pikelake/pikes/PikeObservationProcess.java @@ -9,5 +9,4 @@ public class PikeObservationProcess extends AquaNismsGroupProcess<Pike,PikesGrou pikesGroup.calculatePikesNumber(); } - } diff --git a/src/main/java/pikelake/pikes/PikesGroup.java b/src/main/java/pikelake/pikes/PikesGroup.java index c63276942770d5466e2881dc7f6b9599d4d58dd8..36bdb273ae6cb68060330816cec1f0ad7bf0c9e2 100644 --- a/src/main/java/pikelake/pikes/PikesGroup.java +++ b/src/main/java/pikelake/pikes/PikesGroup.java @@ -28,7 +28,6 @@ public class PikesGroup extends AquaNismsGroup<Pike,Grid> { private transient int pikesNumber; - public PikesGroup(Pilot pilot, Grid arg0, Processes arg1) { super(pilot, arg0, arg1); } @@ -42,7 +41,6 @@ public class PikesGroup extends AquaNismsGroup<Pike,Grid> { } System.out.println(" pred: "+pikesNumber + " " + pikesNumber2);*/ return pikesNumber; - } public double calculatePikesBiomass(){ @@ -50,7 +48,6 @@ public class PikesGroup extends AquaNismsGroup<Pike,Grid> { for(Pike pike : this.getAquaNismsList()) pikesBiomass += pike.getWeight(); return pikesBiomass; - }