কোনও চিত্র দেওয়া কোনও গোলকধাঁধার প্রতিনিধিত্ব ও সমাধানের সর্বোত্তম উপায় কী?
একটি জেপিজি চিত্র দেওয়া (উপরে যেমন দেখানো হয়েছে), এটি পড়ার সর্বোত্তম উপায় কোনটি, এটি কোনও ডেটা স্ট্রাকচারে পার্স করে এবং গোলকধাঁধাটি সমাধান করার উপায়? আমার প্রথম প্রবৃত্তিটি পিক্সেল দ্বারা চিত্রটিকে পিক্সেলে পড়া এবং এটি বুলিয়ান মানগুলির একটি তালিকায় (অ্যারে) সংরক্ষণ করা: True
একটি সাদা পিক্সেল এবং False
একটি অ-সাদা পিক্সেলের জন্য (রঙগুলি বাদ দেওয়া যেতে পারে)। এই পদ্ধতির সমস্যাটি হ'ল চিত্রটি "পিক্সেল নিখুঁত" নাও হতে পারে। এর মাধ্যমে আমি কেবল বোঝাতে চাইছি যে কোনও দেয়ালে কোথাও যদি সাদা পিক্সেল থাকে তবে এটি একটি অনিচ্ছাকৃত পথ তৈরি করতে পারে।
আরেকটি পদ্ধতি (যা কিছুক্ষণ ভাবার পরে আমার কাছে এসেছিল) হ'ল চিত্রটিকে একটি এসভিজি ফাইলে রূপান্তর করা - এটি একটি ক্যানভাসে টানা পথগুলির তালিকা। এইভাবে, পাথগুলি একই ধরণের তালিকার (বুলিয়ান মান) পড়তে পারা যায় যেখানে True
কোনও পথ বা প্রাচীর False
নির্দেশ করে, ভ্রমণ-সক্ষম স্থান নির্দেশ করে। এই পদ্ধতির সাথে একটি সমস্যা দেখা দেয় যদি রূপান্তরটি 100% সঠিক না হয় এবং ফাঁক তৈরি করে দেয়ালগুলির সাথে পুরোপুরি সংযোগ না করে।
এছাড়াও এসভিজিতে রূপান্তর করার একটি সমস্যা হ'ল লাইনগুলি "পুরোপুরি" সোজা নয়। এর ফলে পাথগুলি কিউবিক বেজিয়ার বক্ররেখা হয়। পূর্ণসংখ্যার দ্বারা সূচকযুক্ত বুলিয়ান মানগুলির একটি তালিকা (অ্যারে) সহ, বক্ররেখাগুলি সহজেই স্থানান্তরিত হবে না এবং বক্ররেখার যে সমস্ত বিন্দু রেখাটি গণনা করতে হবে, তবে সূচকের তালিকার সাথে ঠিক মেলে না।
আমি ধরে নিই যে এইগুলির মধ্যে একটি পদ্ধতি কার্যকর হতে পারে (যদিও তা না হলেও) তারা এতো বড় চিত্রের পরে ভীষণরূপে অক্ষম, এবং আরও ভাল উপায় রয়েছে exists এটি কীভাবে সেরা (সবচেয়ে দক্ষতার সাথে এবং / অথবা সর্বনিম্ন জটিলতার সাথে) সম্পন্ন হয়? একটি ভাল উপায় আছে?
তারপরে গোলকধাঁধাটির সমাধান আসে। যদি আমি প্রথম দুটি পদ্ধতির কোনওটি ব্যবহার করি তবে আমি ম্যাট্রিক্সের সাথে মূলত শেষ করব। এই উত্তর অনুসারে , গোলকধাঁধার প্রতিনিধিত্ব করার একটি ভাল উপায় একটি গাছ ব্যবহার করছে এবং এটি সমাধানের একটি ভাল উপায় হ'ল এ * অ্যালগরিদম । চিত্র থেকে কেউ কীভাবে একটি গাছ তৈরি করবে? কোন ধারনা?
TL; DR
পার্স করার সর্বোত্তম উপায়? কোন তথ্য কাঠামোতে? কীভাবে কাঠামো সমাধান / বাধা সমাধানে সহায়তা করবে?
আপডেট করুন
আমি @ থমাসের numpy
প্রস্তাবিত হিসাবে @ মিখাইল পাইথনে যা লিখেছেন তা বাস্তবায়নে আমার হাত চেষ্টা করেছি । আমি মনে করি যে অ্যালগরিদম সঠিক, তবে এটি আশানুরূপভাবে কাজ করছে না। (নীচের কোড।) পিএনজি লাইব্রেরি হল পিপিএনজি ।
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)
অধীনে যান for.if
এবং এটি প্রতিস্থাপন করা উচিত visited.append(np)
। এটি একটি সারিতে যুক্ত হয়ে গেলে একটি ভার্টেক্স পরিদর্শন করা হয়। আসলে, এই অ্যারেটির নাম "সারিবদ্ধ" করা উচিত। একবার আপনি সমাপ্তিতে পৌঁছে গেলে আপনি বিএফএসও বন্ধ করতে পারেন।