Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有没有办法得到一条与3个球体相交的线?_Algorithm_Geometry_Intersection - Fatal编程技术网

Algorithm 有没有办法得到一条与3个球体相交的线?

Algorithm 有没有办法得到一条与3个球体相交的线?,algorithm,geometry,intersection,Algorithm,Geometry,Intersection,我试图找到一种方法来得到一条线(从我目前的观点来看),它与3个球体相交。它们靠得很近,可能不会每次都相交。 我还认为可以把它想象成圆圈和重叠部分。是的,肯定有办法。你可以把这个问题表述为三个二次不等式。我假设坐标系的原点是视角。如果没有,则必须执行从表示配置的任何坐标系到视图坐标系的更改。您有球体的圆心P1、P2、P3的坐标及其相应的半径r1、r2、r3。您正在寻找一个向量,该向量与穿过视点(坐标系原点)并与所有三个球体相交的直线对齐。您可以认为屏幕距离h(h可以简单地设置为1),平行于视图坐标

我试图找到一种方法来得到一条线(从我目前的观点来看),它与3个球体相交。它们靠得很近,可能不会每次都相交。
我还认为可以把它想象成圆圈和重叠部分。

是的,肯定有办法。你可以把这个问题表述为三个二次不等式。我假设坐标系的原点是视角。如果没有,则必须执行从表示配置的任何坐标系到视图坐标系的更改。您有球体的圆心
P1、P2、P3
的坐标及其相应的半径
r1、r2、r3
。您正在寻找一个向量,该向量与穿过视点(坐标系原点)并与所有三个球体相交的直线对齐。您可以认为屏幕距离
h
h
可以简单地设置为1),平行于视图坐标系的两个坐标轴。例如,屏幕与x,y平面平行,因此可以将向量表示为
V=[V_x,V_y,h]
。然后,当以下关于
V
的二次不等式成立时,由
V
确定的直线正好与三个球体相交:

(r1**2 - dot(P1,P1)) * dot(V,V) + (dot(P1,V))**2 > 0 
(r2**2 - dot(P2,P2)) * dot(V,V) + (dot(P2,V))**2 > 0 
(r3**2 - dot(P3,P3)) * dot(V,V) + (dot(P3,V))**2 > 0 
在接下来的内容中,我建议使用一种几何方法,它允许您找到上述不等式的解决方案。然而,由于存在各种特殊(称为退化)情况,我们必须回顾不同的场景,这足以让我们不想把这些完全写下来。我将为一般(非退化)情况编写一个算法。我假设离原点最近的球体是完全可见的,而其他两个球体既有可见部分也有不可见部分(从您的角度来看,这三个球体存在重叠,即不等式有一个解决方案)

这个想法是,给定两个球体和一个视点,使得一个球体,距离越远的一个,既有可见的部分,也有不可见的部分,那么在视点中正好存在两条直线,它们与两个球体相切。因此,在三个球体S1、S2、S3的情况下,对于任意一对球体Si和Sj,求出与球体Si和Sj的切线对齐的单位向量Vk,使得所述切线也与第三个球体Sk相交。因此,如果您将三个球体投影到屏幕上,从角度看,三个单位向量V1、V2、V3指向球体投影的公共交点的三个顶点(这是一个凸集,因为它是凸集的交点,即椭圆)。因此,三个向量的质心指向投影的公共交点内的一点(因为后者是凸的)。因此,它确定了一条与所有三个球体相交的线

注意,还有许多其他更为特殊的情况,球体可能位于不同的位置,因此您也必须覆盖它们。我将不得不检查下面的粗略代码是否有错误(下次)

将numpy导入为np
输入数学
#我假设你的观点是坐标系的原点,如果不是,
#无论坐标系是什么,都必须执行平移
#在视图坐标系中
# 
#由圆心和半径定义的3个球体为
P1,r1
P2,r2
P3,r3
def区域(a、b、c):
p=(a+b+c)/2
返回数学sqrt(p*(p-a)*(p-b)*(p-c))
def管路_穿过_球体(V、P、r):
返回(r**2-np.dot(P,P))*np.dot(V,V)+(np.dot(P,V))**2>0
def公共切线(P1、r1、P2、r2、P3、r3):
l1=数学sqrt(np.点(P1,P1))
l2=数学sqrt(np.dot(P2,P2))
d1=数学sqrt(l1**2-r1**2)
d2=数学sqrt(l2**2-r2**2)
a1=l1/d1
a2=l2/d2
b1=r1/d1
b2=r2/d2
A1=A1*P1/l1
A2=A2*P2/l2
c=数学sqrt(np.dot(A2-A1,A2-A1))
hc=2*面积(a1、a2、c)/c
c1=数学sqrt(a1**2-hc**2)
c2=数学sqrt(a2**2-hc**2)
如果c
是的,肯定有办法。你可以把这个问题表述为三个二次不等式。我假设坐标系的原点是视角。如果没有,则必须执行从表示配置的任何坐标系到视图坐标系的更改。您有球体的圆心
P1、P2、P3
的坐标及其相应的半径
r1、r2、r3
。您正在寻找一个向量,该向量与穿过视点(坐标系原点)并与所有三个球体相交的直线对齐。您可以认为屏幕距离
h
h
可以简单地设置为1),平行于视图坐标系的两个坐标轴。例如,屏幕与x,y平面平行,因此可以将向量表示为
V=[V_x,V_y,h]
。然后,当以下关于
V
的二次不等式成立时,由
V
确定的直线正好与三个球体相交:

(r1**2 - dot(P1,P1)) * dot(V,V) + (dot(P1,V))**2 > 0 
(r2**2 - dot(P2,P2)) * dot(V,V) + (dot(P2,V))**2 > 0 
(r3**2 - dot(P3,P3)) * dot(V,V) + (dot(P3,V))**2 > 0 
在接下来的内容中,我建议使用一种几何方法,它允许您找到上述不等式的解决方案。但是,由于有各种特殊的(称为de