একটি সাধারণ 2D আয়তক্ষেত্রের সংঘর্ষের অ্যালগোরিদম যা আয়তক্ষেত্রগুলির সংঘর্ষের কোন দিকটিও নির্ধারণ করে?


16

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

আমি অতীতে যা করেছি তা হ'ল প্রতিটি সমান্তরাল আয়তক্ষেত্রাকার পক্ষের মধ্যকার দূরত্ব নির্ধারণ করে এবং দূরত্বটি 0 এর কাছাকাছি রয়েছে কিনা তা পরীক্ষা করুন (কিছু প্রাথমিকভাবে সংজ্ঞায়িত দূরত্বের সীমা ব্যবহার করুন) বা 0 হয়। তবে, ভাসমান-পয়েন্ট পাটিগণিতের জন্য, এটি অস্থির প্রমাণিত হয়েছে কারণ অজানা সময় কেটে যাওয়া। কিছু সময়, আয়তক্ষেত্রগুলি সংজ্ঞায়িত পরিসরের সাথে মিলিত হওয়ার আগে একে অপরকে ছেদ করে।

অন্যদিকে, আমি একাধিক আয়তক্ষেত্র তৈরি করার কথা ভাবছিলাম, প্রতিটি পক্ষের জন্য প্রতিটি আয়তক্ষেত্র। যাইহোক, আবার চিন্তা করার পরে, এটি দূরত্বের পরিসীমা পরীক্ষার সমান্তরাল দিক হিসাবে একই জিনিস হবে, কেবল যে দূরত্বের পরিধিটি প্রতিটি মিনি-আয়তক্ষেত্রের প্রস্থ is

সুতরাং, এই সমস্যার কোনও পরামর্শ?


আপনি কি স্বতন্ত্র বা ক্রমাগত অবস্থান আপডেট ব্যবহার করছেন? (আপনি কি প্রতিটি ফ্রেমে একবার ত্বরণ দ্বারা আপনার গতিবেগ আপডেট করছেন এবং তারপরে অবস্থানটি গণনা করছেন, বা অবস্থানটি
বহির্মুখী

উত্তর:


24

আমার উত্তর থেকে "কোন দিকটি আঘাত হানে?" :

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

float w = 0.5 * (A.width() + B.width());
float h = 0.5 * (A.height() + B.height());
float dx = A.centerX() - B.centerX();
float dy = A.centerY() - B.centerY();

if (abs(dx) <= w && abs(dy) <= h)
{
    /* collision! */
    float wy = w * dy;
    float hx = h * dx;

    if (wy > hx)
        if (wy > -hx)
            /* collision at the top */
        else
            /* on the left */
    else
        if (wy > -hx)
            /* on the right */
        else
            /* at the bottom */
}

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

দুর্দান্ত সমাধান, আমার প্রয়োজনের জন্য খুব ভাল কাজ করেছে।
অপিটিফুচস

1
ডিএক্স 0 বা ডাই 0 বা উভয় হয়ে যাওয়ার সাথে কি কিছু ভুল আছে? আমাকে এটির কারণ জানাতে দাও ... যদি dx = 0 && dy == 0, এর অর্থ উভয় আয়তক্ষেত্র একই উত্সে থাকে, তবে অ্যালগরিদমটি ডিফল্টরূপে নীচে ফিরে আসে? যদি তাদের উভয়ই 0 হয় তবে সঠিক ফলাফলটি প্রত্যাশিত। সুতরাং, আমি মনে করি, এই অ্যালগরিদমটি যেখানে dx == 0 && dy == 0 ক্ষেত্রে বাদে সঠিক, যা অনির্দিষ্ট হতে হবে এবং নীচে নয়। সুতরাং, সাবধান এবং ধন্যবাদ
প্রসন্ত

1
এখন, আমি ভাবছিলাম যে কী ঘটে যখন dx == dy, w == h ... তারপরেও কোডটি সিদ্ধান্ত নিয়েছে যে ফলাফলটি যখন অনির্দিষ্ট হয় তখন ফলটি একদিকে থাকে ... কল্পনা করুন যে দুটি বর্গক্ষেত্রকে ছেদ করে এমন একটি বর্গাকার কেন্দ্র রয়েছে অন্য বর্গাকার একটি কোণ এবং অন্য বর্গাকার কেন্দ্রটি প্রথম বর্গাকার কোণে। এখানে, পাশটি অনির্দিষ্ট হতে হবে - এটি ডান বা নীচে নয়। এটা উভয় ?!
প্রসংথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.