An error occurred while loading the file. Please try again.
-
Olivier Kaufmann authored3286d6a5
package pikelake;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
import pikelake.Cell;
import pikelake.environment.AreaMovement;
import pikelake.environment.FichierMarnage;
import pikelake.environment.Time;
import pikelake.pikes.Pike;
import fr.cemagref.simaqualife.extensions.spatial2D.Grid2D;
import fr.cemagref.simaqualife.kernel.AquaNismsGroup;
import fr.cemagref.simaqualife.kernel.util.TransientParameters.InitTransientParameters;
import fr.cemagref.simaqualife.pilot.Pilot;
public class Grid extends Grid2D<Cell, Individual> {
//public Time temp = new Time();
private String marnageInit = "513_4";
public Grid(int gridWidth, int gridHeight, NeighborsType neighborsType) {
super(gridWidth, gridHeight, neighborsType);
// TODO Auto-generated constructor stub
}
/**
* Declaration + Initialisation de la grille avec les HSI de chaque cellule
*
*/
@InitTransientParameters
public void initTransientParameters(Pilot pilot) throws FileNotFoundException {
StringTokenizer sLigne;
@SuppressWarnings("unused")
double hsiStd = 0, hsiMoy = 0;
int idCell = 0, yPike = 0, xPike = 0;
// Initialisation 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);
}
try {
marnageInit = FichierMarnage.calculMarnage();
} catch (NullPointerException e) {
//System.out.println ("Err marnage");
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 detecte
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;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
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();
}
/* public static String calculMarnage () {
String temp[] = null;
String file = "data/input/CoteCorrige_01012012_30042014.txt";
try {
Scanner scanner = new Scanner(new File(file));
// On boucle sur chaque ligne detecte
String line = scanner.nextLine();
while (scanner.hasNextLine()) {
line = scanner.nextLine();
temp = line.split("[/:\t ]+");
//System.out.println (Integer.parseInt(temp[0]) + " - " + Integer.parseInt(temp[1]) + " - " + temp[2] + " - " + temp[3] + " - " + temp[4] + " - " + temp[5] + " - " + temp[6]);
if (Time.jourMois == Integer.parseInt(temp[0]))
if (Time.mois == Integer.parseInt(temp[1])-1)
if (Time.heure == Integer.parseInt(temp[3]))
break;
}
scanner.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return temp[6].substring(0, temp[6].length()-1).replace(".", "_");
} */
public void setCell (int indexCell, double hsiCell) {
grid[indexCell] = new Cell(indexCell, hsiCell);
}
public Grid getGrid () {
return this;
}
public void addAquaNism(Individual ind, AquaNismsGroup<?, ?> group) {
super.addAquaNism(ind, group);
ind.getPosition().addPike((Pike) ind);
}
public void moveAquaNism(Individual ind, AquaNismsGroup<?, ?> group, Cell dest) {
super.moveAquaNism(ind, group, dest);
this.removeAquaNism(ind, group);
dest.addPike((Pike) ind);
}
public void removeAquaNism(Individual ind, AquaNismsGroup<?, ?> group) {
super.removeAquaNism(ind, group);
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
ind.getPosition().removePike((Pike) ind);
}
/**
* Calcul des cellules accessibles (comprise dans le lac)
* entrees : position : id de la cellule initiale
* sortie : neighbours : liste des cellules (id) accessibles
*/
public List<Cell> getNeighbours(Cell position) {
List<Cell> neighbours = new ArrayList<Cell>();
List<String> listeCoord = null;
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
for (String liste : listeCoord) {
// Calcul de l'indice de la maille partir des coordonnees (x,y)
211212213214215216217218219220221222223
String[] coord = liste.split(" ");
int newCell = xPike + Integer.parseInt(coord[0]) + (yPike + Integer.parseInt(coord[1])) * gridWidth;
// Test si l'indice calcule appartient la grille totale
if (newCell >= 0 & newCell <= (gridWidth * gridHeight)-2)
// Si l'indice calcule est compris dans le lac on l'ajoute a la liste
if (getCell(newCell).getHabitatQuality() >= 0)
neighbours.add(getCell(newCell));
}
return neighbours;
}
}