我正在尝试解决这个问题,其中有4个球体,其中心和初始半径:
Bi =(Ci,Wi)其中Ci =(xi,yi,zi)是球体的中心,Wi是其初始半径。
球的半径通过参数连续增加,比如a。也就是说,随着'a'从0增加到无穷大,任何时刻球体的半径都是Wi + a。现在,球体是:Bi =(Ci,Wi + a)。问题是要找到四个球体的(编辑过的)体积相交的最小“a”。
是否有可能有效地解决这个问题,而不是为所有领域编写繁琐的数学方程式并解决'a'?
答案 0 :(得分:4)
幸运的是,球体交叉点是所有类型的三维交叉点中最简单的。如果两个球体的半径之和大于它们中心点之间的距离,则它们的体积相交。
所以解决这个问题的最简单方法是找到任意一对球体之间的最大距离(找到中心之间的距离然后减去它们的初始半径)。给定距离,除以2,你得到所有球体接触的值。如果大于该值,它们将重叠。
现在,实际上,这不是你的问题的答案,“我需要一个多大的值才能使所有球体形成一个连贯的体积”。毕竟,如果我将球体连成一排,每个球体只需触摸其最近的邻居即可形成连贯的体积。所以你仍然需要解决问题的连通图部分,但希望这足以让你开始。
答案 1 :(得分:1)
给定四个球体L,M,N,O - 具有初始半径rL,rM,rN,r0和中心cL,cM,cN,cO和共同的附加半径“a”。
当
时,L与M相交Distance(cL, cM) <= rL + rM + 2a
有四个球体,存在这些可能的限制。
//at least one of
Distance(cL, cM) <= rL + rM + 2a
Distance(cL, cN) <= rL + rN + 2a
Distance(cL, cO) <= rL + rO + 2a
//and at least one of
Distance(cM, cL) <= rM + rL + 2a
Distance(cM, cN) <= rM + rN + 2a
Distance(cM, cO) <= rM + rO + 2a
//and at least one of
Distance(cN, cL) <= rN + rL + 2a
Distance(cN, cM) <= rN + rM + 2a
Distance(cN, cO) <= rN + rO + 2a
//and at least one of
Distance(cO, cL) <= rO + rL + 2a
Distance(cO, cM) <= rO + rM + 2a
Distance(cO, cN) <= rO + rN + 2a
但那是“为所有领域编写繁琐的数学方程式”。
这是使用Linq的c#中的一个简短(n ^ 2)实现。
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.
应该可以使用先前的计算来修剪匹配以击败n ^ 2.
类似于2D情况,其中3个圆可以相互交叉,而没有公共区域与所有3个圆相交。
哦,那是一个不同的问题。 HMM。
假设你有三个橙色排列在一个平放在地球表面的三角形中。每个球体接触其他三个球体,但所有四个球体都没有共同点。
您想要最小的“a”,以便存在公共点(x,y,z)。
//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