不使用 sqrt 计算二次方程的平方解

Compute squared solutions to a quadratic equation without using sqrt

我正在尝试编写一个圆到线段的碰撞检测算法,其中涉及确定圆和线段的交点。线段表示子弹在最后一帧的轨迹,这意味着即使有多个圆与线相交,它也会击中第一个圆。

我想获得交点的 t 值,这是衡量交点沿线段有多远的度量。计算 t 值需要求解二次方程,其中涉及公式 t = (-b - sqrt(det)) / (2 * a)。为了使代码更快,我试图避免完全使用 sqrt,这意味着我不会比较以找到所有潜在圆圈中的最小 t,而是尝试找到最小的 t^2为他们。但是,我不确定如何在没有 sqrt 的情况下找到 t^2,即使给定 t = (-b - sqrt(det)) / (2 * a),因为二项式展开仍然涉及 sqrt.

如何在不使用 sqrt 函数的情况下计算 t^2 = ((-b - sqrt(det)) / (2 * a))^2

你需要解决

(x0 - cx + dx * t)^2 + (y0 - cy + dy * t)^2 = r^2

每个 (cx, cy, r) 来自一组圆。在一般情况下,如果没有二次方程解和 sqrt,是不可能找到 t 值的。

但也许您可以(我们不知道所有问题的细节)构建一些 space 索引结构(分区,即 kd-tree)以避免对所有这些圈进行全面检查。