চেনাশোনা লাইন সংঘটন সনাক্তকরণ সমস্যা


11

আমি বর্তমানে একটি ব্রেকআউট ক্লোন তৈরি করছি এবং একটি বল (বৃত্ত) এবং একটি ইট (উত্তল বহুভুজ) সঠিকভাবে কাজ করার মধ্যে সংঘর্ষ সনাক্তকরণে আমি একটি রোডব্লক করেছি। আমি একটি বৃত্ত-লাইন সংঘর্ষ শনাক্তকরণ পরীক্ষা ব্যবহার করছি যেখানে প্রতিটি লাইন উত্তল বহুভুজ ইটের উপরের প্রতিনিধিত্ব করে এবং প্রান্তকে দেখায়।

বেশিরভাগ সময় সার্কেল-লাইন পরীক্ষা সঠিকভাবে কাজ করে এবং সংঘর্ষের পয়েন্টগুলি সঠিকভাবে সমাধান করা হয়।

সংঘর্ষ সনাক্তকরণ সঠিকভাবে কাজ করছে।

তবে, মাঝে মাঝে আমার সংঘর্ষ শনাক্তকরণের কোডটি নেতিবাচক বৈষম্যমূলক কারণে মিথ্যা ফিরিয়ে দেয় যখন বলটি আসলে ইটের ছেদ করে।

সংঘর্ষ সনাক্তকরণ ব্যর্থ।

আমি এই পদ্ধতির অদক্ষতা সম্পর্কে সচেতন এবং পরীক্ষিত ইটের সংখ্যা হ্রাস করতে আমি অক্ষ বিন্যস্ত বাউন্ডিং বাক্স ব্যবহার করছি। আমার মূল উদ্বেগটি হ'ল নীচে আমার কোডটিতে কোনও গাণিতিক বাগ রয়েছে কিনা।

/* 
 * from and to are points at the start and end of the convex polygons edge.
 * This function is called for every edge in the convex polygon until a
 * collision is detected. 
 */

bool circleLineCollision(Vec2f from, Vec2f to)
{
    Vec2f lFrom, lTo, lLine;
    Vec2f line, normal;
    Vec2f intersectPt1, intersectPt2;
    float a, b, c, disc, sqrt_disc, u, v, nn, vn;
    bool one = false, two = false;

    // set line vectors
    lFrom = from - ball.circle.centre;      // localised
    lTo = to - ball.circle.centre;          // localised
    lLine = lFrom - lTo;                    // localised
    line = from - to;

    // calculate a, b & c values
    a = lLine.dot(lLine);
    b = 2 * (lLine.dot(lFrom));
    c = (lFrom.dot(lFrom)) - (ball.circle.radius * ball.circle.radius);

    // discriminant
    disc = (b * b) - (4 * a * c);

    if (disc < 0.0f)
    {
        // no intersections
        return false;
    }
    else if (disc == 0.0f)
    {
        // one intersection
        u = -b / (2 * a);

        intersectPt1 = from + (lLine.scale(u));
        one = pointOnLine(intersectPt1, from, to);

        if (!one)
            return false;
        return true;
    }
    else
    {
        // two intersections
        sqrt_disc = sqrt(disc);
        u = (-b + sqrt_disc) / (2 * a);
        v = (-b - sqrt_disc) / (2 * a);
        intersectPt1 = from + (lLine.scale(u));
        intersectPt2 = from + (lLine.scale(v));

        one = pointOnLine(intersectPt1, from, to);
        two = pointOnLine(intersectPt2, from, to);

        if (!one && !two)
            return false;
        return true;
    }
}

bool pointOnLine(Vec2f p, Vec2f from, Vec2f to)
{
    if (p.x >= min(from.x, to.x) && p.x <= max(from.x, to.x) && 
        p.y >= min(from.y, to.y) && p.y <= max(from.y, to.y))
        return true;
    return false;
}

আমি লাইন এবং লাইনের মধ্যে কোনও পার্থক্য খুঁজে পাচ্ছি না ...
FxIII

আসল পয়েন্ট গণনার আগে পয়েন্টঅনলাইন পরীক্ষা সরল করা যায় এবং করা যায়।
FxIII

