Давайте предположим, что я начинаю с одной сферы определенного радиуса R и массива из трех элементов, содержащих декартовы координаты:
double vecpos[3];
vecpos[0]= 0.0;
vecpos[1]= 0.0;
vecpos[2]= 0.0;
double radius= 5;
Теперь я хотел бы добавить дополнительные сферы. Эти дополнительные сферы должны быть идеально упакованы, максимально плотными.
Я ищу алгоритм, который, начиная с этой единственной сферы, будет добавлять больше в наиболее плотно упакованном виде. Сферы могут, конечно, не перекрываться (то есть вести себя как сплошные шарики).
Мои попытки до сих пор были сосредоточены на добавлении большего количества сфер (например, слева и справа от исходной, поэтому в позиции:
(10,0,0)
(-10,0,0)
затем добавление новых сверху и снизу (в рассчитанных позициях:
(5, sqrt(3)/2 * 10, 0)
(-5, sqrt(10)/2 * 10, 0)
(5, sqrt(3)/2 * -10, 0)
(-5, sqrt(3)/2 * -10, 0)
(создание шестиугольника центров). До этого момента я осознавал, что могу продолжать создавать новые сферы с помощью простого алгоритма, который просто создает равносильные треугольники, которые используют центры двух сфер для создания третьей сферы (именно так я рассчитал положение четырех новых сферы выше).
Однако переход в третье измерение (т. Е. Добавление новых сфер сверху или снизу от других) — вот где я застрял, поскольку не вижу способа разумно написать код для этого.
Любые предложения, которые решают мою проблему или являются более простыми, чем мое решение, очень приветствуются.
Спасибо.
Основой для этого является концепция правильный симплекс. Если все сферы имеют одинаковый радиус, это просто вопрос создания все большего числа правильных симплексов. В 2D правильный симплекс является равносторонним треугольником. В 3D правильный симплекс — это равносторонний тетраэдр (как показано на вики-странице). Обратите внимание, что, получив треугольник, вы можете создать тетраэдр, создав другую точку (на рассчитанном расстоянии) по обе стороны от плоскости треугольника. Итак, вы можете создать два тетраэдра из этого треугольника. В этот момент каждая треугольная грань этого объема также является равносторонним треугольником, и, создавая новую точку снаружи каждой треугольной грани, вы создаете новый тетраэдр для каждого из них. И вы можете повторять этот процесс с каждым новым созданным лицом (для каждого созданного вами тетраэдра создается три новых лица). И вы можете использовать этот алгоритм для создания либо плотно упакованного набора сфер (с центрами в точках тетраэдров и радиусом в половину длины сторон тетраэдров), либо для создания тетраэдрической «сетки» (своего рода объемной версии треугольных сеток или сеток, которые распространены в различных приложениях).
Когда у вас есть три из этих сфер в треугольнике, вы можете сложить одну поверх них. Координаты x и y новой сферы будут средними из трех приведенных ниже, а добавленная высота будет 2 sqrt (6) R / 3. Так что, если нижние три
A = (0, 0, 0)
B = (2R, 0, 0)
C = (R, sqrt (3) R, 0)
Тогда новый будет
D = (R, sqrt (3) R / 3, 2 sqrt (6) R / 3)
Если у вас есть одна сфера во втором слое, вы можете добавить больше сфер в этот слой, используя метод, который вы описали выше.
Обратите внимание, что у вас есть выбор, какой треугольник выбрать …