আমি বর্তমানে একটি ব্রেকআউট ক্লোন তৈরি করছি এবং একটি বল (বৃত্ত) এবং একটি ইট (উত্তল বহুভুজ) সঠিকভাবে কাজ করার মধ্যে সংঘর্ষ সনাক্তকরণে আমি একটি রোডব্লক করেছি। আমি একটি বৃত্ত-লাইন সংঘর্ষ শনাক্তকরণ পরীক্ষা ব্যবহার করছি যেখানে প্রতিটি লাইন উত্তল বহুভুজ ইটের উপরের প্রতিনিধিত্ব করে এবং প্রান্তকে দেখায়।
বেশিরভাগ সময় সার্কেল-লাইন পরীক্ষা সঠিকভাবে কাজ করে এবং সংঘর্ষের পয়েন্টগুলি সঠিকভাবে সমাধান করা হয়।
সংঘর্ষ সনাক্তকরণ সঠিকভাবে কাজ করছে।
তবে, মাঝে মাঝে আমার সংঘর্ষ শনাক্তকরণের কোডটি নেতিবাচক বৈষম্যমূলক কারণে মিথ্যা ফিরিয়ে দেয় যখন বলটি আসলে ইটের ছেদ করে।
আমি এই পদ্ধতির অদক্ষতা সম্পর্কে সচেতন এবং পরীক্ষিত ইটের সংখ্যা হ্রাস করতে আমি অক্ষ বিন্যস্ত বাউন্ডিং বাক্স ব্যবহার করছি। আমার মূল উদ্বেগটি হ'ল নীচে আমার কোডটিতে কোনও গাণিতিক বাগ রয়েছে কিনা।
/*
* 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;
}
sqrt_disc = sqrt(disc);
below নীচে আপনার উত্তরের জন্য ধন্যবাদ এটি আমাকে অনেক সাহায্য করেছে।