Forked from HYCAR-Hydro / airGR
Source project has a limited visibility.
Grid.java 8.74 KiB
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; } }