Задание по программингу

Задачка касается SVG и JS, но суть не в этом. Ломаю голову, как лучше решить следующую задачу: есть прямоугольник MxN, есть массив радиусов кругов. Заказчик хочет разместить их в этом прямоугольнике так, чтоб круги с большими радиусами были ближе к центру, а с меньшими ближе к краям. Нужно просчитать координаты центров так, чтоб круги не перекрывали друг друга. Скорее всего понадобится небольшие отступы между кругов.
Может быть есть какой-нибудь дедовский алгоритм для этого?
Спасибо.
  • Вопрос задан
  • 2732 просмотра
Пригласить эксперта
Ответы на вопрос 2
@MikhailEdoshin
Как мне кажется, можно попробовать следующее. Когда три круга с радиусами a, b, c касаются, их радиусы образуют треугольник со сторонами a+b, b+c и с+a. (Радиусы касающихся кругов лежат на одной прямой, отсюда один шаг до треугольника.)

Зная стороны треугольника, можем вычислить его углы. Вычислим для начала угол в центре a. Возьмем следующий круг d и приставим его к a и c. Образуется еще один треугольник из кругов a, c и d. Мы опять-таки можем вычислить его угол. Очевидно, мы можем таким образом укладывать круги вокруг a до тех пор, пока сумма внутренних углов не превысит 360 градусов.

Unlimited Free Image and File Hosting at MediaFire
После этого мы можем начать укладывать оставшиеся круги вокруг b. У него к этому времени уже будет занята часть круга — кругами a, c и, возможно, последним кругом, уложенным с другой стороны a.

Зная стороны и углы мы знаем центр круга и, таким образом, его вертикальные и горизонтальные границы. В процессе укладки можно отслеживать максимальную границу, чтобы ненароком не выйти за размер прямоугольника.

Возможно, в процессе работы будет имеет смысл добавлять воображаемые круги-заполнители.

Это не полное решение (алгоритма, кроме перебора, я не предложу, кроме того, возможны варианты, когда в промежуток между тремя касающимися кругами можно всунуть еще маленький кружок, так что алгоритм, возможно, будет довольно сложным). Но начало, кажется, хорошее.
Ответ написан
@Artqookie
Ну так отсортируйте радиусы в порядке возрастания. Потом жадно пихайте самый большой радиус в центр прямоугольника. Потом следующий и смотрите, пересекаются ли окружности. Пересекаться (вернее одна окружность будет внутри другой) они будут, поэтому двигаем второй радиус куда-нибудь, до тех пор, пока пересекаться не будут (смотрим сюда http://e-maxx.ru/algo/circles_intersection).

Оно?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
30 апр. 2024, в 15:11
500 руб./в час
30 апр. 2024, в 15:11
5000 руб./за проект
30 апр. 2024, в 15:05
5000 руб./за проект