球面相交

问题描述 投票:0回答:1

我有两个相交的球,并且我试图找到与点(0,0,1)方向最近的相交点

我的第一个球的(c1)中心在(c1x = 0,c1y = 0,c1z = 0)且半径为r1 = 2.0

我的第二个球的(c2)中心在(c2x = 2,c2y = 0,c2z = 0),并且半径为r2 = 2.0

我一直遵循this identical question中“典型交叉点”部分的逻辑,但是在理解它时遇到了一些麻烦,希望有人可以帮助我。

首先,我找到相交中心c_i和相交圆r_i的半径:

这里第一个球的中心为c_1,半径为r_1,第二个球的c_2和r_2为交点,中心为c_i,半径为r_i。令d = || c_2-c_1 ||,球之间的距离。

因此,sphere1的中心c_1 =(0,0,0)且r_1 =2。Sphere2的c_2 =(2,0,0)且r_2 = 2.0。

d = || c_2-c_1 || = 2

h = 1/2 +(r_1 ^ 2-r_2 ^ 2)/(2 * d ^ 2)

所以现在我像这样解决h的函数并得到0.5:

h = .5 +(2 ^ 2-2 ^ 2)/(2 * 2 ^ 2)

h = .5 +(0)/(8)

h = 0.5

我们可以将其细分为上述c_i的公式,以找到相交圆的中心。

c_i = c_1 + h *(c_2-c_1)

((这个方程式是我最初的问题,但是对这篇文章的评论帮助我理解了对于每个x,y,z求解)

c_i_x = c_1_x + h * (c_2_x - c_1_x)

c_i_x = 0 + 0.5 * (2 - 0) = 0.5 * 2

1 = c_i_x

c_i_y = c_1_y + h * (c_2_y - c_1_y)

c_i_y = 0 + 0.5 * (0- 0)

0 = c_i_y

c_i_z = c_1_z + h * (c_2_z - c_1_z)

c_i_z = 0 + 0.5 * (0 - 0)

0 = c_i_z

c_i = (c_i_x, c_i_z, c_i_z) = (1, 0, 0)

然后,反转我们以前的毕达哥拉斯关系之一以找到r_i:

r_i = sqrt(r_1 * r_1-h h d * d)

r_i = sqrt(4-.5 * .5 * 2 * 2)

r_i = sqrt(4-1)

r_i = sqrt(3)

r_i = 1.73205081

因此,如果我的计算正确,我就知道两个球相交的圆以(1、0、0)为中心并且半径为1.73205081。

我对上面的所有计算都充满信心,只要我没有犯任何数学错误,这些步骤就有意义。我知道我越来越近了,但是从这一点开始我的理解开始减弱。我的最终目标是找到最接近(0,0,1)的交点,并且有了交点圆,所以我认为我需要做的是在那个圆上找到最接近(0,0 ,1)对吗?

this solution的下一步说:

所以,现在我们有了交点的中心和半径。现在,我们可以绕分离轴旋转它以获得完整的解决方案。该圆位于垂直于分隔轴的平面中,因此我们可以将n_i =(c_2-c_1)/ d设为该平面的法线。

所以找到平面的法线涉及n_i = (c_2 - c_1)/d,我是否需要做类似的事情才能再次找到x,y和z的n_i?

n_i_x = (c_2_x - c_1_x)/d = (2-0)/2 = 2/2 = 1

n_i_y = (c_2_y - c_1_y)/d = (0-0)/2 = 0/2 = 0

n_i_z = (c_2_z - c_1_z)/d = (0-0)/2 = 0/2 = 0

选择与该法线相互垂直的切线和双切线t_i和b_i之后,您可以在此圆上写任何点为:p_i(theta) = c_i + r_i * (t_i * cos(theta) + b_i sin(theta));

我想从最接近的点选择t_i和b_i吗? (0,0,1)

由于毛球定理,没有一种通用的方法来选择要使用的切线/切线。我的建议是选择一个不平行于n_i的坐标轴,然后设置t_i = normalize(cross(axis, n_i))b_i = cross(t_i, n_i)或类似的东西。

geometry computational-geometry intersection
1个回答
0
投票
 c_i = c_1 + h * (c_2 - c_1)

这是vector表达式,您必须为每个组件编写类似的表达式:

 c_i.x = c_1.x + h * (c_2.x - c_1.x)
 and similar for y and z

因此,您将获得圆心坐标:

c_i = (1, 0, 0)

正如您的引用所述,选择不平行于n vect0r的轴-例如y轴,获取其方向向量Y_dir=(0,1,0)并乘以n

 t = Y_dir x n = (0, 0, 1)
 b = n x t = (0, 1, 0) 

现在您在圆平面中具有两个向量t,b以建立圆周点。

© www.soinside.com 2019 - 2024. All rights reserved.