Вот метод, чтобы попробовать: итеративный поиск, используя имитацию отталкивающую силу.
Алгоритм
Сначала инициализировать набор данных за счет расположения кругов по всей поверхности в любом виде алгоритма. Это просто для инициализации, поэтому она не должна быть большой. Периодический код таблицы будет хорошо. Кроме того, присвойте каждому кругу «массу», используя его радиус в качестве значения массы.
Теперь запустите итерацию, чтобы сходиться по решению. Для каждого прохода через главный контур выполните следующие действия:
Вычислить силы отталкивания для каждого круга. Моделируйте свою силу отталкивания после формулы для силы тяжести с двумя настройками: (a) объекты должны быть сдвинуты в сторону друг от друга, не притягиваются друг к другу, и (b) вам нужно будет настроить «силовую константу», чтобы соответствовать масштабу вашей модели. В зависимости от вашей математической способности вы сможете рассчитывать хорошую постоянную стоимость во время планирования; другие мудрые просто экспериментируют сначала, и вы найдете хорошее значение.
После вычисления общих сил на каждом круге (пожалуйста, посмотрите на проблему n-body, если вы не знаете, как это сделать), переместите каждый круг вдоль вектора его общей расчетной силы, используя длину вектор как расстояние до перемещения. Здесь вы можете обнаружить, что вам нужно настроить значение постоянной силы. Сначала вам понадобятся движения с длиной, которая составляет менее 5% от радиуса сферы.
Движения на шаге 2 будут вытолкнуть круги с поверхности сферы (потому что они отталкивают друг друга). Теперь переместите каждый круг назад на поверхность сферы, в направлении к центру сферы.
Для каждого круга вычислите расстояние от старого положения круга до его нового положения. Наибольшее перемещение расстояния - это длина движения для этой итерации в основном цикле.
Продолжайте повторять через основной цикл на некоторое время. Со временем длина движения должна становиться все меньше и меньше, поскольку относительные положения кругов стабилизируются в соответствии с вашими критериями. Выйдите из цикла, когда движение ноги упадет ниже некоторого очень небольшого значения.
Tweaking
Вы можете обнаружить, что вы должны настроить расчет силы, чтобы получить алгоритм сходиться на растворе. Как вы настраиваете, зависит от типа результата, который вы ищете. Начните с настройки постоянной силы. Если это не сработает, вам может потребоваться изменить значения массы вверх или вниз. Или, возможно, изменить показатель радиуса в вычислении силы. Например, вместо этого:
f = (k * m[i] * m[j])/(r * r);
Вы можете попробовать это:
f = (k * m[i] * m[j])/pow(r, p);
Тогда вы можете экспериментировать с различными значениями р.
Вы также можете поэкспериментировать с различными алгоритмами для первоначального распределения.
Количество проб и ошибок будет зависеть от ваших целей дизайна.
Для чего вы пытаетесь оптимизировать? IE: Наименьшая сфера, чтобы соответствовать всем кругам или максимизировать количество кругов, чтобы они соответствовали сфере определенного размера или что? Относительно этого вопроса, что вы подразумеваете под «равномерным распределением»? – Nuclearman
взгляните на источник этой страницы - может дать вам идею или две; http://www.engineeringtoolbox.com/smaller-circles-in-larger-circle-d_1849.html – mike510a