如何判断两个圆柱体是否相交?

计算科学 计算几何 凸优化 约束优化 最小二乘 二次规划
2021-11-29 00:34:07

考虑任意两个圆柱体,定义为:它们底部的中心Ai, 它们底部的半径Ri, 单位向量Wi它们的轴方向和长度Li的气缸,其中i=1,2

在此处输入图像描述

两个圆柱相交的充要条件是什么?

我想以数字方式确定(通过程序,例如 Matlab 或 C++)两个给定的圆柱体是否相互交叉。所以问题是否在数值上可解,解的唯一性和存在性就变得很重要。

在数值上,我试图将问题转换为线性约束最小二乘问题,但发现很难证明交集和问题的解之间的等价性。

约束最小二乘问题是:

  1. 线性约束:两个圆柱体顶部和底部之间的点的凸点集,这定义了四个线性约束;
  2. 找到到两个圆柱轴的距离平方和最小的点;

然后将最小值与i=12Ri2确定圆柱体是否相交。-- 似乎可以在没有交点而最小值仍然小于标准时找到反例。

如何找到一个数值可解(如数值凸优化)的充要条件,以确定两个圆柱体是否相交?

2个回答

David Eberly 在这里很好地描述了解决方案(带有伪代码):http: //www.geometrictools.com/Documentation/IntersectionOfCylinders.pdf

简短的总结:像大多数凸-凸碰撞检测算法一样,您系统地搜索圆柱之间的分离轴。

为了将来对类似问题的参考,实时渲染的作者维护了一个链接表,用于不同类型的图元之间的交叉测试。

提示

如果两个气缸平行,问题就简单了。否则,如果轴之间的垂直距离超过半径之和,则不存在交集。

否则,两个侧面之间有一条相交曲线。可以解析表示:不失一般性,第二个圆柱体是垂直的,有一个底在原点(如果不是,则旋转并平移)。其侧面有隐式方程

x2+y2=R22.

参数方程可以达到第一个圆柱体侧面的任意一点

A1+U1R1cos(s)+V1R1sin(s)+W1t,0s2π
在哪里U1V1形成一个正交基W1.

将参数方程插入隐式方程,得到一个二次方程t. 所以你可以表达t作为一个函数s, 分析。

解决t=0t=L1(数字上)为您提供属于第一个圆柱体的曲线的有用部分,并划定一个(s,t)领域。

通过将该域边界的方程代入参数方程 (z组件),您应该能够判断是否

0A1z+U1zR1cos(s)+V1zR1sin(s)+W1ztL2
发生在域中。