কোয়াড গাছগুলিতে আকারগুলি (আয়তক্ষেত্রগুলি) কীভাবে কাজ করে?


10

আমাকে বলা হয়েছে যে একটি কোয়াড ট্রি আমার গেমের জন্য আদর্শ ডেটা কাঠামো, তবে কোয়াড ট্রিগুলির মধ্যে আকৃতিগুলি ঠিক কীভাবে কাজ করে তা বুঝতে আমার সমস্যা হচ্ছে।

আমি এটি জাভাস্ক্রিপ্টে করছি, তবে আমি মনে করি যে এই প্রশ্নগুলি কোনও ভাষায় কোয়াড ট্রিগুলিতে প্রয়োগ হতে পারে।

আমি মনে করি আমি প্রায়শই বুঝতে পারি যে কোয়াড ট্রিগুলিতে বেসিক (এক্স, ওয়াই) পয়েন্ট এবং পয়েন্ট সন্নিবেশ কীভাবে কাজ করে এবং আমি এটি কাগজে করতে পারি।

এখানে আমার পয়েন্টগুলির সাথে পরীক্ষার একটি জেএসফিডাল

কোয়াড ট্রি পয়েন্ট

এক কেস বাদে, পয়েন্ট সহ আমার পরীক্ষাগুলি প্রত্যাশার মতো কাজ করছে।

তবে আমার বিভ্রান্তি শুরু হয় যখন আয়তক্ষেত্রের মতো আকারগুলি জড়িত থাকে। আপনি যখন আকারের সাথে চতুষ্পদ গাছ থেকে পুনরুদ্ধার করছেন, এটি কি আকারের প্রতিটি বিন্দুটি পরীক্ষা করে এবং সেগুলি কোন নোডে পড়ে? এবং আকারের সন্নিবেশগুলি কীভাবে কাজ করবে, যখন এটি প্রতিটি আকারের জন্য (x, y, প্রস্থ, উচ্চতা) পরামিতিগুলি গ্রহণ করে? এটি অন্য কোণার পয়েন্টগুলি গণনা করতে প্রারম্ভিক বিন্দু থেকে প্রস্থ / উচ্চতা ব্যবহার করে, যা উপযুক্ত নোডগুলিতে বিতরণ করা হয়? যদি একটি shapeোকানো আকৃতি চারটি নোডে বিভক্ত হয়, তবে কি সেই আকারের ডেটাটি চারটি নোডে সংরক্ষিত হয়?

এবং যখন একটি পুনরুদ্ধার পদ্ধতি প্যারামিটার হিসাবে একটি আকার গ্রহণ করে (x, y, প্রস্থ, উচ্চতা), আসলে কী চলছে? এটি seeingোকানো হলে আকারটি কোন নোডে বিস্তৃত হবে তা প্রথমে দেখছে এবং তারপরে n নোডের সমস্ত বস্তু পুনরুদ্ধার করবে?

আমার একটি জেএসফিডাল আকার নিয়ে কাজ করছে তবে আমি আমার পরীক্ষার ফলাফলগুলি সম্পর্কে সম্পূর্ণ বিভ্রান্ত। আমি সদৃশ বস্তু ফেরত আসছে!

কোয়াড ট্রি আকার

উদাহরণস্বরূপ, লাল বর্গক্ষেত্রটি আমি আমার পুনরুদ্ধার পদ্ধতিতে প্রবেশ করানো পরামিতিগুলির একটি অঙ্কিত সমতুল্য। আমি ভাবব যেহেতু এই লাল বর্গক্ষেত্রটি চারটি নোড বিস্তৃত, সুতরাং এটি কোয়াড গাছের প্রতিটি বস্তুটি ফিরিয়ে দেবে! তবে এটি হয় না এবং এটি কী ফিরে আসে তা যুক্তিযুক্ত করতে আমার সমস্যা হচ্ছে। আমার কাছে আরও বেশ কয়েকটি পরীক্ষা রয়েছে যা বর্তমানে মন্তব্য করা হয়েছে, তবে আপনি আরও মন্তব্য-বিহীন করতে পারেন এবং আরও বিভ্রান্তিকর ফলাফলগুলি দেখতে এটি চালাতে পারেন!

