Se stai cercando di trovare un percorso attraverso una serie di quadrati di terreno, o un percorso attraverso un insieme di nodi connessi, allora l'attraversamento in ampiezza o prima in profondità funziona bene. (Un trucco per limitare le dimensioni della traversata per fare una ricerca in ampiezza, ma iniziare una traversata sia al punto iniziale che al punto finale, e fermarsi alla prima cella che entrambi hanno raggiunto.)
Tuttavia, se stai disegnando una linea da A a B su qualche griglia, allora funzionano gli algoritmi di disegno di base. Una versione classica è l'algoritmo di riga di Bresenham , che è piuttosto semplice.
Se vuoi una versione più semplice che distribuisca solo passi sull'asse X con passi sull'asse Y, sembra proprio questo. È un po 'come "divisione aggiungendo". Questo è solo il fondamento: un sacco di spazio per miglioramenti! (Python)
def line(x0, y0, x1, y1):
# number of steps x and y
mx = abs(x1 - x0)
my = abs(y1 - y0)
# the greater number of steps
steps = max(mx, my)
sx = 0
sy = 0
x = x0
y = y0
path = [(x0, y0)]
while x != x1 or y != y1:
sx += mx
sy += my
if sx >= steps:
sx -= steps
x += 1 # only one direction for now
if sy >= steps:
sy -= steps
y += 1 # only one direction for now
#print((sx, sy, mx, my))
path.append((x,y))
return path
if __name__ == '__main__':
print(line(0, 0, 8, 8))
print(line(0, 0, 4, 8))
print(line(0, 0, 8, 4))
print(line(0, 0, 0, 8))
print(line(0, 0, 8, 0))
Ho usato questo algoritmn per creare archi circolari o ellittici, linee oblique (cioè uno che arriva al bersaglio con una leggera angolazione), percorsi perpendicolari, o anche solo correre direttamente dal bersaglio! Probabilmente ho trascorso più tempo su questo di quanto avrei dovuto da giovane. ;)
...
Un altro pensiero; se stai programmando un algoritmo di "caccia", in cui un robot insegue un bersaglio, allora ci sono alcune divertenti varianti su questo. Non devi calcolare il percorso completo.
-
Sposta diagonalmente o lungo un asse: x += 1 if x1 > x0
, x -= 1 if x1 < x0
-
Sposta lungo linee di 45 gradi: x += 1 if dx > dy / 2
ecc.
Un altro divertente è quello di spostare il robot x += dx / 10
... mentre non sta facendo passi costanti, diventa uno schermo piuttosto interessante se hai un gruppo di robot sparsi casualmente che si rincorrono.
...
Un altro pensiero. Questo funziona quando x e y sono dimensioni spaziali (come in una griglia o in una matrice), ma funziona anche se una delle dimensioni è tempo . Ad esempio, se desideri distribuire 5 messaggi in 8 secondi, puoi considerare y come tempo e utilizzare lo stesso ciclo per distribuire un certo numero di eventi in un lasso di tempo.