检查将被击中的球的最快方法

Fastest way to check balls that will be hit in a segment

有N个红球和一个白球,它们的半径都相同。白球从位置p1移动到p2。

我的 objective 是预测白球将在其路径上击中的所有红球并将它们变成黄色。

我尝试遍历所有球并计算到 p1 和 p2 形成的线的距离,但是白色后面的球也变成了黄色,但它们不应该。我应该如何处理这个任务?有快速的方法吗?

你可以假设白棋会忽略所有碰撞,沿着它的路径前进,唯一的objective 是预测有什么球挡住了它的路。

我假设您正在使用 Ax+By+C = 0 来描述该行。

在这种情况下,您可以使用 Bx -Ay +C = 0 获得垂直线。 A 和 B 必须匹配,但 C 可以不同。找出C1和C2对应的开始和结束位置。现在我们正在寻找介于这两者之间的点。更具体地说,两个方程的符号,结果必须相反。即(Bx -Ay +C1) * (Bx -Ay +C2) <=0。这将过滤掉会在您感兴趣的线段外碰撞的红球。如果您想在起点和终点捕捉碰撞,您可能需要沿线移动 start/end 点。

要加快速度,您可以采取一些技巧。请记住,除法和平方根是昂贵的操作。对于距离,因为您需要除以 sqrt(A*A + B*B) 存储它的倒数并乘以它而不是为每个点重新计算。

如果您需要在一组静态球上计算许多此类碰撞,您可以考虑一些 space 分区。常规网格或更花哨的 BSP 或四叉树将允许您轻松删除大量测试,但代价是更复杂的实现和一些静态设置时间。

您应该为中心位于该矩形内的球着色:

该矩形的短边垂直于通过P1-P2 的线,分别通过P1 和P2 的中心。它们的长度是 4 x 半径,P1/P2 在线段的中间。

长边与通过 P1-P2 的线平行。

现在只需要检查红球的中心点是否在这四条直线的右侧即可。

检查 "How to tell whether a point is to the right or left side of a line?" 如何做到这一点。