Come posso trovare proceduralmente un muro che separa due o più punti su una mappa a griglia?


8

Sto cercando di generare muri che tagliano un dato punto da altri punti dati. L'immagine allegata mostra il tipo di cosa che sto cercando:

inserisci qui la descrizione dell'immagine

  1. Blu separato dal rosso.
  2. Blu separato da rosso e giallo.
  3. Blu separato dal rosso con ostruzioni delle piastrelle.
  4. Blu multiplo separato da rosso multiplo.

qualche idea sul come farlo?


1
Questo è un po 'troppo ampio ... vuoi minimizzare le aree di blu, o forse vuoi un'area uguale, o forse l'area non importa ma vuoi minimizzare la lunghezza del muro, o forse tutto ciò che è irrilevante e ciò che conta davvero è trovare rapidamente una soluzione ... ecc.
Theraot

1
Per dare a te, o ad altri, una possibile direzione, questo sembra correlato a una variante di "manhattan distance voronoi" a seconda dell'aspetto che stai cercando o solo dei voronoi regolari.
Sirisian

D'accordo con entrambi gli altri commenti, il mio primo pensiero fu "ci sono un numero infinito di soluzioni". Dove "infinito" non può essere infinito per arbitrariamente grande. Non ci sono restrizioni su ciò che consente questo e non questo .
Draco18s non si fida più di SE

Ci scusiamo per non essere più specifici. In realtà, l'unico requisito rigoroso era che il muro separasse i punti dati, che realizzo ha soluzioni quasi infinite. Le immagini che ho fornito non erano realmente intese come qualcosa di più di un'idea generale di ciò che stavo cercando di fare, quindi la tua modifica, Draco, sarebbe stata un risultato perfettamente valido per i miei scopi. Stavo solo cercando il tipo di metodi che avrebbero prodotto quel tipo di risultati, anche se ci sono un numero enorme di risultati.
IanLarson,

Risposte:


8

Presenterò un concetto generale e tre soluzioni usando quel concetto.

Il concetto è una mappa di influenza : per ogni posizione nella mappa, si memorizzerà un numero che rappresenta la distanza di ciascun punto di colore. In questo modo, per ogni posizione puoi interrogare quanto è distante da blu, rosso, verde, ecc. Chiamiamo il risultato è la mappa di influenza.

Per maggiori dettagli sulla motivazione, la creazione e l'uso delle mappe di influenza nei giochi, consultare: Mappatura dei meccanismi di influenza: rappresentazione, algoritmo e parametri .

Non ho idea di cosa serva questo muro, il mio principale canone è che stiamo parlando di un gioco di strategia e l'IA sta decidendo dove posizionare i muri. Per fare ciò, ci sono molti approcci oltre a quelli presentati qui. Un approccio semplice sarebbe quello di posizionare le pareti a una distanza fissa dai punti di colore e combinare le aree quando si sovrappongono - e, naturalmente, non costruirle sopra gli ostacoli - i vantaggi di questo metodo sono che garantisce che le pareti non siano troppo lontano per inviare truppe per difenderle ed è molto economico dal punto di vista computazionale. Presumo che tu voglia qualcosa di più complesso.

Soluzione 1 :

Per trovare un modo per avvolgere il blu, trova la differenza tra la distanza dal blu e qualsiasi altra cosa, per ogni punto. Addendum : L'area in cui la diffrerenza è positiva è il dominio di influenza per il blu. Se prendi i domini di influenza per ogni punto di colore, puoi costruire un diagramma Voronoi . Grazie a Sirisian per averlo menzionato .

Possiamo sostenere che per un punto vicino al blu, la differenza sarà positiva e per un punto vicino a un altro punto di colore, la differenza sarà negativa. Dato che la distanza è una funzione continua, con il teorema del valore intermedio, possiamo sostenere che almeno un punto nel mezzo la differenza si avvicinerà allo zero. Una soluzione sarebbe quella di tracciare un muro che minimizzi la distanza tra tutte le piastrelle in cui la differenza si avvicina allo zero.

Qualunque sia la soluzione che tenga conto degli ostacoli, dipende dalla funzione della distanza. Se usi solo le distanze di Manhattan o Euclide senza considerare possibili percorsi, il muro risultante non sfrutterà gli ostacoli esistenti nella mappa.

Nota: questa soluzione si avvicina alla stessa area per il blu e il resto in uno scenario piatto.

Soluzione 2 :

In astratto, puoi trovare i punti di strozzamento tra l'area di influenza del blu e gli altri, e quindi posizionare lì i muri. In questo modo i muri verranno posizionati in punti in cui l'influenza non è in equilibrio (i muri la mia estremità più vicina a un lato) ma ridurranno al minimo la lunghezza dei muri.

Un approccio utile per trovare i punti di strozzamento è suddividere lo scenario in nodi convessi e creare una rete che rappresenti lo scenario. Inizierai supponendo che metterai dei muri attorno ai nodi che hanno direttamente il blu, quindi inizierai ad avanzare sulla rete (aumentando sempre la distanza dal blu) e considerando la lunghezza del muro se lo hai posizionato attorno a ciò che hai avanzato finora. La tua soluzione è la posizione che aveva una lunghezza minima (e le posizioni delle pareti sono i punti di strozzamento).

In pratica, l'algoritmo è un po 'più complicato di quello perché potrebbero esserci delle ramificazioni nello scenario. Devi solo considerare ogni ramificazione una volta e scegliere la posizione migliore per il muro per quella ramificazione.

Soluzione 3 :

La prima soluzione ha il problema che potrebbe portare a un muro troppo lungo. La seconda soluzione ha il problema che potrebbe portare a muri troppo lontani dal blu.

Si noti che lavorare con pixel, riquadri o lavorare con una rete il concetto della mappa dell'influenza, poiché una rappresentazione della distanza dai punti di colore è valida e utile. Pertanto, è possibile applicare la soluzione 1 sulla rete di nodi convessi.

La mia terza soluzione è combinare i suddetti approcci. Una volta che lavori sulla rete, puoi considerare la lunghezza del muro e la differenza di influenza - e qualsiasi altra metrica che desideri - come un singolo indicatore "costo" che puoi ottimizzare.


1
Questo è super utile. L'uso di una mappa di influenza suona esattamente come quello di cui ho bisogno. Grazie per i collegamenti e la risposta dettagliata.
IanLarson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.