Bonjour,
je recherche un algorithme discret qui me permettrait de construire une grande image à partir de plein de petites images qui ont chacune une taille donnée, en perdant le moins d'espace possible au final.
Merci :)
Version imprimable
Bonjour,
je recherche un algorithme discret qui me permettrait de construire une grande image à partir de plein de petites images qui ont chacune une taille donnée, en perdant le moins d'espace possible au final.
Merci :)
cherche knapsack.
Merci, je ne connaissais pas.
Cependant je pense que mon problème est légèrement différent:
La définition du problème knapsack accepte en entrée des listes d'objets pondérés et le poids total maximum et recherche combien d'objets de chaque type peuvent rentrer.
Mon problème est plutôt de trouver la taille minimale capable de faire rentrer toutes mes vignettes et aussi de déterminer un layout pour les agencer les unes par rapport aux autres. ;)
J'avoue ne pas avoir trouvé grand chose avec "layout algorithm", pourtant ces mots clefs semblaient tout à fait à propos.
En revanche une recherche avec "sprite packing" m'a permis de trouver cet article : http://www.codeproject.com/Articles/...gorithm-for-bu
Après quelques tests, ça marche pas mal du tout et c'est très rapide.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 Canvas canvas = new Canvas(); MapperOptimalEfficiency<Sprite> mapper = new MapperOptimalEfficiency<Sprite>(canvas); RandomSizeGenerator rd = new RandomSizeGenerator(10, 200, 100); List<ImageInfo> imgs = new List<ImageInfo>(); for (int i = 0; i < 100; i++) { imgs.Add(rd.Next()); } Sprite s = mapper.Mapping(imgs); var rnd = new Random(); using (Bitmap bmp = new Bitmap(s.Width, s.Height)) using (Graphics gr = Graphics.FromImage(bmp)) using (Pen pen = new Pen(Brushes.Black)) { foreach (var r in s.MappedImages) { gr.DrawRectangle(pen, r.X, r.Y, r.ImageInfo.Width, r.ImageInfo.Height); gr.FillRectangle(new SolidBrush(Color.FromArgb(rnd.Next())), r.X, r.Y, r.ImageInfo.Width, r.ImageInfo.Height); } bmp.Save("D:\\toto.bmp"); }
Merci à vous deux pour m'avoir mis sur la piste.