Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.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
C++ 生长球的交点_C++_Algorithm_Math_Geometry_Computational Geometry - Fatal编程技术网

C++ 生长球的交点

C++ 生长球的交点,c++,algorithm,math,geometry,computational-geometry,C++,Algorithm,Math,Geometry,Computational Geometry,我试图解决这个问题,这里有4个球体,它们的中心和初始半径: Bi=(Ci,Wi),其中Ci=(xi,yi,zi)是球体的中心,Wi是球体的初始半径 球的半径随着一个参数的增加而不断增加,比如说a。也就是说,当“a”从0增加到无穷大时,球体在任何时刻的半径都是Wi+a。现在,球体是:Bi=(Ci,Wi+a)。问题是找到四个球体的(编辑)体积相交的最小“a” 有没有可能高效地解决这个问题,而不是为所有球体编写繁琐的数学方程并求解“a”?幸运的是,球体交点是所有类型的三维交点中最简单的。如果两个球体的

我试图解决这个问题,这里有4个球体,它们的中心和初始半径:

Bi=(Ci,Wi),其中Ci=(xi,yi,zi)是球体的中心,Wi是球体的初始半径

球的半径随着一个参数的增加而不断增加,比如说a。也就是说,当“a”从0增加到无穷大时,球体在任何时刻的半径都是Wi+a。现在,球体是:Bi=(Ci,Wi+a)。问题是找到四个球体的(编辑)体积相交的最小“a”


有没有可能高效地解决这个问题,而不是为所有球体编写繁琐的数学方程并求解“a”?

幸运的是,球体交点是所有类型的三维交点中最简单的。如果两个球体的半径之和大于其中心点之间的距离,则它们的体积相交

所以解决这个问题最简单的方法就是找到任意一对球体之间的最大距离(找到中心之间的距离,然后减去它们的初始半径)。给定该距离,除以2,得到所有球体接触的a的值。任何大于该值的值,它们都将重叠


现在,事实上,这并不是你问题的答案,这是“我需要多大的a值才能让所有的球体形成一个单一的相干体”。毕竟,如果我把球体排成一行,每一个球体只需要接触它最近的邻居就可以形成一个连贯的体积。因此,您仍然需要解决问题的连通图部分,但希望这足以让您开始。幸运的是,球体交点是所有类型的三维交点中最简单的一种。如果两个球体的半径之和大于其中心点之间的距离,则它们的体积相交

所以解决这个问题最简单的方法就是找到任意一对球体之间的最大距离(找到中心之间的距离,然后减去它们的初始半径)。给定该距离,除以2,得到所有球体接触的a的值。任何大于该值的值,它们都将重叠


现在,事实上,这并不是你问题的答案,这是“我需要多大的a值才能让所有的球体形成一个单一的相干体”。毕竟,如果我把球体排成一行,每一个球体只需要接触它最近的邻居就可以形成一个连贯的体积。因此,您仍然需要解决问题的连通图部分,但希望这足以让您开始。

给定四个球体L、M、N、O-初始半径为rL、rM、rN、rO和中心cL、cM、cN、cO以及公共附加半径“a”

L与M相交时

Distance(cL, cM) <= rL + rM + 2a

距离(cL,cM)给定四个球体L,M,N,O-初始半径为rL,rM,rN,rO,中心为cL,cM,cN,cO和公共附加半径“a”

L与M相交时

Distance(cL, cM) <= rL + rM + 2a

Distance(cL,cM)问题应该是,“是否可以用一些数学有效地解决问题,而不是在计算机上乏味地执行数值近似?”还要注意,问题可能根本没有解决方案。例如,如果所有中心都相等且初始半径不同,则在任何
a
处,球体将不相交。您是指球体表面的交点,还是四个球体的整个体积?如果是前者,那么任意两个球体的交点就是一个圆(如果它们相交的话),所以对于将四个球体分成两对球体的任何划分,交点就是这两个圆的交点,如果它们恰好在不同的平行平面上,就永远不会相交。事实上,即使它们不是平行的,它们相交的机会也很小。(两条一维路径在三维空间相交的可能性很小)对不起,我是指体积的相交。我认为这可能类似于2D,在2D中,3个不断增长的圆的区域的公共交点从一个点开始。我很难理解你的问题。你是说你在寻找a的最小值,这样至少有一个点是所有4个球体共有的?也就是说,所有闭合球的交点不是空的?问题应该是,“是否可以用一些数学有效地解决问题,而不是在计算机上乏味地执行数值近似?”还要注意,这个问题可能根本没有解。例如,如果所有中心都相等且初始半径不同,则在任何
a
处,球体将不相交。您是指球体表面的交点,还是四个球体的整个体积?如果是前者,那么任意两个球体的交点就是一个圆(如果它们相交的话),所以对于将四个球体分成两对球体的任何划分,交点就是这两个圆的交点,如果它们恰好在不同的平行平面上,就永远不会相交。事实上,即使它们不是平行的,它们相交的机会也很小。(两条一维路径在三维空间相交的可能性很小)对不起,我是指体积的相交。我认为这可能类似于2D,在2D中,3个不断增长的圆的区域的公共交点从一个点开始。我很难理解你的问题。你是说你在寻找a的最小值,这样至少有一个点是所有4个球体共有的?那是所有闭合球的交点不是空的吗?谢谢你的帮助。另外,任何一对球体之间的最大距离除以2,就得到了一个值,即所有球体对彼此相交,但它们可能不相交于一个公共体积。类似于2D的情况,3个圆可以相互相交,而没有一个公共区域被所有3个圆相交。谢谢你的帮助。还有,最大的距离
decimal aResult =
(
  from left in spheres
  from right in spheres
  let dist = Distance(left.Center, right.Center)
  let aRaw = (dist - left.startRadius - right.startRadius)/2
  let a = aRaw < 0 ? 0 : aRaw   //spheres might start out touching!
  group a by left into g
  select g.Min()  //the smallest extra radius for each group
).Max();
//the largest extra radius that makes at least one equation true for each group.
// any smaller, and there exists a disconnected sphere with no true equation.
 //all must be true
(x - cL)^2 + (y - yL)^2 + (z - zL)^2 <= (a + rL)^2
(x - cM)^2 + (y - yM)^2 + (z - zM)^2 <= (a + rM)^2
(x - cN)^2 + (y - yN)^2 + (z - zN)^2 <= (a + rN)^2
(x - cO)^2 + (y - yO)^2 + (z - zO)^2 <= (a + rO)^2