Grid.java 6.47 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.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 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);
        // Lecture fichier contenant les HSI de toutes les mailles
    	String filePath = "data/input/HSI/hsi_BROETE507.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;
    		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 ;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
// 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 void doProcess (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); } // Lecture fichier contenant les HSI de toutes les mailles String filePath = "data/input/HSI/hsi_BROETE507.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; 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 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); }
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
public void removeAquaNism(Individual ind, AquaNismsGroup<?, ?> group) { super.removeAquaNism(ind, group); ind.getPosition().removePike((Pike) ind); } /** * Calcul des cellules accessibles (comprise dans le lac) * entrees : position : id de la cellule initiale * distance : distance maximum que peut parcourir l'individu * 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)); // Calcul de la liste des mailles pour une distance donnee AreaMovement aa = new AreaMovement("ETE","AUBE"); listeCoord = aa.getArea(); // Calcul des mailles comprises dans le lac for (String liste : listeCoord) { String[] coord = liste.split(" "); int newCell = xPike + Integer.parseInt(coord[0]) + (yPike + Integer.parseInt(coord[1])) * gridWidth; if (newCell >= 0 & newCell <= (gridWidth * gridHeight)-2) { // Pourquoi -2 ?? => -1 donne une erreur pour la case n52 703 ... if (getCell(newCell).getHabitatQuality() >= 0) { neighbours.add(getCell(newCell)); } } } return neighbours; } }