From cf88db3b5f5ec310e21f1011fe15b19023970b4e Mon Sep 17 00:00:00 2001 From: Samuel Westrelin <samuel.westrelin@irstea.fr> Date: Fri, 18 Sep 2015 10:01:34 +0000 Subject: [PATCH] --- src/main/java/pikelake/Grid.java | 569 ++++++++++++++++++------------- 1 file changed, 326 insertions(+), 243 deletions(-) diff --git a/src/main/java/pikelake/Grid.java b/src/main/java/pikelake/Grid.java index 29975fc..cda5a4a 100644 --- a/src/main/java/pikelake/Grid.java +++ b/src/main/java/pikelake/Grid.java @@ -1,243 +1,326 @@ -package pikelake; - -import java.io.File; -import java.util.List; -import java.util.Scanner; -import java.util.ArrayList; -import java.util.StringTokenizer; -import java.io.FileNotFoundException; - -import pikelake.Cell; -import pikelake.pikes.Pike; -import pikelake.environment.Time; -import pikelake.environment.AreaMovement; -import pikelake.environment.FichierMarnage; - -import fr.cemagref.simaqualife.pilot.Pilot; -import fr.cemagref.simaqualife.kernel.AquaNismsGroup; -import fr.cemagref.simaqualife.extensions.spatial2D.Grid2D; -import fr.cemagref.simaqualife.kernel.util.TransientParameters.InitTransientParameters; - -/** - * Classe qui initialise la grille de la simulation (lac et cellule non accessible) - * @author Guillaume GARBAY - * @version 1.0 - */ -public class Grid extends Grid2D<Cell, Individual> { - - private String marnageInit = "513_4"; - - /** - * Constructeur de la classe Grid - * @param gridWidth Largeur totale de la grille - * @param gridHeight Longueur totale de la grille - * @param neighborsType Type de voisinnage utilise - * @return / - */ - public Grid (int gridWidth, int gridHeight, NeighborsType neighborsType) { - super(gridWidth, gridHeight, neighborsType); - // Auto-generated constructor stub - } - - /** - * Declaration + Initialisation de la grille avec les HSI de chaque cellule - * Appelee lors de l'initialisation du programme - * @param pilot - * @return / - */ - @InitTransientParameters - public void initTransientParameters (Pilot pilot) throws FileNotFoundException { - - StringTokenizer sLigne; - @SuppressWarnings("unused") - double hsiStd = 0, hsiMoy = 0; - int idCell = 0, yPike = 0, xPike = 0; - - // Declaration grille vide - grid = new Cell[gridWidth * gridHeight]; - - // Initialisation de toute la grille avec hsi = -1 - for (int cptCell = 0; cptCell < (gridWidth * gridHeight - 1); cptCell++) { - grid[cptCell] = new Cell(cptCell, -1); - } - - marnageInit = FichierMarnage.dateMarnage[Time.jourMois][Time.mois][Time.heure]; - if (marnageInit == null ) marnageInit = "513_4"; - - // Lecture fichier contenant les HSI de toutes les mailles - String filePath = "data/input/HSI/hsi_BRO" + Time.getSeason() + marnageInit + ".txt"; - Scanner scanner = new Scanner(new File(filePath)); - - // Initialisation de chaque cellule contenant HSI - // On boucle sur chaque ligne detectée - String line = scanner.nextLine(); - while (scanner.hasNextLine()) { - line = scanner.nextLine(); - - // Decoupage ligne : id, hsiStd, hsiMoy - sLigne = new StringTokenizer (line); - if (sLigne.hasMoreTokens()) - idCell = Integer.parseInt(sLigne.nextToken())-1; - if (sLigne.hasMoreTokens()) - hsiStd = Double.parseDouble(sLigne.nextToken()); - if (sLigne.hasMoreTokens()) - hsiMoy = Double.parseDouble(sLigne.nextToken()); - - // Conversion idCell en coordonnees (x, y) - // (x, y) avec les id de cellules de 0 à n-1 - yPike = (int) Math.floor(idCell / gridWidth); - xPike = (int) idCell - (yPike * gridWidth); - - // Inversion des coordonnees en Y (place l'origine en bas à gauche) - yPike = (gridHeight-1) - yPike ; - // Conversion des coordonnees (x, y) en idCell - idCell = xPike + yPike * gridWidth; - - // Initialisation du hsi de la cellule(idCell) - grid[idCell] = new Cell(idCell, hsiMoy); - } - scanner.close(); // Fermeture du fichier - } - - /** - * Procedure qui definit la valeur du HSI pour une cellule - * @param indexCell Indice de la cellule a traiter - * @param hsiCell Valeur du HSI - * @return / - */ - public void setCell (int indexCell, double hsiCell) { - grid[indexCell] = new Cell(indexCell, hsiCell); - } - - /** - * Procedure qui renvoie la grille actuelle - * en cours de simulation - * @param / - * @return Grid Grille de la simulation - */ - public Grid getGrid () { - return this; - } - - /** - * Procedure qui ajoute un individu au groupe - * d'individus aquaNism - * @param ind L'individu a ajouter - * @param group Groupe des individus - * @return / - */ - public void addAquaNism (Individual ind, AquaNismsGroup<?, ?> group) { - super.addAquaNism(ind, group); - ind.getPosition().addPike((Pike) ind); - } - - /** - * Procedure qui deplace un individu - * @param ind L'individu a deplacer - * @param group Groupe auquel appartient l'individu - * @param dest Cellule de destination de l'individu - * @return / - */ - public void moveAquaNism (Individual ind, AquaNismsGroup<?, ?> group, Cell dest) { - super.moveAquaNism(ind, group, dest); - this.removeAquaNism(ind, group); - dest.addPike((Pike) ind); - } - - /** - * Procedure qui enleve un individu - * @param ind L'individu a enlever - * @param group Groupe auquel appartient l'individu - * @return / - */ - public void removeAquaNism (Individual ind, AquaNismsGroup<?, ?> group) { - super.removeAquaNism(ind, group); - ind.getPosition().removePike((Pike) ind); - } - - /** - * Calcul des cellules accessibles (comprise dans le lac) - * @param position ID de la cellule initiale - * @return neighbours Liste des cellules (id) accessibles - */ - public List<Cell> getNeighbours (Cell position) { - - List<Cell> neighbours = new ArrayList<Cell>(); - int[][] listeCoord; - int xPike = 0, yPike = 0; - - // Calcul des coordonnees (x, y) a partir de l'Id de la maille - yPike = (position.getIndex() / gridWidth); - xPike = (position.getIndex() - (yPike * gridWidth)); - - // Determination de la liste des mailles pour une distance donnee qui depend de la phase du jour et de la saison - switch (Time.getSeason()) { - case "PRINTEMPS": switch (Time.getPhaseJour()) { - case "AUBE" : listeCoord = AreaMovement.areaPrinAube; break; - case "JOUR" : listeCoord = AreaMovement.areaPrinJour; break; - case "NUIT" : listeCoord = AreaMovement.areaPrinNuit; break; - case "CREP" : listeCoord = AreaMovement.areaPrinCrep; break; - default : System.out.println ("Erreur lecture de la Phase du Jour au Printemps"); - listeCoord = AreaMovement.areaPrinJour; break; - } break; - - case "ETE" : switch (Time.getPhaseJour()) { - case "AUBE" : listeCoord = AreaMovement.areaEteAube; break; - case "JOUR" : listeCoord = AreaMovement.areaEteJour; break; - case "NUIT" : listeCoord = AreaMovement.areaEteNuit; break; - case "CREP" : listeCoord = AreaMovement.areaEteCrep; break; - default : System.out.println ("Erreur lecture de la Phase du Jour en Ete"); - listeCoord = AreaMovement.areaEteJour; break; - } break; - - case "AUTOMNE" : switch (Time.getPhaseJour()) { - case "AUBE" : listeCoord = AreaMovement.areaAutAube; break; - case "JOUR" : listeCoord = AreaMovement.areaAutJour; break; - case "NUIT" : listeCoord = AreaMovement.areaAutNuit; break; - case "CREP" : listeCoord = AreaMovement.areaAutCrep; break; - default : System.out.println ("Erreur lecture de la Phase du Jour en Automne"); - listeCoord = AreaMovement.areaAutJour; break; - } break; - - case "HIVER" : switch (Time.getPhaseJour()) { - case "AUBE" : listeCoord = AreaMovement.areaHivAube; break; - case "JOUR" : listeCoord = AreaMovement.areaHivJour; break; - case "NUIT" : listeCoord = AreaMovement.areaHivNuit; break; - case "CREP" : listeCoord = AreaMovement.areaHivCrep; break; - default : System.out.println ("Erreur lecture de la Phase du Jour en Hiver"); - listeCoord = AreaMovement.areaHivJour; break; - } break; - - default : System.out.println ("Erreur lecture de la Saison"); - switch (Time.getPhaseJour()) { - case "AUBE" : listeCoord = AreaMovement.areaPrinAube; break; - case "JOUR" : listeCoord = AreaMovement.areaPrinJour; break; - case "NUIT" : listeCoord = AreaMovement.areaPrinNuit; break; - case "CREP" : listeCoord = AreaMovement.areaPrinCrep; break; - default : System.out.println ("Plus : Erreur lecture de la Phase du Jour"); - listeCoord = AreaMovement.areaPrinJour; break; - } break; - } - - // Calcul des mailles comprises dans le lac - boolean stop = false; - final int max = (gridWidth * gridHeight)-2; - for (int cpt=0; cpt<listeCoord[0].length; cpt++) { - int newCell = computeIndex(xPike, listeCoord, cpt, yPike); - - // Test si l'indice calcule appartient à la grille totale - if (newCell >= 0 && newCell <= max) { - final Cell cell = getCell(newCell); - // Si l'indice calcule est compris dans le lac on l'ajoute a la liste - if (cell.getHabitatQuality() >= 0) { - neighbours.add(cell); - } - } - } - return neighbours; - } - - private int computeIndex(int xPike, int[][] listeCoord, int cpt, int yPike) { - return xPike + listeCoord[0][cpt] + (yPike + listeCoord[1][cpt]) * gridWidth; - } -} +package pikelake; + +import java.io.File; +import java.util.List; +import java.util.Scanner; +import java.util.ArrayList; +import java.util.StringTokenizer; +import java.io.FileNotFoundException; + +import pikelake.Cell; +import pikelake.pikes.Pike; +import pikelake.environment.Time; +import pikelake.environment.AreaMovement; +import pikelake.environment.FichierMarnage; + +import fr.cemagref.simaqualife.pilot.Pilot; +import fr.cemagref.simaqualife.kernel.AquaNismsGroup; +import fr.cemagref.simaqualife.extensions.spatial2D.Grid2D; +import fr.cemagref.simaqualife.kernel.util.TransientParameters.InitTransientParameters; + +/** + * Classe qui initialise la grille de la simulation (lac et cellule non + * accessible) + * + * @author Guillaume GARBAY + * @version 1.0 + */ +public class Grid extends Grid2D<Cell, Individual> { + + private String marnageInit = "513_4"; + private int cellnumber_2 = (gridWidth * gridHeight) - 2; + + /** + * Constructeur de la classe Grid + * + * @param gridWidth Largeur totale de la grille + * @param gridHeight Longueur totale de la grille + * @param neighborsType Type de voisinnage utilise + * @return / + */ + public Grid(int gridWidth, int gridHeight, NeighborsType neighborsType) { + super(gridWidth, gridHeight, neighborsType); + // Auto-generated constructor stub + } + + /** + * Declaration + Initialisation de la grille avec les HSI de chaque cellule + * Appelee lors de l'initialisation du programme + * + * @param pilot + * @return / + */ + @InitTransientParameters + public void initTransientParameters(Pilot pilot) throws FileNotFoundException { + + StringTokenizer sLigne; + @SuppressWarnings("unused") + double hsiStd = 0, hsiMoy = 0; + int idCell = 0, yPike = 0, xPike = 0; + + // Declaration grille vide + grid = new Cell[gridWidth * gridHeight]; + + // Initialisation de toute la grille avec hsi = -1 + for (int cptCell = 0; cptCell < (gridWidth * gridHeight - 1); cptCell++) { + grid[cptCell] = new Cell(cptCell, -1); + } + + marnageInit = FichierMarnage.dateMarnage[Time.jourMois][Time.mois][Time.heure]; + if (marnageInit == null) { + marnageInit = "513_4"; + } + + // Lecture fichier contenant les HSI de toutes les mailles + String filePath = "data/input/HSI/hsi_BRO" + Time.getSeason() + marnageInit + ".txt"; + Scanner scanner = new Scanner(new File(filePath)); + + // Initialisation de chaque cellule contenant HSI + // On boucle sur chaque ligne detectée + String line = scanner.nextLine(); + while (scanner.hasNextLine()) { + line = scanner.nextLine(); + + // Decoupage ligne : id, hsiStd, hsiMoy + sLigne = new StringTokenizer(line); + if (sLigne.hasMoreTokens()) { + idCell = Integer.parseInt(sLigne.nextToken()) - 1; + } + if (sLigne.hasMoreTokens()) { + hsiStd = Double.parseDouble(sLigne.nextToken()); + } + if (sLigne.hasMoreTokens()) { + hsiMoy = Double.parseDouble(sLigne.nextToken()); + } + + // Conversion idCell en coordonnees (x, y) + // (x, y) avec les id de cellules de 0 à n-1 + yPike = (int) Math.floor(idCell / gridWidth); + xPike = (int) idCell - (yPike * gridWidth); + + // Inversion des coordonnees en Y (place l'origine en bas à gauche) + yPike = (gridHeight - 1) - yPike; + // Conversion des coordonnees (x, y) en idCell + idCell = xPike + yPike * gridWidth; + + // Initialisation du hsi de la cellule(idCell) + grid[idCell] = new Cell(idCell, hsiMoy); + } + scanner.close(); // Fermeture du fichier + } + + /** + * Procedure qui definit la valeur du HSI pour une cellule + * + * @param indexCell Indice de la cellule a traiter + * @param hsiCell Valeur du HSI + * @return / + */ + public void setCell(int indexCell, double hsiCell) { + grid[indexCell] = new Cell(indexCell, hsiCell); + } + + /** + * Procedure qui renvoie la grille actuelle en cours de simulation + * + * @param / + * @return Grid Grille de la simulation + */ + public Grid getGrid() { + return this; + } + + /** + * Procedure qui ajoute un individu au groupe d'individus aquaNism + * + * @param ind L'individu a ajouter + * @param group Groupe des individus + * @return / + */ + public void addAquaNism(Individual ind, AquaNismsGroup<?, ?> group) { + super.addAquaNism(ind, group); + ind.getPosition().addPike((Pike) ind); + } + + /** + * Procedure qui deplace un individu + * + * @param ind L'individu a deplacer + * @param group Groupe auquel appartient l'individu + * @param dest Cellule de destination de l'individu + * @return / + */ + public void moveAquaNism(Individual ind, AquaNismsGroup<?, ?> group, Cell dest) { + super.moveAquaNism(ind, group, dest); + this.removeAquaNism(ind, group); + dest.addPike((Pike) ind); + } + + /** + * Procedure qui enleve un individu + * + * @param ind L'individu a enlever + * @param group Groupe auquel appartient l'individu + * @return / + */ + public void removeAquaNism(Individual ind, AquaNismsGroup<?, ?> group) { + super.removeAquaNism(ind, group); + ind.getPosition().removePike((Pike) ind); + } + + /** + * Calcul des cellules accessibles (comprise dans le lac) + * + * @param position ID de la cellule initiale + * @return neighbours Liste des cellules (id) accessibles + */ + public List<Cell> getNeighbours(Cell position) { + + List<Cell> neighbours = new ArrayList<Cell>(); + int[][] listeCoord; + int xPike = 0, yPike = 0; + + // Calcul des coordonnees (x, y) a partir de l'Id de la maille + yPike = (position.getIndex() / gridWidth); + xPike = (position.getIndex() - (yPike * gridWidth)); + + // Determination de la liste des mailles pour une distance donnee qui depend de la phase du jour et de la saison + switch (Time.getSeason()) { + case "PRINTEMPS": + switch (Time.getPhaseJour()) { + case "AUBE": + listeCoord = AreaMovement.areaPrinAube; + break; + case "JOUR": + listeCoord = AreaMovement.areaPrinJour; + break; + case "NUIT": + listeCoord = AreaMovement.areaPrinNuit; + break; + case "CREP": + listeCoord = AreaMovement.areaPrinCrep; + break; + default: + System.out.println("Erreur lecture de la Phase du Jour au Printemps"); + listeCoord = AreaMovement.areaPrinJour; + break; + } + break; + + case "ETE": + switch (Time.getPhaseJour()) { + case "AUBE": + listeCoord = AreaMovement.areaEteAube; + break; + case "JOUR": + listeCoord = AreaMovement.areaEteJour; + break; + case "NUIT": + listeCoord = AreaMovement.areaEteNuit; + break; + case "CREP": + listeCoord = AreaMovement.areaEteCrep; + break; + default: + System.out.println("Erreur lecture de la Phase du Jour en Ete"); + listeCoord = AreaMovement.areaEteJour; + break; + } + break; + + case "AUTOMNE": + switch (Time.getPhaseJour()) { + case "AUBE": + listeCoord = AreaMovement.areaAutAube; + break; + case "JOUR": + listeCoord = AreaMovement.areaAutJour; + break; + case "NUIT": + listeCoord = AreaMovement.areaAutNuit; + break; + case "CREP": + listeCoord = AreaMovement.areaAutCrep; + break; + default: + System.out.println("Erreur lecture de la Phase du Jour en Automne"); + listeCoord = AreaMovement.areaAutJour; + break; + } + break; + + case "HIVER": + switch (Time.getPhaseJour()) { + case "AUBE": + listeCoord = AreaMovement.areaHivAube; + break; + case "JOUR": + listeCoord = AreaMovement.areaHivJour; + break; + case "NUIT": + listeCoord = AreaMovement.areaHivNuit; + break; + case "CREP": + listeCoord = AreaMovement.areaHivCrep; + break; + default: + System.out.println("Erreur lecture de la Phase du Jour en Hiver"); + listeCoord = AreaMovement.areaHivJour; + break; + } + break; + + default: + System.out.println("Erreur lecture de la Saison"); + switch (Time.getPhaseJour()) { + case "AUBE": + listeCoord = AreaMovement.areaPrinAube; + break; + case "JOUR": + listeCoord = AreaMovement.areaPrinJour; + break; + case "NUIT": + listeCoord = AreaMovement.areaPrinNuit; + break; + case "CREP": + listeCoord = AreaMovement.areaPrinCrep; + break; + default: + System.out.println("Plus : Erreur lecture de la Phase du Jour"); + listeCoord = AreaMovement.areaPrinJour; + break; + } + break; + } + + // Calcul des mailles comprises dans le lac + boolean stop = false; + Cell cellule = null; + for (int cpt = 0; cpt < listeCoord[0].length; cpt++) { + + if (listeCoord[0][cpt] == 0 && listeCoord[1][cpt] == 0 && stop == true) { + break; + } + if (listeCoord[0][cpt] == 0 && listeCoord[1][cpt] == 0) { + stop = true; + } + + // Calcul de l'indice de la maille à partir des coordonnees (x,y) + int newCell = xPike + listeCoord[0][cpt] + (yPike + listeCoord[1][cpt]) * gridWidth; + + // Test si l'indice calcule appartient à la grille totale + if (newCell >= 0 && newCell <= cellnumber_2) { + cellule = getCell(newCell); + // Si l'indice calcule est compris dans le lac on l'ajoute a la liste + if (cellule.getHabitatQuality() >= 0) { + neighbours.add(cellule); + } + } + } + return neighbours; + } + + private int computeIndex(int xPike, int[][] listeCoord, int cpt, int yPike) { + return xPike + listeCoord[0][cpt] + (yPike + listeCoord[1][cpt]) * gridWidth; + } +} -- GitLab