|
1
3
假设圆a的中心坐标和半径由a.x、a.y和a.r给出。 还假设我们有一个向量v,我们希望通过将第一个圆沿v方向移动一个量d来将圆推开。当出现以下情况时,圆将接触: ((a.x+(v.x*d))-b.x) 2. +((a.y+(v.y*d))-b.y) 2. =(a.r+b.r) 2. 该公式仅计算偏移圆心之间的平方距离,并将其设置为半径之和的平方。 我们可以通过从两个圆中减去第二个圆的中心点来移动这两个圆,从而使第二个圆形位于原点,从而将其从方程中删除,从而简化这一点: (a.x+(v.x*d)) 2. +(a.y+(v.y*d)) 2. =(a.r+b.r) 2. 现在我们只需要求解d,并将其乘以v即可得到结果(分离向量)。我作弊并使用了 online solver ,有两种解决方案(格式化为代码,因为格式化程序一直试图将乘法转换为斜体):
以下是Java中的一些概念验证代码:
这两种解决方案对应于在任一方向上将第一个圆推出第二个圆。您可以选择绝对值最小的解决方案,也可以选择带正号的解决方案。 失败案例:当圆不相交并且向量没有将它们置于碰撞过程中时,则没有解,并且方程给出负值的平方根,因此要么事先进行相交测试,要么在将其传递给sqrt()之前检查值的符号。 |
|
|
2
3
复制samgak中的命名方案,但将所有内容简化为二次方程的标准情况给出了程序
|
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |