From 159c78631c2eb7159662fd755976d91727bfaa88 Mon Sep 17 00:00:00 2001 From: Nicolas Dumoulin <nicolas.dumoulin@irstea.fr> Date: Fri, 18 Sep 2015 09:44:09 +0000 Subject: [PATCH] better initialisation for better performance --- .../pikelake/environment/AreaMovement.java | 70 +++++++++++-------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/src/main/java/pikelake/environment/AreaMovement.java b/src/main/java/pikelake/environment/AreaMovement.java index 2da928a..ff944f6 100644 --- a/src/main/java/pikelake/environment/AreaMovement.java +++ b/src/main/java/pikelake/environment/AreaMovement.java @@ -1,15 +1,16 @@ package pikelake.environment; +import fr.cemagref.simaqualife.kernel.processes.AquaNismsGroupProcess; import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Scanner; import java.util.StringTokenizer; -import java.io.FileNotFoundException; - import pikelake.pikes.Pike; import pikelake.pikes.PikesGroup; -import fr.cemagref.simaqualife.kernel.processes.AquaNismsGroupProcess; - /** * Classe qui lit le fichier contenant les distances horaires parcourues par les individus, * selon la saison et la phase du jour. @@ -105,33 +106,44 @@ public class AreaMovement extends AquaNismsGroupProcess<Pike, PikesGroup> { if (choixDist == 0) temp = calculationArea (distMin); else if (choixDist == 1) temp = calculationArea (distMoy); else if (choixDist == 2) temp = calculationArea (distMax); - return temp; + return temp; } - /** - * Determine les coordonnees du cercle des cellules accessibles pour une distance donnee - * @param distance Entier representant la distance de deplacement - * @return area Tableau d'entier contenant les coordonnees des cellules accessibles - */ - public int[][] calculationArea (int distance) { - - int[][] area = new int[2][80000]; - int xi = 0, yi = 0, cpt = 0; - - // Conversion distance en nombre de cellule - int distCell = (int) Math.round(distance/10.); - - // Calcul des coordonnees (x,y) des cellules pour une distance donnee - for (xi = -distCell; xi <= distCell; xi++) { - yi = (int) Math.round(Math.sqrt(distCell*distCell - xi*xi)); - for (int j = -yi; j <= yi; j++) { - area[0][cpt] = xi; - area[1][cpt] = j; - cpt++; - } - } - return area; - } + /** + * Determine les coordonnees du cercle des cellules accessibles pour une + * distance donnee + * + * @param distance Entier representant la distance de deplacement + * @return area Tableau d'entier contenant les coordonnees des cellules + * accessibles + */ + public int[][] calculationArea(int distance) { + + List<List<Integer>> area = new ArrayList<List<Integer>>(); + area.add(new ArrayList<Integer>()); + area.add(new ArrayList<Integer>()); + int xi = 0, yi = 0, cpt = 0; + + // Conversion distance en nombre de cellule + int distCell = (int) Math.round(distance / 10.); + + // Calcul des coordonnees (x,y) des cellules pour une distance donnee + for (xi = -distCell; xi <= distCell; xi++) { + yi = (int) Math.round(Math.sqrt(distCell * distCell - xi * xi)); + for (int j = -yi; j <= yi; j++) { + area.get(0).add(xi); + area.get(1).add(j); + } + } + int[][] result = new int[2][area.get(0).size()]; + for (int i = 0; i < area.size(); i++) { + for (int j = 0; j < area.get(i).size(); j++) { + result[i][j] = area.get(i).get(j); + } + } + + return result; + } /** * Retourne la distance minimum -- GitLab