Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Как упаковать шары в сфере?

#c_sharp #алгоритм


Есть алгоритм для построения шаров по поверхности сферы

private Vector3 GetVector(float length, int index)
{
    var inc = Mathf.PI * (3 - Mathf.Sqrt(5));
    var off = 2 / length;

    var y = index * off - 1 + (off / 2);
    var r = Mathf.Sqrt(1 - y * y);

    var value = index * inc;

    return new Vector3(Mathf.Cos(value) * r, y, Mathf.Sin(value) * r) * radius;
}


Может кто знает алгоритм именно для заполнения сферы шарами ?

Текущий результат:


    


Ответы

Ответ 1



Постройте плотнейшую упаковку шаров - ГЦК или ГПУ. Для гексагональной упаковки формулы координат центров есть в вики. В единицах радиуса шарика x = 2*i + (j+k) mod 2 y = Sqrt(3) * (j + 1/3 * (k mod 2)) z = Sqrt(8/3) * k Так что достаточно пройти по индексам слоя (k) и внутрислойным (i,j) и заполнить сферу. Код на Python : import math rbig = 3 rsmall = 1 rad = rbig / rsmall sq8 = math.sqrt(8/3) sq3 = math.sqrt(3) krange = math.ceil(rad / sq8) for k in range(-krange,krange+1): z = sq8 * k for j in range(-krange,krange+1): y = sq3 * (j + 1/3 * (k % 2)) for i in range(-krange,krange+1): x = 2 * i + (j + k) % 2 if x*x + y*y + z*z <= rad * rad: print(x*rsmall, y*rsmall, z*rsmall)

Комментариев нет:

Отправить комментарий