@@ -3,6 +3,13 @@ importer math
33# Module WASM - compatible pour le carrelage d'images.
44# Exporte les primitives geometriques et les generateurs de tuiles
55# utilises par l'interface JavaScript.
6+ #
7+ # Stockage pre- alloue : evite append() (O (N ²) memoire avec allocateur
8+ # par bosse) en faveur d'indices dans des tableaux de taille fixe.
9+
10+ _MAX_TUILES = 2000
11+ _MAX_COORDS = 24000 # 2000 tuiles × 12 sommets au plus
12+ _MAX_KM_SAMPLES = 96
613
714
815# ── Hexagone (sommet pointu en haut) ──────────────────────────
@@ -134,21 +141,21 @@ déf tri_arete_y3(x1, y1, x2, y2):
134141
135142
136143# ── K - means (couleur representative) ─────────────────────────
144+ # Tableaux pre- alloues : pas d'append() , pas de croissance quadratique.
137145
138- _km_r = []
139- _km_g = []
140- _km_b = []
146+ _km_r = [0.0 pour _ dans range(_MAX_KM_SAMPLES) ]
147+ _km_g = [0.0 pour _ dans range(_MAX_KM_SAMPLES) ]
148+ _km_b = [0.0 pour _ dans range(_MAX_KM_SAMPLES) ]
141149_km_k = 3
150+ _km_n = 0
142151_km_res_r = 0
143152_km_res_g = 0
144153_km_res_b = 0
145154
146155
147156déf km_init(k):
148- global _km_r, _km_g, _km_b, _km_k, _km_res_r, _km_res_g, _km_res_b
149- _km_r = []
150- _km_g = []
151- _km_b = []
157+ global _km_n, _km_k, _km_res_r, _km_res_g, _km_res_b
158+ _km_n = 0
152159 _km_k = entier(k)
153160 _km_res_r = 0
154161 _km_res_g = 0
@@ -157,10 +164,13 @@ déf km_init(k):
157164
158165
159166déf km_ajouter(r, g, b):
160- global _km_r, _km_g, _km_b
161- _km_r.append(r)
162- _km_g.append(g)
163- _km_b.append(b)
167+ global _km_r, _km_g, _km_b, _km_n
168+ si _km_n > = _MAX_KM_SAMPLES:
169+ retour 0
170+ _km_r[_km_n] = r
171+ _km_g[_km_n] = g
172+ _km_b[_km_n] = b
173+ _km_n = _km_n + 1
164174 retour 0
165175
166176
@@ -172,8 +182,8 @@ déf _dist2(r1, g1, b1, r2, g2, b2):
172182
173183
174184déf km_calculer(max_iter):
175- global _km_res_r, _km_res_g, _km_res_b, _km_k, _km_r, _km_g, _km_b
176- n = len(_km_r)
185+ global _km_res_r, _km_res_g, _km_res_b, _km_k, _km_r, _km_g, _km_b, _km_n
186+ n = _km_n
177187 si n == 0 :
178188 retour 0
179189 k = min(_km_k, n)
@@ -237,32 +247,31 @@ déf km_b():
237247
238248
239249# ── Stockage global des tuiles ────────────────────────────────
250+ # Tableaux pre- alloues une seule fois au chargement du module .
251+ # _tuiles_reinit() remet seulement les compteurs a zero : aucune
252+ # allocation supplementaire par rendu, memoire en O (1 ).
240253
241- _tuiles_xs = []
242- _tuiles_ys = []
243- _tuiles_off = []
244- _tuiles_n = []
245- _vus_n = []
246- _vus_cx = []
247- _vus_cy = []
254+ _tuiles_xs = [0.0 pour _ dans range(_MAX_COORDS)]
255+ _tuiles_ys = [0.0 pour _ dans range(_MAX_COORDS)]
256+ _tuiles_off = [0.0 pour _ dans range(_MAX_TUILES)]
257+ _tuiles_n = [0.0 pour _ dans range(_MAX_TUILES)]
258+ _vus_n = [0.0 pour _ dans range(_MAX_TUILES)]
259+ _vus_cx = [0.0 pour _ dans range(_MAX_TUILES)]
260+ _vus_cy = [0.0 pour _ dans range(_MAX_TUILES)]
261+ _nb_tuiles = 0
262+ _nb_coords = 0
248263
249264
250265déf _tuiles_reinit() :
251- global _tuiles_xs, _tuiles_ys, _tuiles_off, _tuiles_n
252- global _vus_n, _vus_cx, _vus_cy
253- _tuiles_xs = []
254- _tuiles_ys = []
255- _tuiles_off = []
256- _tuiles_n = []
257- _vus_n = []
258- _vus_cx = []
259- _vus_cy = []
266+ global _nb_tuiles, _nb_coords
267+ _nb_tuiles = 0
268+ _nb_coords = 0
260269 retour 0
261270
262271
263272déf _ajouter_poly(xs, ys, larg, haut):
264273 global _tuiles_xs, _tuiles_ys, _tuiles_off, _tuiles_n
265- global _vus_n, _vus_cx, _vus_cy
274+ global _vus_n, _vus_cx, _vus_cy, _nb_tuiles, _nb_coords
266275 n = len(xs)
267276 si n == 0 :
268277 retour 0
@@ -292,17 +301,21 @@ déf _ajouter_poly(xs, ys, larg, haut):
292301 retour 0
293302 cx = entier(cx * 100.0 ) / 100.0
294303 cy = entier(cy * 100.0 ) / 100.0
295- pour k dans range(len(_vus_n) ):
304+ pour k dans range(_nb_tuiles ):
296305 si _vus_n[k] == n et _vus_cx[k] == cx et _vus_cy[k] == cy:
297306 retour 0
298- _vus_n.append(n)
299- _vus_cx.append(cx)
300- _vus_cy.append(cy)
301- _tuiles_off.append(len(_tuiles_xs))
302- _tuiles_n.append(n)
307+ si _nb_tuiles > = _MAX_TUILES ou _nb_coords + n > _MAX_COORDS:
308+ retour 0
309+ _vus_n[_nb_tuiles] = n
310+ _vus_cx[_nb_tuiles] = cx
311+ _vus_cy[_nb_tuiles] = cy
312+ _tuiles_off[_nb_tuiles] = _nb_coords
313+ _tuiles_n[_nb_tuiles] = n
303314 pour i dans range(n):
304- _tuiles_xs.append(xs[i])
305- _tuiles_ys.append(ys[i])
315+ _tuiles_xs[_nb_coords + i] = xs[i]
316+ _tuiles_ys[_nb_coords + i] = ys[i]
317+ _nb_tuiles = _nb_tuiles + 1
318+ _nb_coords = _nb_coords + n
306319 retour 1
307320
308321
@@ -621,7 +634,7 @@ déf generer_tuiles(larg, haut, a, methode):
621634 _gen_grand_rhombitrihex(larg, haut, a)
622635 si m == 10 :
623636 _gen_hex_tronque(larg, haut, a)
624- retour len(_tuiles_off)
637+ retour _nb_tuiles
625638
626639
627640déf tuile_n_sommets(i):
0 commit comments