3D圆圈交叉

时间:2016-03-02 13:39:11

标签: math 3d geometry intersection

我有两个圆,每个圆由中心点c =(x,y,z)定义半径r和法向量n =(x,y,z)(垂直于圆的平面)

如何计算两个这样的圆的交点(不一定在同一平面上)?

如果没有交叉点,但这些圆圈不平行,如何获得该点,如果增加或减少半径直到它们接触,这些圆将相交?

1 个答案:

答案 0 :(得分:2)

如果n1 x n2 = 0那么法向量是(反)共线的,并且平面是平行的。

如果Dot(c1-c2, n1) = 0它们是相同的,否则圆形交叉是不可能的。

在同一平面上有两个圆圈的情况。我假设r2>=r1

cdiff = (c1-c2)
cdifflen = cdiff.Length 

if cdifflen > r1 + r2 then no intersection
if cdifflen = r1 + r2 then intersection exists in one point
p = (c1 * r2  + c2 * r1) / (r1 + r2)

if cdifflen < r2 - r1 then no intersection
if cdifflen = r2 - r1 then intersection exists in one point
p = (c1 - c2) * r2 /(r2 - r1)

otherwise there are two intersection points
cdiffnorm = cdiff.Normalized //unit vector
cdiffperp = cdiffnorm * n1.Normalized
q = cdifflen^2 + r2^2 - r1^2
dx = 1/2 * q / cdifflen
dy = 1/2 * Sqrt(4 * cdifflen^2 * r2^2 - q^2) / cdifflen 
p1,2 = c1 + cdiffnorm * dx +/- cdiffperp * dy

解释了一些公式here

如果平面不平行,则它们的交点是带方向向量的线

dl = n1 x n2  

可以使用Geometric Tools Engine(文件GteIntrPlane3Plane3.h)找到此行的基点。然后用这条线检查两个圆的交点,并比较交叉点(如果存在)。