powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / инверсное R-tree. Посоветуйте алгоритм
10 сообщений из 10, страница 1 из 1
инверсное R-tree. Посоветуйте алгоритм
    #38751060
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть чистый лист. На вход поступают прямоугольники рандомного размера и желаемые координаты размещения этих прямоугольников.
Надо их размещать так, чтобы они не пересекались с уже размещенными прямоугольниками, но при этом были поближе к желаемой координате. Уже размещенные прямоугольники двигать можно.


Пока я придумал решение, которое базируется на rtree. В дереве хранится свободное пространство прямоугольниками:
Берем rtree-структуру, и размещаем на ней прямоугольник размером с лист. Это будет наше свободное место. Когда надо на листе разместить вновь поступивший прямоугольник, то надо пометить это пространство занятым. Мы удаляем из rtree этот лист, бьем его на пересекающиеся листы снизу,сверху, справа, слева от занятого места и засовываем эти 4 листа снова в rtree.

когда нужно найти свободное место - мы из rtree извлекаем ближайшие к этой точки, и если туда наш поступивший прямоугольник помещается - то помещаем его в это место, в противном случае берем следующий ближайший в списке.


Навскидку, это работает. Но есть проблема в скорости - rtree работает медленно (использую sourceforge.net/projects/jsi/) как только прямоугольников становится много. И время растет нелинейно. 38прямогульников обрабатывается меньше чем за секунду.
51 поступивших прямоугольникв - 77сек на феном-3000, при этом размер rtree доходит до 1400000. И это, насколько понимаю, не столько проблема самого rtree, и не проблема java, сколько не очень хороший алгоритм. Cлишком много получается вставок и удалений. Плюс каждая вставка - это как правило удаление минимум 1 и вставка минимум 4 листов. Это если они не пересекаются. Количество листов растет лавинообразно.

Предложите плз, какие-нибудь другие варианты алгоритмов для данной задачи.
...
Рейтинг: 0 / 0
инверсное R-tree. Посоветуйте алгоритм
    #38751674
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось-бы больше знать о желаемых координатах. Их много? Одна, две, сотня?
...
Рейтинг: 0 / 0
инверсное R-tree. Посоветуйте алгоритм
    #38751987
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно рисую эскиз когда решаю графическую задачу. Мысли потом приходят.
В рамках мозгового штурма. Думаю что нужно искать границу для каждого
множества Rectangles. И при постановке очередного прямоугольника ставить его
в экстримальных точках границы. В качестве точки привязки - тоже экстремальная
точка (угол rectangle).

Для генетических алгоритмов. Из случайного набора прямоугольников выбросить
те кто явно нарушает правила. Оставшуюся выборку скрещивать используя координаты
{Xi,Yj} и из выживших выбрать наилучшего.
...
Рейтинг: 0 / 0
инверсное R-tree. Посоветуйте алгоритм
    #38751988
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
инверсное R-tree. Посоветуйте алгоритм
    #38752541
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Для каждого прямоугольника - свои желаемые координаты. Т.е., это пары (прямоугольник, координаты). Таких пар - до тысячи, обычно - несколько сот.
...
Рейтинг: 0 / 0
инверсное R-tree. Посоветуйте алгоритм
    #38752563
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

"Думаю что нужно искать границу для каждого множества Rectangles. И при постановке очередного прямоугольника ставить его в экстримальных точках границы."

не...видимо я некорректно объяснил задание. вобщем, за идею спасибо, я подумаю как ее можно приспособить для решения, но похоже, что это не то.

Нету такого, что много прямоугольников надо лепить к одной координате. Для каждого прямоугольника - своя координата.

Грубо говоря, у меня есть куча графиков на одной сетке. На графиках есть особые точки, которые надо подписать. При этом, точек на графике довольно много. Каждая особая точка имеет свой тип, и может подписываться разного размера шрифтом или значками. При этом, если просто рисуешь текст там, где он должен быть, то соседние подписи накладываются друг на друга, и получается мешанина. Собственно задача - расположить этот текст или значки в других координатах, неподалеку от нужных.

Щас попытаюсь приложить картинку на которой видно как оно накладывается
...
Рейтинг: 0 / 0
инверсное R-tree. Посоветуйте алгоритм
    #38752711
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выяснил, что я не одинок. Похожие вопросы:

http://www.linux.org.ru/forum/development/9912322
http://www.gamedev.ru/code/forum/?id=157988
...
Рейтинг: 0 / 0
инверсное R-tree. Посоветуйте алгоритм
    #38752804
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Звучит похоже на "Задача на оптимальный раскрой материала"
Попробуйте загуглить эту фразу.
...
Рейтинг: 0 / 0
инверсное R-tree. Посоветуйте алгоритм
    #38752844
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Загуглил.

Похоже, что нет. Оптимальный раскрой - это расположить поплотней, как показал mayton на картинке. А у мне, все же, чуток не то нужно.

Но все равно спасибо - посмотрю что там предлагается.
...
Рейтинг: 0 / 0
инверсное R-tree. Посоветуйте алгоритм
    #38766661
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,

надо, наверное, как то задать функцию оценки и искать её минимизацию

был помню на JBuilder в демках пример с деревом текста, там было можно мышкой за прямоугольники с текстом дёргать
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / инверсное R-tree. Посоветуйте алгоритм
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]