मैं वर्तमान में एक ब्रेकआउट क्लोन विकसित कर रहा हूं और मैंने एक गेंद (सर्कल) और एक ईंट (उत्तल बहुभुज) के बीच टकराव का पता लगाने में सही तरीके से काम करते हुए एक अवरोधक को मारा है। मैं एक सर्कल-लाइन टकराव का पता लगाने वाले परीक्षण का उपयोग कर रहा हूं जहां प्रत्येक पंक्ति उत्तल बहुभुज ईंट पर प्रतिनिधित्व करती है और किनारे करती है।
अधिकांश समय सर्किल-लाइन परीक्षण ठीक से काम करता है और टक्कर के बिंदुओं को सही ढंग से हल किया जाता है।
टकराव का सही तरीके से पता लगाना।
हालांकि, कभी-कभी मेरी टक्कर का पता लगाने वाला कोड एक नकारात्मक भेदभाव के कारण गलत हो जाता है जब गेंद वास्तव में ईंट को काट रही होती है।
मैं इस पद्धति के साथ अक्षमता से अवगत हूं और मैं परीक्षण की गई ईंटों की संख्या में कटौती करने के लिए अक्ष संरेखित बाउंडिंग बॉक्स का उपयोग कर रहा हूं। मेरी मुख्य चिंता यह है कि नीचे दिए गए मेरे कोड में कोई गणितीय बग हैं।
/*
* 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);
वापस रखना भूल गया । आपके जवाब के लिए बहुत बहुत धन्यवाद, इससे मुझे बहुत मदद मिली।