LINUX.ORG.RU

Ответ на: комментарий от ien

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

jreznot
() автор топика
Ответ на: комментарий от wfrr

Задача: есть объекты набросанные на плоскость. Есть две точки на одно объекте и на другом, построить связь состоящую из ортогональных линий, не пересекающую другие объекты. Я в пространство дискретизирую до точек с разностью координат 10, получается сетка. Вот по ней надо найти кратчайший красивый путь.
Задача решена в некоторых свободных UML редакторах, но в том коде хер что найдёшь

jreznot
() автор топика
Ответ на: комментарий от jreznot

Планарные графы тут причём... Но в конкретном случае...

Самое просто, что приходит в голову... Иди с концов. Т.е. строй ломаную с двух строн, анализируя, куда она может двигаться(учитываешь направление где вторая точка, соседние объекты и т.п.). Получаешь новые точки — потом запускаешь алгоритм для соединения этих точек... и т.п. Не?

ien
()
Ответ на: комментарий от jreznot

>Задача: есть объекты набросанные на плоскость. Есть две точки на одно объекте и на другом, построить связь состоящую из ортогональных линий, не пересекающую другие объекты. Я в пространство дискретизирую до точек с разностью координат 10, получается сетка. Вот по ней надо найти кратчайший красивый путь.

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

III
()
Ответ на: комментарий от III

для начала задачу можно решить на целочисленной сетке, без возможности двигать объекты — и меня, кстати, задача заинтересовала, так что я не поленился ее порешать — у меня получилось (если не ошибаюсь) О(m*n) операций, где m и n это размеры прямоугольника в котором ищутся пути, а штраф за каждый излом линии принят равным 1

однако... как бы повежливее выразиться... никоим образом не пытаясь здесь обсуждать модератора этого раздела Pi и его действия (это разрешено только в разделе http://www.linux.org.ru/forum/linux-org-ru/), замечу, что *мне* совершенно не ясно, как модератор Pi отнесется к постам с моим решением и его обсуждением; поэтому я воздержусь от излишних постов в этот раздел сайта

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

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

>где m и n это размеры прямоугольника в котором ищутся пути, а штраф за каждый излом линии принят равным 1

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

III
()
Ответ на: комментарий от III

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

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

У меня проект-курсовая, на гуглокоде, gpl v3. Линк не дам, боюсь срача
А вот понимание алгоритма, можно на псевдокоде, было бы не плохо.
У меня есть свои задумки, но хотелось бы из чего-то выбирать

jreznot
() автор топика
Ответ на: комментарий от III

Ах да, объекты двигать ненужно, сетка целочисленная. Просто найти красивый путь.

jreznot
() автор топика

Ну... как вариант:

1)Строишь граф. Каждая вершина графа - пара (точка, направление)

2) между вершинами (point1, dir1) и (point2, dir2) есть ребро только, если point1 и point2 соседние и dir2 = point2 - point1. И вес этого ребра 1 + alpha*(dir1!=dir2).

3) Далее находишь кратчайший путь из вершин (point1, *) в вершины (point2, *) алгоритмом Дейкстры.

Смысл параметра alpha. Чем больше alpha, тем меньше изгибов в ущерб длинне пути.

Waterlaz ★★★★★
()

Maze Router: Lee Algorithm

Lee, “An algorithm for path connection and its application,” IRE Trans. Electronic Computer, EC-10, 1961.

SSN
()

Собственно то, что Вам нужно:

Hightower’s Algorithm

Hightower, “A solution to line-routing problem on the continuous plane,” DAC-69.

SSN
()
Ответ на: комментарий от jreznot

если тебе писать его придется — бери тот, что предложил Waterlaz, т.к. код алгоритма дейкстры скорее всего можно нарыть в инете, а может даже алгоритм дейкстры для разреженных графов

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от SSN

Спасибо большое. Разберусь, авось реализую. Дейкстра не совсем годен, точек много и кол-во узлов надо минимальное и не в ущерб длине

jreznot
() автор топика
Ответ на: комментарий от SSN

А расскажите, как статью достать ? Все источники ааагорожены

jreznot
() автор топика
Ответ на: комментарий от jreznot

>Спасибо большое. Разберусь, авось реализую. Дейкстра не совсем годен, точек много и кол-во узлов надо минимальное и не в ущерб длине

делаешь alpha = 0.01 и алгоритм выбирает среди минимальных путей путь с найменьшим количеством узлов.

Да и дейкстра для разряженных графов не сильно хуже поиска в ширину.

Waterlaz ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

>Где про него хорошо написано?!

Да также, как и в обычной обратной волне (примеров миллион), только при просмотре соседних нод добавлять не единичку, а весовой коэффициент сложности перехода. Потом - пройти от конца к началу по наименьшим значением.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>Да также, как и в обычной обратной волне (примеров миллион), только при просмотре соседних нод добавлять не единичку, а весовой коэффициент сложности перехода. Потом - пройти от конца к началу по наименьшим значением.

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

Waterlaz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.