Comment puis-je trouver un mur qui sépare deux points ou plus sur une carte basée sur une grille?


8

J'essaie de générer des murs qui coupent un point donné d'autres points donnés. L'image ci-jointe montre le genre de chose que je recherche:

entrez la description de l'image ici

  1. Bleu séparé du rouge.
  2. Bleu séparé du rouge et du jaune.
  3. Bleu séparé du rouge avec des obstructions de tuiles.
  4. Plusieurs bleus séparés de plusieurs rouges.

Des idees pour faire cela?


1
C'est un peu trop large ... voulez-vous minimiser le bleu, ou peut-être vous voulez une surface égale, ou peut-être que la zone n'a pas d'importance mais vous voulez minimiser la longueur du mur, ou peut-être tout ce qui n'est pas pertinent et ce qui compte vraiment, c'est de trouver une solution rapidement ... etc.
Theraot

1
Pour vous donner, ou donner à d'autres, une direction possible, cela semble lié à une variante de "manor distance voronoi" en fonction du look que vous recherchez ou simplement de voronoi ordinaire.
Sirisian

D'accord avec les deux autres commentaires, ma première pensée a été "il existe un nombre infini de solutions". Où "infini" peut ne pas être infini par arbitrairement grand. Il n'y a aucune restriction sur ce qui permet ceci et non cela .
Draco18s ne fait plus confiance au SE

Désolé de ne pas être plus précis. Vraiment, la seule exigence stricte était que le mur sépare les points donnés, ce qui, je le réalise, a des solutions presque infinies. Les images que j'ai fournies n'étaient pas vraiment plus qu'une idée générale de ce que j'essayais de faire, donc votre montage, Draco, serait un résultat parfaitement valide pour mes besoins. Je cherchais juste le genre de méthodes qui produiraient ce genre de résultats, même s'il y a un grand nombre de résultats.
IanLarson

Réponses:


8

Je présenterai un concept général et trois solutions utilisant ce concept.

Le concept est une carte d'influence : pour chaque emplacement de la carte, vous allez enregistrer un nombre qui représente la distance jusqu'à chaque point de couleur. De cette façon, pour chaque position, vous pouvez interroger la distance entre le bleu, le rouge, le vert, etc. Nous appelons le résultat la carte d'influence.

Pour plus de détails sur la motivation, la création et l'utilisation des cartes d'influence dans les jeux, voir: The Mechanics of Influence Mapping: Representation, Algorithm & Parameters .

Je ne sais pas à quoi sert ce mur, mon canon principal est que nous parlons d'un jeu de stratégie, et l'IA décide où placer les murs. Pour ce faire, il existe de nombreuses approches en plus de celles présentées ici. Une approche simple serait de placer les murs à une distance fixe des points de couleur et de combiner les zones lorsqu'elles se chevauchent - et, bien sûr, de ne pas les construire sur des obstacles - les avantages de cette méthode sont qu'elle garantit que les murs ne sont pas trop loin d'envoyer des troupes pour les défendre et c'est très peu coûteux en calcul. Je suppose que vous voulez quelque chose de plus complexe.

Solution 1 :

Pour trouver un moyen d'envelopper le bleu, trouvez la différence entre la distance au bleu et à toute autre chose, pour chaque point. Addendum : La zone où la différence est positive est le domaine d'influence du bleu. Si vous prenez les domaines d'influence pour chaque point de couleur, vous pouvez créer un diagramme de Voronoi . Merci à Sirisian de les avoir mentionnés .

Nous pouvons affirmer que pour un point proche du bleu, la différence sera positive, et pour un point proche d'un autre point de couleur, la différence sera négative. Étant donné que la distance est une fonction continue, selon le théorème de la valeur intermédiaire, nous pouvons affirmer qu'au moins un point au milieu la différence approchera de zéro. Une solution serait de tracer un mur qui minimise la distance entre toutes les tuiles où la différence approche de zéro.

Quelle que soit la solution prise en compte ou non, les obstacles dépendent de la fonction de distance. Si vous n'utilisez que les distances de Manhattan ou euclidiennes sans considérer les chemins possibles, le mur résultant ne tirera pas parti des obstacles existants sur la carte.

Remarque: cette solution approche la zone égale pour le bleu et le reste dans un scénario plat.

Solution 2 :

Dans l'abstrait, vous pouvez trouver des points d'étranglement entre la zone d'influence du bleu et les autres, puis y placer les murs. Faire cela placera les murs dans des endroits où l'influence n'est pas en équilibre (les murs sont plus proches d'un côté) mais minimisera la longueur des murs.

Une approche utile pour trouver des points d'étranglement consiste à diviser le scénario en nœuds convexes et à créer un réseau qui représente le scénario. Vous commencerez à supposer que vous placerez des murs autour des nœuds qui ont directement du bleu, puis commencerez à avancer sur le réseau (en augmentant toujours la distance par rapport au bleu) et à considérer la longueur du mur si vous l'avez placé autour de ce que vous avez avancé jusqu'à présent. Votre solution est la position qui avait une longueur minimale (et les emplacements des murs sont les points d'étranglement).

En pratique, l'algorithme est un peu plus compliqué que cela car il peut y avoir des ramifications dans le scénario. Vous n'avez besoin de considérer chaque ramification qu'une seule fois et de choisir la meilleure position pour le mur pour cette ramification.

Solution 3 :

La première solution a le problème de conduire à un mur trop long. La deuxième solution a le problème de conduire à des murs trop éloignés du bleu.

Notez que travailler avec des pixels, des tuiles ou travailler avec un réseau le concept de la carte d'influence, comme une représentation de la distance aux points de couleur est valide et utile. Ainsi, il est possible d'appliquer la solution 1 sur le réseau de nœuds convexes.

Ma troisième solution consiste à combiner les approches ci-dessus. Une fois que vous travaillez sur le réseau, vous pouvez considérer la longueur du mur et la différence d'influence - et toute autre mesure que vous souhaitez - comme un indicateur unique de «coût» que vous pouvez optimiser.


1
C'est super utile. L'utilisation d'une carte d'influence ressemble exactement à ce dont j'ai besoin. Merci pour les liens et la réponse détaillée.
IanLarson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.