Вот моя проблема:
- У меня есть куча кругов, которые мне нужно отображать внутри холста.
- Существует произвольное количество кругов, каждый из которых имеет предопределенный радиус.
- Суммарная область окружностей всегда меньше площади холста.
Я хочу расположить круги так, чтобы они занимали максимальное пространство, доступное внутри холста, не касаясь друг друга. Моя цель - добиться визуально приятного эффекта, когда круги будут хорошо распределены внутри холста. Я не знаю, действительно ли это "заполнение пространства", поскольку моя цель состоит не в том, чтобы минимизировать расстояние между элементами, а в том, чтобы максимизировать его.
Вот пример того, чего я пытаюсь достичь:
Моя первая идея "грубой силы" заключалась в следующем:
- Для каждого круга: вычислите кратчайшее расстояние между его границей и каждой другой границей круга; суммируйте все эти расстояния, назовите это X.
- Рассчитать сумму всех X.
- Случайное изменение расстояний между кругами.
- Повторите 1-3 для заданного количества итераций и возьмите максимальное значение, полученное на шаге (2).
Однако это не кажется элегантным; Я уверен, что есть лучший способ сделать это. Есть ли какой-либо существующий алгоритм для достижения такого макета? Есть ли какая-либо существующая библиотека, которую я мог бы использовать (JavaScript или Ruby) для достижения этой цели?
Edit
Вот Javascript version принятого ответа, который использует Рафаэль для рисования кругов.