math - 不使用 sqrt 计算二次方程的平方解
问题描述
我正在尝试编写一个圆到线段的碰撞检测算法,该算法涉及确定圆和线段的交点。线段表示子弹在最后一帧上的轨迹,这意味着即使有多个圆圈与线相交,它也会击中第一个圆圈。
我想获得t
交叉点的值,这是对交叉点沿线段有多远的度量。计算该t
值需要求解一个二次方程,其中涉及公式t = (-b - sqrt(det)) / (2 * a)
。为了使代码更快,我试图避免sqrt
完全使用,这意味着t
我不会比较找到所有潜在圆圈中的最小值,而是尝试t^2
为它们找到最小的。但是,我不确定如何找到t^2
没有sqrt
,甚至给出t = (-b - sqrt(det)) / (2 * a)
,因为二项式展开仍然涉及sqrt
。
t^2 = ((-b - sqrt(det)) / (2 * a))^2
不使用函数如何计算sqrt
?
解决方案
你需要解决
(x0 - cx + dx * t)^2 + (y0 - cy + dy * t)^2 = r^2
对于每一个(cx, cy, r)
来自一个圆圈集。t
在一般情况下,如果没有二次方程解和 sqrt,就不可能找到值。
但也许你可以(我们不知道所有问题细节)建立一些空间索引结构(分区,即kd-tree)来避免对所有这些圈子进行全面检查。
推荐阅读
- docker - 无法从 Eclipse 窗口连接到 Docker 守护进程
- c - 将字符附加到 C 字符串时,Valgrind 无效读/写
- json - 如何在python包解包期间检查requirements.txt中的库是否已安装
- javascript - Iterate over page.evaluate in Node
- javascript - 如何将对象数组中的值放入 JavaScript 中的新数组中
- wordpress - 如何将默认图像尺寸过滤器添加到 get_first_image 函数?
- java - 如何使用 GSON 中的 @SerializedName 备用字段来反序列化嵌套对象?
- javascript - OneSignal 后台数据通知
- oracle - 如何从 Apex 中的应用程序禁用页面?
- factorization - YAFU 用于分解极大数