Итеративное расслабление было бы обычным подходом к чему-то подобному.
По сути, вы начинаете со случайного размещения n кружков.Затем вы делаете несколько итераций, чтобы попытаться переместить круги в более приятную конфигурацию.
Для каждого круга C вы измеряете расстояние до других кругов, а для каждого круга рассчитываете силу C, которая отталкивает C от этого другого круга.Направление силы будет противоположно направлению к другому кругу, а величина будет, как правило, обратно пропорциональна расстоянию.(Таким образом, сила будет вести себя подобно гравитации, но в противоположном направлении.) Вы суммируете все силы на C, аналогично суммируете силы на всех других кругах, а затем немного перемещаете каждый круг, основываясь на общей силе наЭто.(Вам также понадобится сила, удерживающая круги от краев.) Это одна итерация, и после этого круги должны быть в немного лучшей конфигурации, чем они были раньше.
Теперь, если вы сделаете это для огромного количества итераций, вы, скорее всего, получите правильную шестиугольную мозаику, которая не будет выглядеть очень интересной.Таким образом, вы можете захотеть остановиться до этого, или добавить другую силу, удерживающую каждый круг от перемещения слишком далеко от своей первоначальной позиции, или игнорировать любые силы из других кругов, находящихся на большем расстоянии, или не перемещать круг, если его суммарная сила меньшезаданная величина.
Между прочим, многое из того, что вы будете делать, очень похоже на гидродинамику сглаженных частиц , метод моделирования жидкости. Вот видео о моделировании на Python, ну, в общем, более 100 сфер, имитирующих всплеск воды, почти полностью основанных на отдельных сферах, пытающихся держаться на правильном расстоянии от ближайших.