ধরে নিই যে আপনার স্প্রিটগুলি টাইলসের সেটগুলি দখল করেছে যা আয়তক্ষেত্রযুক্ত (যদি তারা স্বেচ্ছাচারী সেটগুলি দখল করে থাকে, তবে আপনি সাধারণ ক্ষেত্রে একেবারে সঠিকভাবে আঁকতে পারবেন না), সমস্যাটি হ'ল উপাদানগুলির মধ্যে সামগ্রিক অর্ডার সম্পর্ক নেই, সুতরাং আপনি বাছাই করতে পারবেন না এগুলি এমন একটি বাছাই ব্যবহার করে যার ফলশ্রুতি O (nlogn) হয় in
নোট করুন যে কোনও দুটি এবং A এবং B এর জন্য, A কে B (A <- B) এর আগে আঁকতে হবে, B কে A (B <- A) এর আগে আঁকতে হবে বা সেগুলি কোনও ক্রমে আঁকতে পারে। তারা একটি আংশিক আদেশ গঠন। আপনি যদি 3 টি ওভারল্যাপিং অবজেক্টগুলির সাথে নিজেকে কয়েকটি উদাহরণ আঁকেন তবে আপনি খেয়াল করতে পারেন যে 1 ম এবং 3 য় বস্তুটি ওভারল্যাপ নাও হতে পারে, সুতরাং সরাসরি নির্ভরতা না থাকলেও তাদের অঙ্কন ক্রমটি তাদের মধ্যে থাকা 2 য় বস্তুর উপর নির্ভর করে - নির্ভর করে কীভাবে আপনি এটি স্থাপন, আপনি বিভিন্ন অঙ্কন আদেশ পাবেন। বটমলাইন - traditionalতিহ্যবাহী প্রকারগুলি এখানে কাজ করে না।
একটি সমাধান হ'ল তুলনাটি (দানি দ্বারা উল্লিখিত) ব্যবহার করা এবং প্রতিটি বস্তুকে একে অপরের সাথে তার নির্ভরতা নির্ধারণ এবং নির্ভরতা গ্রাফ (যা একটি ডিএজি হবে) গঠন করার জন্য তুলনা করা। তারপরে অঙ্কনের ক্রম নির্ধারণের জন্য গ্রাফের একটি টপোলজিকাল সাজান। যদি খুব বেশি অবজেক্ট না থাকে তবে এটি যথেষ্ট দ্রুত হতে পারে (এটি O(n^2)
)।
আরেকটি সমাধান হ'ল একটি (ভারসাম্য দেওয়ার জন্য - সিউডো ) কোয়াড ট্রি ব্যবহার এবং এতে সমস্ত বস্তুর আয়তক্ষেত্র সংরক্ষণ করা।
তারপরে এক্স সমস্ত বস্তুর মাধ্যমে পুনরাবৃত্তি করুন, এবং চতুর্ভুজ গাছটি ব্যবহার করে পরীক্ষা করুন এক্স অবজেক্টের ওপরের স্ট্রাইপে কোনও অবজেক্ট Y আছে যা বাম দিক থেকে শুরু হয় এবং এক্স অবজেক্টের ডানদিকের কোণে শেষ হয় - যেমন সমস্ত Y, Y < - এক্স। এর মতো, আপনাকে এখনও একটি গ্রাফ তৈরি করতে হবে এবং টপোলজিকভাবে বাছাই করতে হবে।
তবে আপনি এড়াতে পারেন। আপনি অবজেক্টগুলির একটি তালিকা Q এবং অবজেক্টের একটি টেবিল ব্যবহার করেন You আপনি এক্স-অক্ষের (এক সারি) উপর ছোট থেকে বড় মানের সমস্ত দৃশ্যমান স্লটগুলি y- অক্ষের উপর সারি সারি রেখে পুনরাবৃত্তি করুন। যদি সেই স্লটে কোনও বস্তুর নীচের কোণে থাকে তবে নির্ভরতা নির্ধারণের জন্য উপরের পদ্ধতিটি করুন। কোনও অবজেক্ট এক্স যদি অন্য কোনও অবজেক্ট Y এর উপর নির্ভর করে যা আংশিকভাবে এর উপরে থাকে (Y <- এক্স), এবং এই জাতীয় প্রতিটি Y ইতিমধ্যে Q এ থাকে, তবে এক্সকে যুক্ত করুন। যদি এমন কিছু Y থাকে যা Q তে নেই, তবে এক্স যুক্ত করুন টি এবং বোঝান যে ওয়াই <- এক্স। প্রতিবার আপনি কিউতে কোনও বস্তু যুক্ত করলে আপনি টি-তে থাকা অবজেক্টের নির্ভরতা সরিয়ে ফেলেন all সমস্ত নির্ভরতা সরিয়ে ফেলা হলে, টি থেকে কোনও বস্তু কিউতে স্থানান্তরিত হয়
আমরা ধরে নিচ্ছি যে অবজেক্ট স্প্রাইটগুলি তাদের স্লটগুলি নীচে, বাম বা ডানদিকে উঁকি দেয় না (কেবল শীর্ষে, আপনার ছবিতে গাছের মতো)। এটি বৃহত সংখ্যক অবজেক্টের জন্য কর্মক্ষমতা উন্নত করা উচিত। এই পদ্ধতির আবার হবে O(n^2)
, তবে শুধুমাত্র সবচেয়ে খারাপ ক্ষেত্রে অদ্ভুত আকারের অবজেক্ট এবং / অথবা অবজেক্টগুলির অদ্ভুত কনফিগারেশন অন্তর্ভুক্ত। বেশিরভাগ ক্ষেত্রে, এটি O(n * logn * sqrt(n))
। আপনার স্প্রাইটের উচ্চতা জেনে যাওয়া এটিকে দূর করতে পারে sqrt(n)
, কারণ আপনাকে উপরের পুরো স্ট্রাইপটি পরীক্ষা করতে হবে না। স্ক্রিনে অবজেক্টের সংখ্যার উপর নির্ভর করে আপনি কোয়াড ট্রি প্রতিস্থাপনের জন্য অ্যারে দিয়ে চেষ্টা করতে পারেন যে কোন স্লট নেওয়া হয়েছে (অনেকগুলি বস্তু থাকলে তা বোঝা যায়)।
শেষ পর্যন্ত, কিছু ধারণার জন্য এই উত্স কোডটি নির্দ্বিধায় নির্দ্বিধায় অনুভব করুন: https://github.com/axel22/sages/blob/master/src/gui/scala/name/brijest/sages/gui/Canvas.scala