Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите придумать алгоритм 
:(
    Опции темы
knut
Дата 16.1.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



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


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
maxim1000
Дата 16.1.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



помнится, была старая тема похожая: http://forum.vingrad.ru/topic-3781.html
честно говоря, не помню, чем там всё кончилось, но на всякий случай стоит почитать


--------------------
qqq
PM WWW   Вверх
Kangaroo
Дата 16.1.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: нет
Всего: 104



Может подойти со стороны игрушек?
То есть сформулировать задачу так: найти кратчайший путь между двумя точками, где прямоугольники - препятствия.

А про алгоритмы поиска пути можна почитать тут


Это сообщение отредактировал(а) Kangaroo - 16.1.2008, 12:17


--------------------
Lost....
PM MAIL MSN   Вверх
_Y_
Дата 16.1.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Я бы попробовал такое приближение.

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

Дальше по такому алгоритму.
  • 1. Создаю граф с  узлами во всех вершинах прямоугольников, т.е. 4 узла на прямоугольник. Конечно, если  две вершины точно совпадают, достаточно одного узла.
  • 2. Добавляю еще два узла - начало и конец пути. Как я понимаю, они, по определению, лежат вне прямоугольников и никакой особой проверки не нужно. 
  • 3. Создаю ребра (прямые линии), пытаясь соединить все узлы со всеми.  При этом не создаются ребра, пересекающие хотя бы один прямоугольник. 
  • 4. Далее задача сводится к стандартной - нахождение кратчайшего пути в графе.
Подзадача: Проверить на то, пересекает ли прямая прямоугольник (пункт 3). 
  • Можно просто проверять на пересечение ребра графа с каждой стороной прямоугольника, исключая сами вершины прямоугольника.
  • Если для рассчета прямоугольники были увеличены, то можно еще проще - проверять на пересечение со сторонами исходных прямоугольников уже и углы не исключая.
Старый анекдот вспомнил. Когда водку стали продавать в бутылках по 0.8 встала задача  разлития 0.8 на троих. Ответ: разлить по 100 г и задача сводится к стандартной. smile 

Это сообщение отредактировал(а) _Y_ - 16.1.2008, 13:07


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
knut
Дата 16.1.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



_Y_, 
если я все правельно понял то мне надо создать взвешенный граф след. способом.
соеденить все вершины прямоугольников  друг с другом кроме тех  соеденение  каторых приведет к пересечениям  ребер(так мы получем ребра графа).
а затем уже в этом графе найти кратчайший  путь от А до Б.


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
SoWa
Дата 16.1.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Да вы что, ребят... Задача просто сводится к волновому алгоритму. Просто между прямоугольниками надо построить еще прямоугольники, хранящие в себе уену прохода.

В примеру: По вертикали два прямоугольника на расстоянии Н. Вот тогда прямоугольник, по которому можно ходить будет размера (max(l1,l2), H). Это так, примерно.

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


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
_Y_
Дата 16.1.2008, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



knut, ИМХО так. Если прямоугольников не слишком много - все должно работать быстро и приятно. Кстати - должно работать вообще с любыми многоугольниками.

 SoWa вот что-то совсем другое предлогает - может и лучше, но я совершенно не понял что именно.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.2333 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.