#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)
Комментариев нет:
Отправить комментарий