현재 브레이크 아웃 클론을 개발 중이며 공 (원)과 벽돌 (볼록 다각형) 사이의 충돌 감지가 올바르게 작동하는 장애물을 발견했습니다. 각 선이 볼록 다각형 벽돌의 가장자리를 나타내는 원 선 충돌 감지 테스트를 사용하고 있습니다.
대부분의 경우 Circle-Line 테스트가 올바르게 작동하고 충돌 지점이 올바르게 해결됩니다.
그러나 때로는 충돌 감지 코드가 공이 실제로 벽돌과 교차 할 때 음의 판별으로 인해 false를 반환합니다.
이 방법의 비 효율성을 알고 있으며 축 정렬 경계 상자를 사용하여 테스트 된 벽돌 수를 줄입니다. 내 주요 관심사는 아래 코드에 수학 버그가 있는지 여부입니다.
/*
* 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);
다시 넣는 것을 잊었습니다 . 아래 답변에 대해 대단히 감사합니다.