За последние 24 часа нас посетили 21720 программистов и 1045 роботов. Сейчас ищут 702 программиста ...

Расстановка прямоугольников на координатной плоскости самым компактным способом

Тема в разделе "Решения, алгоритмы", создана пользователем Antifreez2, 3 мар 2017.

?

Этот вопрос о...

  1. ...математике

    2 голосов
    66,7%
  2. ...программировании

    0 голосов
    0,0%
  3. ...мышлении

    1 голосов
    33,3%
  1. Antifreez2

    Antifreez2 Активный пользователь

    С нами с:
    10 фев 2014
    Сообщения:
    10
    Симпатии:
    0
    Необходимо расставить случайным образом N-ое кол-во прямоугольников на ограниченной координатной плоскости таким образом чтобы исключить пересечения.

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

    Все прямоугольники - квадраты и имеют случайные размеры от 1x1 до 5x5.

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

    То есть прямоугольники нужно расставлять компактно, избегая ненужных "пустот" на плоскости и "экономя" место.

    Есть ли какой-то алгоритм который можно использовать для решения этой задачи? Один за одним от 0,0 координаты расставлять нельзя. Нужно располагать прямоугольники как можно ближе к середине плоскости. Грубо говоря требуется строить здания начиная от центра города в разные стороны, при том что город ограничен в размерах и если строить в шахматном порядке то все здания не влезут.

    P.S.
    Когда-то видел скриншоты одной программы, там прямоегольники строились отражая рамер файла, выглядело это так: [​IMG] может. Тут прямоугольники компактно и красиво заполняют область.

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

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
  3. Antifreez2

    Antifreez2 Активный пользователь

    С нами с:
    10 фев 2014
    Сообщения:
    10
    Симпатии:
    0
    Не совсем. Нету иерархичности.
    Есть родительский прямоугольник, скажем 200x200 и внутри него нужно набросать от 50 до 100 других, разного размера от 1x1 до 5x5, как можно более компактно и близко к центру. Кроме того нужны именно координаты для каждого взятого прямоугольника.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Разве nested это не то что нужно?
     
  5. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    иерархичность, как раз, так или иначе присутствует. Ведь при любом решении задачи вы же сначала ставите прямоугольник в центр плоскости, а потом достраиваете смежные (если построение города должно происходить так как вы описали).
    Поэтому да, как указал тов. @denis01, почему бы не решить её иерархическим деревом квадратов. Особенность дерева, как мне кажется, будет в том, что оно не будет симметричным и отдельные листочки могут в итоге не иметь дочерних, а иные будут иметь большее их количество чем другие.