Russian Qt Forum
Ноябрь 23, 2024, 10:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Алгоритм размещения надписей на карте  (Прочитано 4453 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Октябрь 17, 2013, 14:20 »

Есть географическая карта на ней размещены объекты (на карте обозначаются кружочками), как создать к ним подписи чтобы подписи не пересекались друг с другом и не перекрывали сами объекты?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #1 : Октябрь 17, 2013, 15:04 »

В голову приходит проверка на пересечение областей, любая область будет иметь прямоугольную форму. Я бы сделал так:

1. Проверяем сколько областей на карте, если 0 то добавляем безболезненно.
2. Областей больше ноля, знаем координаты и размеры новой области, проверяем по уже существующим с какими пересекается, если не пересекается, добавляем на карту.
3. Если есть пересечение с соседними областями, то начинаем изменять координаты новой области. Например точка на карте соответствовала левому нижнему углу, перемещаем зону таким образом, что бы точка на карте соответствовала правому нижнему углу, затем опять проверяем пересечения. Таким образом мы можем проверить все 4ре угла, если всеравно есть пересечения, то на откуп программисту, можно поставить как угодно, тут уж ничего не поделаешь.

4. Для оптимизации, можно сначала найти области с которыми возможно пересечение и затем уже проверять только по ним.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #2 : Октябрь 17, 2013, 15:22 »

Как то так и реализовано, точнее размещаются все надписи(они же прямоугольники), потом проходят по всем надписям и если надпись пересекается ее начинаю крутить вокруг точки с увеличением радиуса, пока не найдется свободное место или радиус станет максимальным. от точки к надписи рисуется линия, вроде работает, но выглядит убого.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #3 : Октябрь 22, 2013, 13:03 »

Может есть готовые алгоритмы или схожие задачи? Желательно быстрый алгоритм, хотя расчет и будет произведен один раз.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #4 : Октябрь 22, 2013, 13:47 »

Сам я не силен, но вот есть библиотечка - http://www.cgal.org/  , поройся в доках, может что и подойдет.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.129 секунд. Запросов: 22.