Для четырех сфер L, M, N, O - с начальным радиусом rL, rM, rN, rO и центрами 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
Но это «написание утомительных математических уравнений для всех сфер».
Вот короткая (n ^ 2) реализация в c # с Linq.
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 окружностями.
О, это другая проблема. Хм.
Предположим, у вас есть три апельсина, расположенных в виде треугольника, лежащих на поверхности земли. Каждая сфера касается остальных трех, но между всеми четырьмя сферами нет общей точки.
Вы хотите наименьшее «а», чтобы существовала общая точка (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