En partant sur des zones circulaires, l'algo se contenterait de proposer une série points (des centres) sur la map les uns après les autres (coordonnés X,Y) en s'assurant à chaque nouveau point qu'il respecte les limites (en prenant en compte les rayons) avec ceux déjà positionnés (+ les zones/objos de scénar).
En gros :
- l'algo propose un décor random (avec son centre, son rayon, sa nature -illimitée ou non) parmi ceux enregistrés
- l'algo propose ensuite un point (X,Y) random, qui serait le futur centre du décor
- l'algo calcule sa validité par rapport aux autres décors déjà validés (en calculant les distance centres à centre moins les rayons, et en fonction de leur nature)
- si c'est OK, ça valide (et ça peut même proposer une rotation random du décor autour du pt central validé, pour varier les plaisirs ^^)
- Si c'est KO, l'algo propose un autre point et re-calcule. Au bout de 3 essais infructueux, l'algo re-propose carrément un nouveau décor et reprend l'algo en haut.
Le problème, selon moi, c'est qu'à aucun moment tu ne vérifies s'il existe un endroit où il est possible de placer un décors (ce qui nous donnerai une boucle infinie). On peut certes arrêter à un certain nombre d'essai, mais si ton random te place plusieurs fois ton second point dans des endroits interdit, tu vas te retrouver avec un seul décors. Bon après, libre aux joueurs de re générer la carte...
Proposition d'algo :
- Ne faire que des décors qui tiennent dans un diamètre de 4", avec rotation aléatoire au placement
- Classer en restrictif non ou restrictif les décors
- Faire un mapping de points/noeuds éloignés de 7" les uns des autres sur le terrain de jeu
- Attribuer n décors restrictifs et m décors non-restrictfs
- Définir pour chaque scénario quels noeuds sont exclus pour les restrictifs
- Les restictifs sont placés d'abord, avec interdiction de placer deux restrictifs en proches voisins ou sur les noeuds interdits par le scénario
- Les non-restrictifs sont placés sur les empalcements restants, sans autre restriction
Avec genre 2-4 restrictifs et 4-6 non-restrictifs, tu as moyen d'avoir une pure table, a l'équilibre des côtés prêt.
SunHunter -
Reste quand même le problème su mapping... qui était le seul vraiment présent, je crois. J'imagine qu'il y a un coup à jouer du côté des graphes fortement connexes, mais ça me parait couteux (la solution qui me vient intuitivement à l'esprit étant d'attribuer des forces à chaque décors et élément de scénario/déploiement). Pour ce qui est de la taille je pense qu'il va falloir choisir un peu plus grand comme diamètre, mais cela ne change pas fondamentalement l'algo, je pense (à moins que les 7" et n décors aient été choisis pour être opti sur une table de 48").
Voici une solution, qui ne se prétend pas optimale, mais qui devrait fonctionner, si vraiment tu n'as pas de problème avec les intersections. ("J'ai une solution, mais elle ne fonctionne que dans le vide avec des poules sphériques")
Zones_interdites[] : zones dans lesquelles ne doivent pas apparaître de points (reroll sinon). Si elle représente plus d'un certains pourcentage de la carte, arrêter. Les zones sont représentée par deux points formant un rectangle. Si deux zones se chevauchent, supprimer le chevauchement en scindant l'une d'elle en 3 et en ramenant les bords des trois nouvelles zones aux bordures de la première (normalement une seule à modifier). Si l'une est contenu dans une autre, la supprimer.
Décor : un point, une image, un rayon, restrictif/non restrictif.
-Initialiser zones_interdites[] avec les zones de déploiement.
-Placer quatre décors non restrictif de rayon 0 sans image, 2" en retrait dans les zones de déploiement de chaque côté de la carte
-déterminer le nombre non restrictif de décors espéré Nombre_NRestrictif_Final.
-Nombre_décors=0;
-tant que (il n'y a pas ce nombre et que zones_interdites ne recouvre pas 80%[arbitraire] de la carte)
-{
--Placer un décors au hasard, entièrement hors des zones interdites.
--Si( distance nouveau décors <-> décors le plus proche < 2")
--{
---Prendre le point le plus proche à droite, le point le plus proche au dessus, à gauche, en dessous. délimiter la zone formée par leurs position -2" (ne pas oublier leurs rayons).
---Si( la zone est suffisamment large et haute)
---{
----Placer le décors entièrement dans la zone (random hors zones interdites)
---}
---Sinon
---{
----Si(la zone n'est pas assez haute XOR pas assez large)
----{
-----placer le décors entièrement dans la zone en ignorant la contrainte problématique, en conservant seulement le centre dans la zone. Mesurer.
----}Fin Si
---}Fin Si
--}Fin Si
--Si(décors ok)
--{
---Placer le décors.
---Nombre_décors++.
--}
--Sinon
--{
---Ajouter la zone délimitée par les points aux zones interdites
--}Fin Si
-}Fin tant que
-Placer des décors restrictifs invisibles à la place des drapeaux et objectifs. Ajouter les zones de scénario aux zones interdites.
-Recommencer, en plaçant les décors entièrement hors des zones interdites.
Pas testé. Mais ça déroule bien sur mon bout de papier. Ce qui ne signifie pas grand chose niveau ressource, mais ça doit aller. Si on s'accorde sur une taille de décors maximale, cela simplifie évidemment, et on peut en revenir à l'algo de SunHunter. Noter aussi que la surface à recouvrir peut-être dépendante de la taille des décors placé. Peut-être augmenter les zones interdites du rayon des décors formant les angles des zones.
P.S. : Sinon j'en reste sur mes zones prédéfinies, qui feront se ressembler les tables les unes aux autres. Je vois (et voyais déjà) deux solutions au problème (qui peuvent se mixer allègrement). 1. Plein de zones, chacune ayant une faible probabilité de poper un décors random. On risque juste d'avoir un parrallélisme persistant dans l'oeil. Il s'agit alors d'utiliser si possible des zones décalées (façon damier hexagonal) et éventuellement d'incliner la grille, afin de brouiller la perception d'ordre. 2. Des zones de tailles conséquente, qui popent chacune un décors à très forte probabilité, mais positionné aléatoirement dans la zone en question. 3. rendre les zones aléatoire (entre bornes) et utiliser le 2. .
On supprime toute nécessité de calcul (complexe et coûteux, s'entend), et je pense que malgré tout la table peut avoir de la gueule. Et en prime on doit pouvoir tenter d'équilibrer la quantité de décors de chaque côté (sans rendre la chose symétrique, même si cela semble également simple à faire).
Certaines zones ne popent évidemment que certains décors (en fonction du scénario).