sqrt_disc গণনা করা হয় কিভাবে?
FxIII

দুঃখিত FxIII আমি যখন আমার ভেক্টরগুলিকে স্থানীয়করণ করছিলাম তখন আমি অবশ্যই কিছুটা বিভ্রান্ত হয়ে পড়েছিলাম যখন বুঝতে পারিনি যে ভেক্টররা একে অপরের কাছ থেকে বিয়োগ করার সময় সমান হবে। আমি পোস্ট করার আগে আমি আমার কোডটি কিছুটা সাফ করছিলাম এবং আমি আবার জমা দিতে ভুলে গিয়েছিলাম sqrt_disc = sqrt(disc);below নীচে আপনার উত্তরের জন্য ধন্যবাদ এটি আমাকে অনেক সাহায্য করেছে।
জাজডগ

উত্তর:


20

A থেকে B পর্যন্ত চলমান বিভাগটি হিসাবে গণনা করা যেতে পারে

পি (টি) = একটি + + ডি · টি যেখানে ডি হল বি - একজন এবং 0 থেকে 1 থেকে টি রান

এখন বৃত্ত মূল কেন্দ্রেও হয় (সরাতে একজন এবং বি উত্স কেন্দ্র লাগাতে প্রয়োজন হলে) এবং ব্যাসার্ধ রয়েছে

যদি কিছু টন জন্য আপনাকে যে পেতে আপনি একটি ছেদ আছে পি একই দৈর্ঘ্য বা এবং, equivalently, যে দৈর্ঘ্য পি ছক সমতূল্য

কোনও ভেক্টরের দৈর্ঘ্য স্কোয়ারটি একটি ভেক্টরের বিন্দু পণ্যটি নিজেই তৈরি করে নেওয়া হয় (এটি এতোটাই সত্য যে যদি কোনও বিন্দু পণ্যটির জন্য উপযুক্ত অপারেশন খুঁজে পায় তবে তিনি দৈর্ঘ্যের একটি নতুন এবং ধারাবাহিক ধারণাটি সংজ্ঞায়িত করতে পারেন)

পি · পি = ( + ডি · টি) · ( + ডি · টি) =

A · A + 2 A · D t + D · D t² ²

আমরা কোন টির জন্য P · P = r² পাই তা আমরা অনুসন্ধান করতে চাই তাই আমরা কখন নিজেকে জিজ্ঞাসা করব

A · A + 2 A · D t + D · D t² = r² ²

বা কখন

D · D t² + 2 A · D t + A · A -r² = 0

এটি খুব বিখ্যাত চতুষ্কোণ সমীকরণ

at² + বিটি + সি = 0

সঙ্গে

a = D · D ; b = 2 A · D এবং c = A · A -r² ²

নির্ধারক b² - 4ac ইতিবাচক কিনা তা আমাদের পরীক্ষা করতে হবে এবং তাই আমরা 2 টি মানের মান খুঁজে পাই যা আমাদের ছেদগুলি পয়েন্টগুলি পি (টি) দেয়।

টি অবশ্যই 0 এবং 1 এর মধ্যে হওয়া উচিত অন্যথায় আমরা সমাধানগুলি পেয়েছি যা A এবং B এর মধ্য দিয়ে চলেছে তবে এটি A বা B এর পরে রয়েছে

[Edit]

যেহেতু অন্যান্য প্রশ্নগুলি এই উত্তরটিতে কিছুটা সহায়তা পেতে পারে, তাই আমি কিছু চিত্র ব্যবহার করে এই সম্পাদনাতে যুক্তিটি সহজ করার চেষ্টা করার সিদ্ধান্ত নিয়েছি। শুরুর শর্ত এটি শুরুর শর্ত। এখন A_B বিভাগটি ফোকাস করুন

এ থেকে বি পর্যন্ত বিভাগ চলছে

D হ'ল ভেক্টর যা A কে B তে সরায় তাই যদি টি 0 এবং 1 এর মধ্যে হয় তবে ডি · t একটি D এর "সঠিক ভগ্নাংশ" তাই বিন্দু A + D · টি A_B বিভাগে থাকে: টি হয় যখন বাদামী বিন্দু আসে 0 এবং 1 এর মধ্যে এবং গা green় সবুজ যখন t> 1 হয়।