যেমনটি বলুন, আমি যদি একটি কোয়াড গাছের সমস্ত পয়েন্ট ফিরিয়ে দিতে চাই, তবে কীভাবে করব? কোনও আকারটি সীমানার পুরো আকার ব্যবহার করে একটি পুনরুদ্ধার পদ্ধতি? উদাহরণস্বরূপ, পুনরুদ্ধার (0, 0, ক্যানভাস.উইথ, ক্যানভাস.হাইট)?

আমি যে জাভাস্ক্রিপ্ট কোয়াডট্রি লাইব্রেরিটি ব্যবহার করছি তা অন্যান্য বিভিন্ন উত্স দ্বারা উল্লেখ করা হয়েছে, তাই আমি ধরে নিই যে প্রকৃত বাস্তবায়নটি সঠিক এবং নামকরা।

আমি মনে করি আমার প্রচুর বিভ্রান্তি কোয়াড ট্রি পরিভাষার ভুল বোঝাবুঝির কারণ হতে পারে। পছন্দ করুন, কেন যখন তারা একটি "পয়েন্ট" এর প্রস্থ / উচ্চতা পরামিতি থাকে তবে মাত্রাগুলির পরিবর্তে সীমানা কেন বলেন? এটি কি কনভেনশন / সংক্ষিপ্ত হাতের বিষয়, বা এগুলি সম্পূর্ণ ভিন্ন ধারণা?

আপনার সময় জন্য ধন্যবাদ!


এগুলি তাদের অবস্থান অনুসারে স্বাভাবিক হিসাবে কোয়াড গাছে সংরক্ষণ করা হয়। সাধারণত সেগুলি কেন্দ্রে থাকে তবে আপনি নির্ধারিত হিসাবে কোণে থাকতে পারেন। আপনার প্রশ্নটি এর নকল হতে পারে: কোয়াডট্রি: কেবল পয়েন্ট, বা অঞ্চলগুলি সঞ্চয় করুন?
মাইকেলহাউস

