WIP : created a position.js file with all util methods, now needs to implement it...
authorDavid MAECHLER <d.maechler@thecodingmachine.com>
Sat, 4 Apr 2020 19:00:59 +0000 (21:00 +0200)
committerDavid MAECHLER <d.maechler@thecodingmachine.com>
Sat, 4 Apr 2020 19:00:59 +0000 (21:00 +0200)
back/src/Controller/PositionController.ts [new file with mode: 0644]
back/src/Controller/position.js [new file with mode: 0644]

diff --git a/back/src/Controller/PositionController.ts b/back/src/Controller/PositionController.ts
new file mode 100644 (file)
index 0000000..0ffdd02
--- /dev/null
@@ -0,0 +1 @@
+// TODO
\ No newline at end of file
diff --git a/back/src/Controller/position.js b/back/src/Controller/position.js
new file mode 100644 (file)
index 0000000..8c445b1
--- /dev/null
@@ -0,0 +1,88 @@
+// Constants
+let MIN_DISTANCE = 80;
+let MAX_PER_GROUP = 3;
+let NB_USERS = 10;
+
+// Utils
+let rand = function(min, max) {
+    min = Math.ceil(min);
+    max = Math.floor(max);
+    return Math.floor(Math.random() * (max - min + 1)) + min;
+};
+
+// Test Data
+let users = [];
+for(let i = 1; i <= NB_USERS; i++) {
+    let user = {};
+    user.id = rand(0,99999);
+    user.X = rand(0, 60);
+    user.Y = rand(0, 60);
+    users.push(user);
+}
+
+// Compute distance between each user
+let computeDistance = function(users) {
+    let i = 0;
+    let distances = [];
+
+    users.forEach(function(user1, key1) {
+        users.forEach(function(user2, key2) {
+            if(key1 !== key2 && key1 < key2) {
+                let distanceObj = {};
+                distanceObj.distance = Math.sqrt(Math.pow(user2.X - user1.X, 2) + Math.pow(user2.Y - user1.Y, 2));
+                distanceObj.first = user1;
+                distanceObj.second = user2;
+
+                distances[i] = distanceObj;
+                i++;
+            }
+        });
+    });
+
+    return distances;
+};
+
+// Organise groups
+let createGroups = function(distances) {
+    let i = 0;
+    let groups = [];
+    let alreadyInGroup = [];
+
+    for(let j = 0; j < distances.length; j++) {
+        let dist = distances[i];
+        if(dist.distance <= MIN_DISTANCE) {
+            if(typeof groups[i] === 'undefined') {
+                groups[i] = [];
+            }
+
+            if(groups[i].indexOf(dist.first) && typeof alreadyInGroup[dist.first.id] === 'undefined') {
+                groups[i].push(dist.first);
+                alreadyInGroup [dist.first.id] = true;
+            }
+
+            if(groups[i].length === MAX_PER_GROUP) {
+                i++; // on créé un nouveau groupe
+                if(i > (NB_USERS / MAX_PER_GROUP)) {
+                    console.log('There is no room left for user ID : ' + dist.second.id + ' !');
+                    break;
+                }
+                continue;
+            }
+
+            if(groups[i].indexOf(dist.second) && typeof alreadyInGroup[dist.second.id] === 'undefined') {
+                groups[i].push(dist.second);
+                alreadyInGroup [dist.second.id] = true;
+            }
+        }
+    }
+
+    return groups;
+};
+
+let distances = computeDistance(users);
+let groups = createGroups(distances);
+// TODO : Créer une méthode pour checker la distance entre les membres du groupes pour savoir s'il faut les dissoudre ou non
+
+console.log(distances);
+console.log(groups);
+