массивы — Как я могу создать плотно упакованные сферы, начиная с одной, в C ++?

Давайте предположим, что я начинаю с одной сферы определенного радиуса 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)

(создание шестиугольника центров). До этого момента я осознавал, что могу продолжать создавать новые сферы с помощью простого алгоритма, который просто создает равносильные треугольники, которые используют центры двух сфер для создания третьей сферы (именно так я рассчитал положение четырех новых сферы выше).

Однако переход в третье измерение (т. Е. Добавление новых сфер сверху или снизу от других) — вот где я застрял, поскольку не вижу способа разумно написать код для этого.

Любые предложения, которые решают мою проблему или являются более простыми, чем мое решение, очень приветствуются.

Спасибо.

-1

Решение

Основой для этого является концепция правильный симплекс. Если все сферы имеют одинаковый радиус, это просто вопрос создания все большего числа правильных симплексов. В 2D правильный симплекс является равносторонним треугольником. В 3D правильный симплекс — это равносторонний тетраэдр (как показано на вики-странице). Обратите внимание, что, получив треугольник, вы можете создать тетраэдр, создав другую точку (на рассчитанном расстоянии) по обе стороны от плоскости треугольника. Итак, вы можете создать два тетраэдра из этого треугольника. В этот момент каждая треугольная грань этого объема также является равносторонним треугольником, и, создавая новую точку снаружи каждой треугольной грани, вы создаете новый тетраэдр для каждого из них. И вы можете повторять этот процесс с каждым новым созданным лицом (для каждого созданного вами тетраэдра создается три новых лица). И вы можете использовать этот алгоритм для создания либо плотно упакованного набора сфер (с центрами в точках тетраэдров и радиусом в половину длины сторон тетраэдров), либо для создания тетраэдрической «сетки» (своего рода объемной версии треугольных сеток или сеток, которые распространены в различных приложениях).

1

Другие решения

Когда у вас есть три из этих сфер в треугольнике, вы можете сложить одну поверх них. Координаты 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)

Если у вас есть одна сфера во втором слое, вы можете добавить больше сфер в этот слой, используя метод, который вы описали выше.

Обратите внимание, что у вас есть выбор, какой треугольник выбрать …

1

По вопросам рекламы [email protected]