Apa cara terbaik untuk mewakili dan memecahkan labirin yang diberi gambar?
Diberikan gambar JPEG (seperti yang terlihat di atas), apa cara terbaik untuk membacanya, parsing ke dalam beberapa struktur data dan pecahkan maze? Insting pertama saya adalah membaca gambar dalam pixel demi pixel dan menyimpannya dalam daftar (array) nilai boolean: True
untuk pixel putih, dan False
untuk piksel non-putih (warna dapat dibuang). Masalah dengan metode ini, adalah bahwa gambar mungkin tidak "pixel perfect". Maksud saya, jika ada piksel putih di suatu tempat di dinding, itu mungkin membuat jalur yang tidak diinginkan.
Metode lain (yang datang kepada saya setelah sedikit berpikir) adalah untuk mengkonversi gambar ke file SVG - yang merupakan daftar jalur yang digambar di atas kanvas. Dengan cara ini, jalur dapat dibaca ke dalam daftar yang sama (nilai boolean) di mana True
menunjukkan jalur atau dinding,False
menunjukkan ruang yang dapat bepergian. Masalah dengan metode ini muncul jika konversi tidak 100% akurat, dan tidak sepenuhnya menghubungkan semua dinding, menciptakan celah.
Juga masalah dengan mengkonversi ke SVG adalah bahwa garis tidak lurus "sempurna". Ini menghasilkan lintasan menjadi kurva kubik bezier. Dengan daftar (larik) nilai boolean yang diindeks oleh bilangan bulat, kurva tidak akan mudah ditransfer, dan semua titik yang garis pada kurva harus dihitung, tetapi tidak akan sama persis dengan daftar indeks.
Saya berasumsi bahwa sementara salah satu metode ini dapat bekerja (meskipun mungkin tidak) bahwa mereka sangat tidak efisien diberi gambar sebesar itu, dan bahwa ada cara yang lebih baik. Bagaimana ini terbaik (paling efisien dan / atau dengan kompleksitas paling sedikit) dilakukan? Apakah ada cara terbaik?
Kemudian datang pemecahan labirin. Jika saya menggunakan salah satu dari dua metode pertama, saya pada dasarnya akan berakhir dengan sebuah matriks. Menurut jawaban ini , cara yang baik untuk mewakili labirin menggunakan pohon, dan cara yang baik untuk menyelesaikannya adalah menggunakan algoritma A * . Bagaimana cara membuat pohon dari gambar? Ada ide?
TL; DR
Cara terbaik untuk menguraikan? Ke dalam struktur data apa? Bagaimana mengatakan struktur membantu / menghambat penyelesaian?
PEMBARUAN
Saya sudah mencoba menerapkan @Mikhail dengan Python, menggunakan numpy
, seperti yang direkomendasikan oleh @Thomas. Saya merasa bahwa algoritme itu benar, tetapi tidak berfungsi seperti yang diharapkan. (Kode di bawah ini.) Perpustakaan PNG adalah PyPNG .
import png, numpy, Queue, operator, itertools
def is_white(coord, image):
""" Returns whether (x, y) is approx. a white pixel."""
a = True
for i in xrange(3):
if not a: break
a = image[coord[1]][coord[0] * 3 + i] > 240
return a
def bfs(s, e, i, visited):
""" Perform a breadth-first search. """
frontier = Queue.Queue()
while s != e:
for d in [(-1, 0), (0, -1), (1, 0), (0, 1)]:
np = tuple(map(operator.add, s, d))
if is_white(np, i) and np not in visited:
frontier.put(np)
visited.append(s)
s = frontier.get()
return visited
def main():
r = png.Reader(filename = "thescope-134.png")
rows, cols, pixels, meta = r.asDirect()
assert meta['planes'] == 3 # ensure the file is RGB
image2d = numpy.vstack(itertools.imap(numpy.uint8, pixels))
start, end = (402, 985), (398, 27)
print bfs(start, end, image2d, [])
visited.append(s)
bawah for.if
dan menggantinya dengan visited.append(np)
. Sebuah vertex dikunjungi setelah ditambahkan ke antrian. Bahkan, array ini harus dinamai "antri". Anda juga dapat menghentikan BFS setelah Anda mencapai finish.