এখন আমরা জিনিসগুলিকে সরল করতে পারি যদি আমরা বৃত্তের কেন্দ্রটিকে উত্সে স্থানান্তরিত করি। এটি সর্বদা করা যেতে পারে কারণ হ'ল স্থানাঙ্ক ব্যবস্থার একটি সহজ পরিবর্তন যা জ্যামিতি, কোণ, ছেদগুলি, ব্যবস্থাগুলি ইত্যাদি সংরক্ষণ করে is

কেন্দ্রে সরানো বৃত্ত

এখন আমরা একটি কেবল এর দৈর্ঘ্য গনা উপায় আছে পি পরিবর্তিত হয় যখন T এবং বলে, যার জন্য টি পি বৃত্তের গণ্ডি অতিক্রম করে।

উদাহরণ

যেমন আপনি দেখতে পাচ্ছেন পি'র দৈর্ঘ্য আর এর চেয়ে বড় আর পি " আর এর চেয়ে কম। ভেক্টর দৈর্ঘ্য এবং আর উভয়ই ধনাত্মক সংখ্যার ফলে সংরক্ষণের চেয়ে বড় বা কম হওয়ার ক্রমের সম্পর্কটি কি আমরা দৈর্ঘ্যের মধ্যে সম্পর্ককে গণনা করি? স্কোয়ারড এবং ব্যাসার্ধ ছক। পি * 1 এবং পি * 2 হয় বিন্দু করে নির্মিত হয় | পি | ² এর R² করার সমান

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

Discriminant পূর্ববর্তী শর্ত বৈষম্য করতে ব্যবহৃত হয় এবং একটি কার্যকারিতা পরীক্ষা টন সম্পন্ন হবে যদি এটি একটি বৈধ ছেদ কিন্তু আমাদের সেগমেন্ট বাহিরে দেখতে - অর্থাৎ সমাধান টন বাস্তব হতে হয়েছে এবং 0 এবং 1 এর মধ্যে একটি সঠিক ছেদ যে পতনের বিবেচনা করা বিভাগে A_B


3
এটি ব্যবহার করার জন্য সঠিক আলগোরিদিম। এটি কীভাবে কাজ করে তার একটি দুর্দান্ত বিবরণ রিয়েল টাইম রেন্ডারিং তৃতীয় সংস্করণ , 787 থেকে 791 পৃষ্ঠাগুলিতে পাওয়া যায় you
ডারসি রায়নার

4
এই উত্তরের অষ্টম পদক্ষেপের সাথে আমি 2k খ্যাতি পয়েন্টে পৌঁছেছি। আপনি আমার উপর যে আস্থা রেখেছেন তার আমি প্রশংসা করি। এটি উভয়ই আমার প্রচেষ্টার একটি স্বীকৃতি এবং সর্বোচ্চ সম্ভাব্য মানের উত্তর উত্পাদন করতে আমার সর্বোচ্চ চেষ্টা চালিয়ে যাওয়ার উদ্দীপনা stim আপনাকে ধন্যবাদ
FxIII

অপেক্ষা করুন, এই অ্যাকাউন্টটি দুটি কর্নারের কেসগুলির জন্য সঠিকভাবে আছে? উদাহরণস্বরূপ, একটি চেনাশোনা t0 <= t <= t1 এর বাইরে লাইন দ্বারা সংজ্ঞায়িত সমতলটি অতিক্রম করতে পারে তবে কিছুক্ষণ পরে লাইন বিভাগের শেষ পয়েন্টগুলিতে আঘাত করতে পারে। আপনাকে লাইন শেষের পয়েন্টগুলি এবং বৃত্তের পথের মধ্যে সর্বনিম্ন দূরত্বটি পরীক্ষা করতে হবে। যদি সেই দূরত্বটি বৃত্ত ব্যাসার্ধের চেয়ে কম হয় তবে লাইনটি আঘাত হানে।
ডারসি রেনার

উভয় পয়েন্ট যখন বৃত্তের অঞ্চলে থাকে তখন @ ড্যারসিআরনারে আপনার কেসটি বোঝায়?
FxIII
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.