আমি এই প্রশ্নটি পড়েছি, তবে আমি এখনও উত্তরগুলি পুরোপুরি বুঝতে পারি না :( "আপনাকে অবশ্যই এটি একেবারে ক্ষুদ্রতম নোডে সংরক্ষণ করতে হবে যা এটি সম্পূর্ণরূপে ধারণ করে - এমনকি যদি এটি ক্ষমতা সীমা ছাড়িয়ে যায় (একটি পরিবর্তনযোগ্য ধারক ব্যবহার করুন)" - যখন তিনি সর্বনিম্ন নোডটি বলে যে এটি সম্পূর্ণরূপে এতে অন্তর্ভুক্ত রয়েছে, যদি বস্তুটি খুব বড় হয় তবে সেই নোডটি কি প্রায়শই একটি পাতাহীন নোড হয় না? যেমন একটি উচ্চতর নোড যা কেবলমাত্র অন্যান্য নোড নিয়ে গঠিত? এটি সঠিক বলে মনে হয় না আমি, যেহেতু এর অর্থ
হ'ল সংযুক্ত

1
@ user2736286 আপনি যদি চতুষ্পদ লিবের কোডটি দেখেন (এটি খুব দীর্ঘ নয়) তবে আপনি দেখতে পাচ্ছেন যে এটি নোডের সীমানাকে স্ট্র্যাডলিং থেকে রক্ষা করতে উচ্চ স্তরের নোডগুলিতে আয়তক্ষেত্র সংরক্ষণ করে। কোডটিতে ক্ষেত্রের উল্লেখ দেখুন _stuckChildren। আপনি এটি "সীমানা সহ আইটেমগুলি পুনরুদ্ধার" নমুনাতেও দেখতে পারেন - এটি সর্বদা মূল নোড পর্যন্ত সমস্ত রাস্তাগুলিকে হাইলাইট করে যেগুলি আপনি ক্লিক করেছেন এমন নোডগুলির সীমানাগুলিকে বিস্তৃত করে।
নাথন রিড 21

@ user2736286 এছাড়াও, চতুষ্পদ লিবের সীমানা সহ আইটেমগুলি পুনরুদ্ধারে একটি বাগ রয়েছে বলে মনে হয় - আপনি যদি কোনও কোয়েরি রেক্ট দেন যা কিছু নোডের সীমানাকে বিস্তৃত করে দেয় তবে এটি কোয়েডের সমস্ত স্পর্শগুলি নোডে ফিরিয়ে দেয় না। নোড সীমানার কাছাকাছি ক্লিক করে আপনি এটি "সীমানা সহ আইটেমগুলি পুনরুদ্ধার করতে" এ সহজেই দেখতে পাবেন।
নাথান রিড

@ নাথানরিদ এর আগে আমি কোডটি বোঝার চেষ্টা করেছি, তবে ধারণাগত ভিত্তি ছাড়াই এটিকে বুঝতে আমি যথেষ্ট দক্ষ নই। জন ম্যাকডোনাল্ডের সিউডো কোডের জন্য আমি এখন বুঝতে পারি যে কীভাবে আয়তক্ষেত্রগুলি নোডগুলিতে intoোকানো হয় তবে আমি মনে করি যে পুনরুদ্ধার কীভাবে কাজ করে সে সম্পর্কে এখনও আমি অস্পষ্ট। যেমন "সীমানা সহ আইটেমগুলি পুনরুদ্ধার" - উদাহরণটি দেখে আমি বিভ্রান্ত। যেমন, আমি যখন কোনও রেক্ট ক্লিক করি যা সবচেয়ে ছোট নোডের মধ্যে পরিষ্কারভাবে ফিট করে, তখন কেন এই নোডের বাইরে এই সমস্ত আবৃত্তিগুলি হাইলাইট করা হয়?
ব্যবহারকারী2736286

উত্তর:


10

চতুর্ভুজগুলি সাধারণত আয়তক্ষেত্রগুলি সংরক্ষণ করে এবং পুনরুদ্ধার করে। বিন্দু একটি নির্দিষ্ট ক্ষেত্রে যেখানে প্রস্থ এবং উচ্চতা শূন্য। নীচের যুক্তিটি মূল নোড দিয়ে শুরু করে গাছের নতুন আয়তক্ষেত্রের জন্য হোম সন্ধান করতে ব্যবহৃত হয়:

void Store(Rectangle rect)
{
    if(I have children nodes)
    {
        bool storedInChild = false;
        foreach(Node childNode in nodes)
        {
            if(this rectangle fits entirely inside the childNode bounds)
            {
                childNode.Store(rect);   // Go deeper into the tree
                storedInChild = true;
                break;
            }
        }
        if(not storedInChild)
        {
            Add this rectangle to the current node
        }
    }
    else
    {
        Add this rectangle to the current node
    }
}

নোট করুন যে আয়তক্ষেত্রগুলি যে কোনও গভীরতায় সংরক্ষণ করা যেতে পারে, এটি কোনও পাতার কোয়াড হতে হবে না। যদি আয়তক্ষেত্রটি মূল স্তরে সীমানাটি ডানদিকে বিস্তৃত হয়, তবে মূল কোয়াডটি আয়তক্ষেত্রটি সংরক্ষণ করবে।

উদাহরণস্বরূপ, লাল বর্গক্ষেত্রটি আমি আমার পুনরুদ্ধার পদ্ধতিতে প্রবেশ করানো পরামিতিগুলির একটি অঙ্কিত সমতুল্য। আমি ভাবব যেহেতু এই লাল বর্গক্ষেত্রটি চারটি নোড বিস্তৃত, সুতরাং এটি কোয়াড গাছের প্রতিটি বস্তুটি ফিরিয়ে দেবে! তবে এটি হয় না এবং এটি কী ফিরে আসে তা যুক্তিযুক্ত করতে আমার সমস্যা হচ্ছে।

চতুর্ভুজ জিজ্ঞাসা করার সময়, এটি কেবল ক্যোয়ারির অন্তর্ভুক্ত আয়তক্ষেত্রগুলি ফেরত দেবে return আপনার উদাহরণস্বরূপ, আপনি 4 টি শিশু কোয়াডের প্রত্যেককে আরও বিশদে দেখতে বাধ্য করেছেন কারণ লাল কোয়েরি আয়তক্ষেত্রটি প্রতিটি সন্তানের কোয়াডকে ছেদ করে। যেহেতু বাচ্চাদের আর কোনও বাচ্চা নেই, এই শিশু কোয়াডগুলির প্রতিটি আয়তক্ষেত্রের সাথে লাল আয়তক্ষেত্রের সাথে তুলনা করা হবে। যেহেতু গাছের কোনও আয়তক্ষেত্র লাল কোয়েরি আয়তক্ষেত্রের সাথে সংঘর্ষে আসে না, তাই আর কিছুই ফেরত দেওয়া উচিত নয়।

ক্যোয়ারি এরিয়া (গুলি) এর সাথে তুলনা করে আপনার কাছে প্রচুর পরিমাণে অবজেক্ট এবং বস্তুর অস্তিত্ব থাকার জন্য সত্যই আপনি চতুর্ভুজগুলির সুবিধা দেখতে শুরু করেন start এই ক্ষেত্রে, একটি ছোট ক্যোয়ারী অঞ্চল দ্রুত কোয়াড গাছের বিস্তৃত অংশকে বিবেচনা থেকে বাদ দিতে পারে। ক্যোয়ারের আয়তক্ষেত্রের সাথে ছেদ করা কেবলমাত্র কোয়াডগুলিকে আরও বিশদে দেখানো হবে।

সম্পাদনা

পুনরুদ্ধার সাধারণত নিম্নলিখিতগুলির মতো করা হয়:

List<Rectangle> Query(Rectangle queryRect)
{
    List<Rectangle> results;
    foreach(Node childNode in children)
    {
        if(queryRect intersects with childNode bounds)
        {
            results += childNode.Query(queryRect);   // Dig deeper into the tree
        }
    }

    foreach(Rectangle I have stored in this quad)
    {
        if(queryRect intersects with rect)  // Your library doesn't do this
        {
            results += rect;
        }
    }

    return results;
}

তবে আপনার লাইব্রেরিতে, এটি যে আয়তক্ষেত্রগুলি ফিরে আসছে এটি কোয়েরির সাথে ছেদ করে কিনা তা যাচাই করে দেখা যাচ্ছে না, সুতরাং আপনাকে এটি নিজেরাই যুক্ত করতে হবে।


আপনার গ্রন্থাগারটি আরও বিশদে দেখার পরে, আপনার গ্রন্থাগারটি আপনার নির্দিষ্ট করা ক্যোয়ারের আয়তক্ষেত্রের জন্য সমস্ত সম্ভাব্য সংঘর্ষ প্রার্থীদের একটি তালিকা ফিরিয়ে দিচ্ছে। প্রকৃত সংঘর্ষ রয়েছে কিনা তা দেখার জন্য প্রতিটি পরীক্ষার্থীর সাথে আপনার প্রশ্নের আয়তক্ষেত্রটির তুলনা করা আপনার কাজ appears বেশিরভাগ গ্রন্থাগারগুলি আপনার জন্য শেষ পদক্ষেপটি করে এবং কেবলমাত্র ক্যোয়ারির ক্ষেত্রের সাথে প্রকৃত সংঘর্ষগুলি ফিরিয়ে দেয়। সুতরাং, retrieveতালিকাটি ছাঁটাই করতে আপনার পদ্ধতিতে কিছু যুক্তি যুক্ত করতে হবে । আপনি এটি আরও কিছুটা স্পষ্টভাবে এখানে কীভাবে দেখছেন তা দেখতে পাবেন: mikechambers.com/html5/javascript/QuadTree/example/…
জন ম্যাকডোনাল্ড

1
@ user2736286 আপনি যদি এটি না তুলেন, জন ম্যাকডোনাল্ড লিখেছেন ক্যোয়ারী এবং স্টোর ফাংশনগুলিতে পুনরাবৃত্তির বিষয়টি নোট করা গুরুত্বপূর্ণ। আপনি যদি সেই অংশটি না পান তবে এটি বেশি অর্থবহ হবে না। উভয়ের জন্য, প্রতিটি পুনরাবৃত্তি গাছের গভীরে যায়, অর্থাত্ শাখায় এবং শেষ পর্যন্ত পাতায়।
ট্যাসএজেন্ট

ধন্যবাদ জন, আপনার সিউডো কোডটি খুব সহায়ক। যখন আপনি বলবেন "যদি (childNode সীমার সঙ্গে queryRect ছেদ করে)", মূলত যদি queryRect হয় মানে অন্তর্ভুক্ত সীমার মধ্যে - আংশিকভাবে বা সম্পূর্ণভাবে? শুধু 100% পরিষ্কার হতে চান। এছাড়াও, "সীমানা অনুসারে আইটেমটি পুনরুদ্ধার করুন" উদাহরণে আলোচিত হচ্ছে, আমার ক্লিকের ফলাফলের একটি চিত্র আমার কাছে রয়েছে। নীল বিন্দুটি পিক করুন যেখানে আমি ক্লিক করেছি। তাহলে কেন কেবল সেই নোডের ভিতরে দুটি আয়তক্ষেত্র নয়? আয়তক্ষেত্রগুলি কেন এটি থেকে অনেক দূরে হাইলাইট করা হয়? আমি মনে করি এটিই আমাকে সত্যই বিভ্রান্ত করছে।
ব্যবহারকারী2736286

অংশ বা পূর্ণ। যদি দুটি স্পর্শ হয়, বা হয় অন্যটির দ্বারা সম্পূর্ণরূপে অন্তর্ভুক্ত থাকে। আপনি চতুষ্কোণে উইকিটি পড়তে চান , তবে আমি আপনার ছবিটি নিয়েছি এবং বিভিন্ন সন্তানের সীমানা উপস্থাপনের জন্য রঙ এটিকে কোড করেছে। সমস্ত নীল আয়তক্ষেত্রটি প্রথম শিশু কোয়াডের সীমানার সাথে ছেদ করছে, তার পরে ম্যাজেন্টা এক স্তর আরও গভীর এবং সবুজ এক স্তর আরও গভীর। লাল আয়তক্ষেত্রগুলি ক্লিক করা কোয়াডের সাথে ছেদ করে। আপনার গ্রন্থাগারটি চূড়ান্ত শিশু কোয়াড (লাল) এর অন্তর্ভুক্ত সমস্ত ছেলের সীমানায় সমস্ত রিসেট প্রদান করে
জন ম্যাকডোনাল্ড

ঠিক আছে, তাই আমি লিবের উত্স কোডটি দেখতে চেষ্টা করেছি এবং শেষ পর্যন্ত আমি আটকে থাকা শিশুদের আচরণটি বুঝতে পারি এবং আমার ছবিতে এই সমস্ত অতিরিক্ত রেকর্ডটি কেবল আটকে থাকা শিশুদেরই। মূলত আমি ভেবেছিলাম যে একাধিক নোড বিস্তৃত যে কোনও পুনরুদ্ধারগুলিতে তার ডেটাটিকে নকল করে প্রতিটি ছোট নোডে সন্নিবেশ করানো হবে। এখন আমি বুঝতে পেরেছি যে স্টিলকিল্ডেনগুলি এর প্রসারিত নোডগুলিতে .োকানো হয় না, তবে এটি কেবল একটি নোডে থাকে, যার কারণে আমাকে সমস্ত অভিভাবক নোডগুলিও পরীক্ষা করতে হয়, এবং আমার কোয়েরি রেক্টটি সম্বলিত ক্ষুদ্রতম নোডটিও নয়। ছবি তোলার জন্য ধন্যবাদ; এটি এখন অনেক বেশি অর্থবহ করে তোলে :)
user2736286
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.