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