Skip to content

Commit f688484

Browse files
Update code
1 parent 48e564f commit f688484

3 files changed

Lines changed: 63 additions & 57 deletions

File tree

public/app.js

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
const MAX_DIM = 1200;
2-
const MAX_TUILES_WASM = 8000;
2+
// Maximum tiles the WASM module will store (matches _MAX_TUILES in hexagonify_wasm.ml).
3+
const MAX_TUILES_WASM = 2000;
34

4-
// Approximate tile density (tiles per unit area / cote^2) for each tiling method.
5-
// Used to estimate the minimum safe cote before calling generer_tuiles.
5+
// Tile density per (cote² / image area) for each tiling method, used to warn
6+
// the user when the requested tile size would exceed the WASM tile cap.
67
const DENSITE_METHODE = {
7-
hex: 0.40, square: 1.0, triangle: 2.35,
8-
trihex: 2.70, snub_trihex: 4.2, triangulaire_elongue: 1.65,
9-
carre_snub: 1.25, rhombitrihex: 2.05, carre_tronque: 0.28,
10-
grand_rhombitrihex: 0.38, hex_tronque: 0.60,
8+
hex: 0.50, square: 1.0, triangle: 2.50,
9+
trihex: 1.0, snub_trihex: 2.50, triangulaire_elongue: 1.70,
10+
carre_snub: 1.30, rhombitrihex: 1.0, carre_tronque: 0.30,
11+
grand_rhombitrihex: 0.10, hex_tronque: 0.40,
1112
};
1213

1314
function coteSuretePourImage(w, h, methode) {
@@ -322,18 +323,9 @@ async function rendreSortie() {
322323
const coteDemande = cote;
323324
const coteMin = coteSuretePourImage(w, h, state.method);
324325
if (cote < coteMin) cote = coteMin;
325-
let nTuiles;
326-
for (let tentative = 0; tentative < 6; tentative++) {
327-
try {
328-
nTuiles = Number(wasm.generer_tuiles(w, h, cote, code));
329-
break;
330-
} catch (err) {
331-
if (tentative >= 5) throw err;
332-
cote = Math.ceil(cote * 1.5);
333-
}
334-
}
326+
const nTuiles = Number(wasm.generer_tuiles(w, h, cote, code));
335327
if (cote !== coteDemande) {
336-
status.textContent = `Taille ajustee a ${cote}px (limite memoire WASM).`;
328+
status.textContent = `Taille ajustee a ${cote}px (limite du mode ${state.method}).`;
337329
}
338330
if (cote !== state.side) {
339331
state.side = cote;

scripts/compile_wasm.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ déf generer_wat_et_wasm(source):
5555
soit wasmtime = importlib.import_module("wasmtime")
5656
soit programme = charger_programme(source)
5757
soit texte_wat = WATCodeGenerator().generate(programme)
58+
texte_wat = texte_wat.replace('(memory (export "memory") 4)', '(memory (export "memory") 16)')
5859
soit octets_wasm = wasmtime.wat2wasm(texte_wat)
5960
retour [texte_wat, octets_wasm]
6061

src/hexagonify_wasm.ml

Lines changed: 52 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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

147156
dé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

159166
dé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

174184
dé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

250265
dé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

263272
dé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

627640
déf tuile_n_sommets(i):

0 commit comments

Comments
 (0)