Algoritmo per determinare la direzione in base alle tessere precedenti

2

Diciamo che ho un oggetto, chiamato "Tile", che ha sia un nome che un elenco di direzioni. Assumiamo che ogni tessera abbia una griglia di pixel 3x3, che può essere attivata o disattivata. Il pixel centrale del centro (indicato con una "N" nel diagramma) della tessera si accende quando la direzione Nord è "Vero". Il pixel del centro sinistra ("W" nel diagramma) della tessera si accende quando la direzione Ovest è "Vero". Il pixel del centro destra ("E") della tessera si accende quando la direzione Est è "Vero". Il pixel centrale inferiore ("S") della tessera si accende quando la direzione Sud è "Vero". Il pixel centrale ("C") è sempre attivo.

Schema:

 N 
WCE
 S

Ogni tessera può avere solo un inizio e una fine, quindi ci sono 6 tessere possibili. (Straights East-West e North-South e tutti e 4 i pezzi che formano angoli di 90 gradi)

Ecco un riquadro di esempio, completo di attributi:

Tile1:
-North: True
-East: False
-South: False
-West: True

Ecco come appare questo riquadro, se i trattini sono pixel "off" e i segni percentuali sono in pixel:

-%-
%%-
——-

Diciamo che ho una lista di queste tessere, dove ogni tessera si collega a quella nella lista prima di essa, e io le sto generando proceduralmente.

L'idea è di essere in grado di generare percorsi di lunghezze arbitrarie, che non devono necessariamente esistere all'interno dei limiti di un array.

Certo, voglio che la mia mappa delle tessere sia logicamente ragionevole, quindi non può avere più di 3 sinistri o diritti di fila. La mia attuale "soluzione" è di avere un contatore dove sottrarre uno se gira a destra del riquadro corrente e aggiungerne uno se gira a sinistra. Potrei quindi forzarlo a scegliere un pezzo che gira a sinistra se il contatore è a -3, e forzarlo a scegliere un pezzo di svolta a destra se il contatore è a 3. (Questo algoritmo funzionerà con i miei attuali metodi di generazione, che non è il problema.)

Qual è il modo più efficace, date le tessere precedenti e le rispettive direzioni, per determinare se incrementare o decrementare il contatore?

Scusa se questo è un po 'prolisso, non riesco a pensare a un modo migliore per esprimere la mia domanda.

Modifica: Per chiarire, l'obiettivo dell'algoritmo è determinare se una tessera data gira a sinistra, a destra o dritta (che non è in realtà un turno, ma IDC) in base alle tessere precedenti e restituisce rispettivamente 1, -1 o 0, . Questo è tutto.

    
posta iPhoenix 02.01.2018 - 00:37
fonte

1 risposta

1

Dovrei ribadire che la logica del contatore non sarà sufficiente a mantenere il percorso dall'attraversare se stesso, se questo è il tuo obiettivo. Se capisco correttamente la tua domanda, però, al momento ti interessa solo come implementare il contatore.

Quindi abbiamo sei diversi tipi di tessere, che hai identificato nella tua domanda. Determinare quale di questi abbiamo a che fare è relativamente semplice: dobbiamo solo controllare due pixel, come li chiami.

Una volta che sappiamo con quale tipo di tessera abbiamo a che fare, la domanda diventa se è una svolta a destra o a sinistra. I due tipi dritti sono facili, ovviamente. Quindi supponiamo di avere la tessera di svolta dalla tua domanda. Se questa è una svolta a sinistra oa destra dipende dalla direzione in cui entriamo nella tessera (Nord o Ovest in questo caso).

Approccio A

Ruota la tessera in base alla direzione di immissione, in modo da inserire sempre la tessera (ruotata) dalla stessa direzione, ad es. Sud. Quindi è sufficiente controllare i pixel est e ovest per determinare rispettivamente una svolta a sinistra oa destra. Se nessuno dei due è ON, allora è una tessera dritta.

Approccio B

Crea una tabella hash (o simile) per ogni tipo di tile. Determina in anticipo quali direzioni di entrata portano a svolta a sinistra (al massimo 1), svolta a destra (al massimo 1) e quali non sono valide (tutte le altre). Quindi è una semplice ricerca.

In entrambi i casi, inizierai con una direzione e poi applicherai in sequenza l'algoritmo a tutte le tessere del tuo percorso.

    
risposta data 02.01.2018 - 01:19
fonte

Leggi altre domande sui tag