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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как соединить два QGraphicsPixmapItem линиями обойдя другие QGraphicsPixmapItem  (Прочитано 3453 раз)
kdmdmitry
Гость
« : Июнь 05, 2015, 17:35 »

Подскажите алгоритм, как соединить два QGraphicsPixmapItem линиями обойдя другие QGraphicsPixmapItem (препятствия).
Алгоримы Астар и некоторые другие не подходят, т.к. область на которой располагаются айтемы состоит из ячеек. В этом случае обычная область QGraphicsScene с экранными координатами. Никак не могу сообразить без наводки. Есть предположение испускать конечную точку лучи и проверять, как они сталкиваются с другими QGraphicsPixmapItem. По ситуации обходить их на месте. Сами линии пока только для случая без препятствий строю с помощью QGraphicsPathItem.
« Последнее редактирование: Июнь 05, 2015, 17:40 от kdmdmitry » Записан
Hrundel
Гость
« Ответ #1 : Июнь 06, 2015, 00:32 »

А почему вдруг AStar не подходит? Даже если у тебя шахматная доска, это все-равно граф. Область из ячеек - тем более граф. А для обхода графов очень мало алгоритмов и AStar один из лучших. AStar'ом анализируют кратчайшие пути на геокартах. Не думаю, что твой граф сложнее геокарт.

И что еще не совсем понятно. Какие точки должны быть соеденины? Это должны быть только прямые или ломаные отрезки?

Вообще, задача описана очень плохо. Приципи картинку со своими точками.
« Последнее редактирование: Июнь 07, 2015, 10:29 от Hrundel » Записан
kdmdmitry
Гость
« Ответ #2 : Июнь 11, 2015, 11:06 »

Привет. Спасибо за ответ. Вот уже неделю мучаюсь. Какое-то решение уже есть, но очень кривое и пока не работающее  Грустный

Цитировать
Какие точки должны быть соеденины?

Блок у меня - это квадрат. У него есть входа и выход. Соединяют выход одного блока и вход другого блока.

Цитировать
Это должны быть только прямые или ломаные отрезки?
Это ломанные отрезки с прямыми углами.

Все проблемма в том, что я немного не понимаю. У меня не шахматная доска, а просто плоскость.

И все-таки тут бинго. Попробую разбить плоскость, как шаматную доску и действительно применить AStar. Ведь если геокарты так делают, то значит дурак тут точно я, а не моя проблема. Есть еще предположение двигать блоки не произвольно по плоскости, а по клеточкам. Это решит очень сильно проблему.
 
Спасибо за наводку буду работать в этом направлении.
Записан
Hrundel
Гость
« Ответ #3 : Июнь 11, 2015, 20:31 »

У каждого твоего блока есть центр с определенными координатами. Нужно создать структуру данных описывающую граф соостоящий из координат *(пары x,y) этих блоков. Таким образом отпадет необходимость разбивать все на клетки. Геокарты тоже не на клетки разбиты, а используют градусы, минуты и секунды для определения положения. Правда это уже тоже не самая актуальная фишка.
Таким образом при перемещении блоков, сам граф меняться не будет, так как количество узлов в графе будет оставаться постоянным (или пусть даже будет меняться - все равно), а значения координат для узлов будут менятья.
Обходя граф алгоритмом можно находить кратчайший путь от входа к выходу. Хотя, скажу честно, я  так и не понял - нужно искать кратчайший путь от заданного выхода до ближайшего входа? Если да, то при инициализации графа можно сразу сделать его взвешеным и потом алгоритм будет пролетать пару миллионов узлов за доли секунды. (в зависимости от процессора и серды исполнения, конечно). При этом только важно учитывать динамическое изменине положения узлов и оптимально реинициализировать веса графа во врмея смены положения узлов.
« Последнее редактирование: Июнь 11, 2015, 20:59 от Hrundel » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 12, 2015, 12:05 »

Была тут недавно эпопея с прокладкой таких путей, товарищ "летел через овраг" (ну не знаю долетел ли). Мне тоже предстоит задача где есть соединение выходов со входами. Просмотрев десяток подобных приложений увидел что никто из них "прокладкой" не занимается. Просто соединяют кривой (эрмитный переход), иногда на кривой одна точка чтобы юзер мог рулить. Пересеклось так пересеклось - юзер руками поправит. Думается это правильно. Возни с "автоматом" много, а толку чуть. Тот же AStar будет искать кратчайший по диагонали и выдаст "лесенку". Или вообще пересечение неизбежно.
Записан
Hrundel
Гость
« Ответ #5 : Июнь 12, 2015, 18:08 »

Да, графы без пересечений могут только в трехмерности существовать, да и то не все.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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