3D 中的圆-圆相交
Circle-circle intersection in 3D
我有两个圆,每个圆由中心点 c = (x,y,z) 半径 r 和法向量 n = (x,y,z)(垂直于圆的平面)定义。
如何计算两个这样的圆的交点(不一定在同一平面上)?
如果没有交点,但那些圆不平行,如果增加或减少半径直到它们接触,如何得到这些圆相交的点?
如果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
)找到这条线的基点。然后检查两个圆与这条线的交点,如果存在则比较交点。
我有两个圆,每个圆由中心点 c = (x,y,z) 半径 r 和法向量 n = (x,y,z)(垂直于圆的平面)定义。
如何计算两个这样的圆的交点(不一定在同一平面上)?
如果没有交点,但那些圆不平行,如果增加或减少半径直到它们接触,如何得到这些圆相交的点?
如果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
)找到这条线的基点。然后检查两个圆与这条线的交点,如果存在则比较交点。