summaryrefslogtreecommitdiff
path: root/ero1/src/generation/snow_generation.py
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
commit967be9e750221ab2ab783f95df79bb26d290a45e (patch)
tree6802900a5e975f9f68b169f0f503f040056d6952 /ero1/src/generation/snow_generation.py
add: added projectsHEADmain
Diffstat (limited to 'ero1/src/generation/snow_generation.py')
-rw-r--r--ero1/src/generation/snow_generation.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/ero1/src/generation/snow_generation.py b/ero1/src/generation/snow_generation.py
new file mode 100644
index 0000000..449a4ec
--- /dev/null
+++ b/ero1/src/generation/snow_generation.py
@@ -0,0 +1,85 @@
+# FICHIER DEPRECATED : Ce fichier n'est plus utilisé.
+
+import random
+import parameters as params
+
+
+def place_snow(G):
+ """
+ Place de la neige sur les egdes du graphe
+ Parameters:
+ G (voir quel type on veut utiliser): le graphe des routes
+ Returns:
+ None: le graphe est modifié en place
+ """
+ # WARNING: je ne suis pas sûr de cette manière de faire qui me semble boffe, je pense qu'une manière plus random (mais plus sale/lente) serait de shuffle la liste d'edges. Le soucis avec la méthode actuelle c'est que si G.egdes(...) ordonne les arcs/arêtes d'une manière prédéfinie, alors le début/la fin de la liste sera composé de beacoup/peu de neige, ce qui n'est pas uniforme
+ edges = list(G.edges(keys=True, data=True))
+ n = len(edges)
+ random.shuffle(edges)
+ amount_to_cover = int(params.SNOW_PERCENTAGE * n)
+ quantity: float = 0
+
+ for u, v, k, data in edges:
+ if (amount_to_cover == 0): # we should place > 2.5cm snow
+ quantity = random.uniform(
+ params.SNOW_THRESHOLD + 0.01, params.SNOW_MAX)
+ else: # we do not care
+ quantity = random.uniform(params.SNOW_MIN, params.SNOW_MAX)
+
+ if (quantity >= params.SNOW_THRESHOLD):
+ amount_to_cover -= 1
+
+ data['snow'] = quantity
+
+
+def place_snow_v2(G):
+ """
+ Place de la neige sur les egdes du graphe, moins opti que la v1 mais gère les cas (u,v) et (v,u) (plus réaliste)
+ Parameters:
+ G (voir quel type on veut utiliser): le graphe des routes
+ Returns:
+ (int, int): (nb_edges_oriented, nb_edges_nonoriented), renvoie le nombre d'edges qui ont plus de 2.5 cm de neige (utile pour débug les drônes)
+ """
+ edges = list(G.edges(keys=True, data=True))
+ n = len(edges)
+ random.shuffle(edges)
+ amount_to_cover = int(params.SNOW_PERCENTAGE * n)
+ TO_DELETE = amount_to_cover # pls delete once testing is finished
+ quantity: float = 0
+
+ res_oriented = 0
+ res_unoriented = 0
+ visited = {} # (u,v) => quantity
+
+ for u, v, k, data in edges:
+ if (v, u) in visited:
+ data['snow'] = visited[(v, u)]
+ amount_to_cover -= 1
+
+ res_unoriented += 1
+ # we do not increment res_oriented since (u,v) and (v,u) are the same thing
+ # => check to_undirected but should be good
+ elif (u, v) in visited:
+ data['snow'] = visited[(u, v)]
+ # WARNING: this implementation might not be the most accurate/best
+
+ amount_to_cover -= 1
+ # TODO : wtf do I do with the counters ... technically nothing ?
+ else:
+ if (amount_to_cover <= 0): # we should place > 2.5cm snow
+ quantity = random.uniform(
+ params.SNOW_THRESHOLD + 0.01, params.SNOW_MAX)
+ else: # we do not care
+ quantity = random.uniform(params.SNOW_MIN, params.SNOW_MAX)
+
+ if (quantity >= params.SNOW_THRESHOLD):
+ amount_to_cover -= 1
+
+ data['snow'] = quantity
+ visited[(u, v)] = quantity
+
+ res_unoriented += 1
+ res_oriented += 1
+
+ # assert (TO_DELETE == res_unoriented) => need to check how to handle duplicate of the form (u,v)
+ return res_oriented, res_unoriented