vector - 笛卡尔平面上沿指定向量的两个圆之间的最小距离
问题描述
我正在尝试解决以下问题(我正在使用 Matlab,尽管欢迎使用其他语言的伪代码/解决方案):
我在笛卡尔平面上有两个圆,由它们的质心(p1,p2)和半径(r1,r2)定义。圆 1 (c1 = [p1 r1]) 被认为是“动态的”:它沿着向量 V = [0 -1] 平移。圆 2 (c2 = [p2 r2]) 被认为是“静态的”:它位于 c1 的路径中,但其质心的 x 分量偏离 c2 的 x 分量(否则解决方案将是微不足道的:圆心减去它们的半径之和)。
我试图定位沿 V 的距离(d),在该距离处,圆 1 将与圆 2“碰撞”(参见链接图像)。我确信我可以迭代地解决这个问题(即将 c1 转换为 c2 的边界框,然后收敛/测试交叉点)。但是,我想知道这个问题是否有封闭形式的解决方案。
解决方案
由于问题标题与取决于固定向量 {0, -1} 或 {0, 1} 而不是任意向量的问题和接受的答案不匹配,因此我添加了另一个适用于任何单位向量的解决方案。
哪里(见图1)
dx
,dy
是圆的旅行单位向量c1
p1
,p2
动圆心c1
和静圆心c2
r1
,r2
每个圆的半径
以下将设置为必须行进d
的距离,如果没有碰撞,则d将设置为c1
dx
dy
c2
Infinity
无解的三种情况
- 动圈远离静圈。
u < 0
- 移动的圆圈永远不会靠近到足以碰撞。
dSq > rSq
两个圆圈已经重叠。
u < 0
幸运的是,数学使这与离开的条件相同。请注意,如果您忽略
u
(1 和 3) 的符号,那么d
到第一次(因果)接触的距离将在时间上倒退
从而找到伪代码d
d = Infinity
rSq = (r1 + r2) ^ 2
u = (p1.x - p2.x) * dx + (p1.x - p2.x) * dy
if u >= 0
dSq = ((p2.x + dx * u) - p1.x) ^ 2 + ((p2.y + dy * u) - p1.y) ^ 2
if dSq <= rSq
d = u - (rSq - dSq) ^ 0.5
可以通过以下方式找到联系点
cpx = p1.x + dx * d;
cpy = p1.x + dy * d;
图1
推荐阅读
- c++ - 如何在 C++ 中重新实现包含 STL 指针容器的类的迭代器
- angular - 如何模拟 Observable 返回角度服务?
- html - 为什么删除边框后默认按钮会改变颜色?
- netcdf - CDO/NCO - 在维度上复制数据集
- ios - 将 CLLocationCoordinate2D 和半径转换为 GMSMapView 的缩放和中心点
- dns - JBOSS EAP 7.2 域无法启动默认服务器(服务器一,服务器二,服务器三)
- excel - 根据几个标准查找总和
- reactjs - 如何使用反应钩子设置状态数组
- c# - 实体类型
不是当前上下文模型的一部分。多个连接字符串? - python - 尝试将密集层附加到 vgg19 网络