|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Доброго времени суток! Задачка возможно для профи не стоит выделенного яйца. Есть Excel и Nanocad. В dwg начерчен лабиринт - здание с коридорной системой. Нужно по данным Excel построить маршрут от точи А в точку Б не пересекая стены и лучше по осям коридоров. Изменение направления маршрута под пока только под прямым углом. Выполняем следующее: 1. Обрисовываем коридоры прямоугольниками, указывая точки доступных для перемещения областей, при этом в Excel формируем таблицу координат с полями: ID,x1,y1,x2,y2,x3,y3,x4,y4, тип данный vba: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
2. Указываем начальную и конечную точку маршрута (для упрощения уже внутри коридора) тип данный vba: Код: vbnet 1. 2. 3.
3. Формируем начальный вектор движения для каждой оси из значений -1,0,1 тип данный vba: Код: vbnet 1. 2. 3.
4. Задаем шаг приращения и множитель (при использовании масштабируемых чертежей) 5. Формируем массив с координатами точек смены маршрута 6. Рисуем маршрут в dwg полилинией Задача 5 в различных вариантах решений вызвала проблемы, даже если не говорить об оптимизации. все хорошо пока координаты точки после приращения по вектору в разрешенной текущей зоне: ta2.x <= a2.x <= ta1.x And ta2.y <= a2.y <= ta1.y где a2 - текущая исследуемая точка, ta1 координаты с минимальными значениями по осям x,y текущей разрешенной области ta2 координаты с максимальными значениями по осям x,y текущей разрешенной области если же следующая точка выходит за пределы, возникает вопрос: куда повернуть? Поворачивал и в стороны основного направления от точки А точке Б - появляется проблема при необходимости повернуть в другую сторону, чтобы выйти из лабиринта к целевой точке. Поворачивая случайно (поочередно перебирая направления) совсем запутался в том куда идет вектор и есть ли решение для данного направления, непонятно до какой точки предыдущего поворота вернуться для поиска нового решения. Подскажете пожалуйста пример кода не слишком сложный для построения точек (координат маршрута) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2014, 22:59 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
BobgosНужно по данным Excel построить маршрут от точи А в точку Б не пересекая стены по dwg ничего подсказать не могу, но по нахождению выхода из лабиринта можно использовать волновой алгоритм. Если лабиринт перенести в Excel, то решение можно достаточно легко сделать волновым алгоритмом. Как пример: https://yadi.sk/i/f0RrVpP5cpFYg ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2014, 23:32 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Михаил Ч.BobgosНужно по данным Excel построить маршрут от точи А в точку Б не пересекая стены по dwg ничего подсказать не могу, но по нахождению выхода из лабиринта можно использовать волновой алгоритм. Если лабиринт перенести в Excel, то решение можно достаточно легко сделать волновым алгоритмом. Как пример: https://yadi.sk/i/f0RrVpP5cpFYg полностью перенести наверно будет неправильно - дополнительные операции преобразования в ячейки, приведения к масштабу. Потом вернуть назад, с учетом скруглений, для переноса в excel вернется в dwg криво. Комментариев немного в файле. Можно пояснить принцип и последовательность операций - как это реализовано в Excel, привести ключевой код (название процедуры)? 1. Задаем начальное направление 2. Ищем точку в которой встречается препятствие. .... что дальше? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2014, 10:39 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, в примере Choose(i, 1, 0, -1, 0) - что такое? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2014, 10:49 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Михаил Ч.BobgosНужно по данным Excel построить маршрут от точи А в точку Б не пересекая стены по dwg ничего подсказать не могу, но по нахождению выхода из лабиринта можно использовать волновой алгоритм. Если лабиринт перенести в Excel, то решение можно достаточно легко сделать волновым алгоритмом. Как пример: https://yadi.sk/i/f0RrVpP5cpFYg Михаил, баг или что-то недопонял. Алгоритм из файла в тупик попадает. Трети не закрасил, и стал мотаться по кругу в области ячеек 20-30 по оси. Вопрос в следующем: перенести из dwg модель в Эксель тоже еще та задачка. Можете описать основной принцип волнового метода? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2014, 21:04 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Исходная тема с лабиринтом: http://perfect-excel.ru/publ/excel/makrosy_i_programmy_vba/stroim_labirint_i_pishem_programmu_dlja_poiska_vykhoda/7-1-0-57 По кнопке "Старт" запускается алгоритм написанный автором темы - Денисом Батьяновым, в основе которого "правило одной руки", поэтому решение может не всегда быть найдено. Мой алгоритм запускается нажатием на кнопку "Волновой алгоритм". Если выход есть, то он будет найден. авторв примере Choose(i, 1, 0, -1, 0) - что такое? Это выбор направления по значению переменной i: влево, вверх, вправо, вниз. Можете привести пример вашего лабиринта, чтобы понимать что именно нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2014, 23:18 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Михаил Ч., Пример лабиринта во вложении Задача - найти оптимальный путь (по длине) и начертить линии трасс по исходным данным, полученным при обработке чертежа и записанным в Excel) Черные - стены Оранжевые - доступные для прохода зоны (заносим при прорисовке в dwg зон в excel в табличку x1,y1,x2,y2,x3,y3,x4,y4) Зеленые - оси доступных для прохода зон (к ним нужно привязать линии) Широкие полилинии (синие, голубые и т.д. с различным ототбражением) - примеры маршрутов Фиолетовые кружки - точки начала и окончания (из vba запрашиваем ввод точки, чертим кружок определенного диаметра, вносим данные о точке в Excel. Каждая точка может быть как входной так и выходной Фиолетовая граница - общая область исследования http://i.imgur.com/fY3CkNw.png Данные о стартовой точке и финишной показываем на чертеже и передаем в excel.vba как координаты xyz1.x, xyz1.y (Double) После прокладки оптимального, поправок для лучшего отображения нескольких маршрутов для разных цветов - записываем маршрут в Excel, чтобы потом быстро прорисовать без поиска или ручной оптимизации положения линий. Ограничения проходов по ширине пока не рассматриваем. Возможно применимость предлагаемого места вызывает смуту, потому как нужно найти не выход из лабиринта, а конкретный путь от точки А к точке Б? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2014, 12:02 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, в свое время использовал алгоритм "поиск в ширину" когда баловался и писал прогу по поиску маршрута в метро ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2014, 13:07 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
HandKot, Указанный метод метод больше похоже на эффективное решение моей задачи. Но все равно потребуется позиционироваться в пространстве dwg, чтобы определить возможные точки маршрута. Для этого нужно или нет оцифровать в массив все пространство чертежа с необходимой дискретностью? Или оцифровать доступные области в координатах чертежей, затем найти прилегающие координаты областей - которые будут областями для возможной смены маршрута? - достаточно? А вот так не получится? 1. Иду вдоль первого выбранного вектора в направлении максимального отклонения по одной из осей точки А от точки Б. 2. Упираюсь в препятствие и поворачиваю по 2-м перпендикулярным векторам. 3. Проверяю доступность области по следующему шагу по новому вектору. Если после поворота по новому вектору нет доступной области на следующем шаге ветку направление от последнего поворота считаю без решения. 4. Повторяю 1-3 для всех решений перечислений пока не буду в пределах одного шага от цели 5. Фиксирую первое решение и его ветку вырисовываю. Последующие решения - опционально.... для построения более дешевого по разнице координат между поворотами. По идее самое дешевое решение появится первым. Поможете с кодом VBA? Уже третий подход и все в тупик. То одно, то другое приводит к краху идеи. Может примерчик какой для подобной задачи наваяем или подыщем? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2014, 14:31 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Если есть возможность построить граф по данному лабиринту (описать все возможные маршруты по соседним перекресткам с указанием расстояний, где перекресток - это вершина графа, расстояния между перекрестками - ребра графа) то задачу по нахождению кратчайшего пути от любой точки до любой другой можно с помощью алгоритма Дейкстры (или Левита или Форда-Беллмана или Флойда-Уоршелла) Примеры нахождения кратчайших путей по графам размещал здесь: http://www.excelworld.ru/forum/3-6656-1 Если задачу свети к построению графа по указанному лабиринту, то найти кратчайшие пути будет не сложно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2014, 12:04 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos , что-то пропустил продолжение темы. Как сказал Михаил Ч. надо построить граф по лабиринту. Здесь помочь мне сложно, т.к я не знаком с dwg Вот Вы постоянно говорите "вектор". То в случае графа вектор и есть ребро графа, т.е начало и конец вектора - вершины графа ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2014, 08:32 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
HandKot Bobgos , что-то пропустил продолжение темы. Как сказал Михаил Ч. надо построить граф по лабиринту. Здесь помочь мне сложно, т.к я не знаком с dwg Вот Вы постоянно говорите "вектор". То в случае графа вектор и есть ребро графа, т.е начало и конец вектора - вершины графа так как построить граф по лабиринту описанному точками A(x1,y1);B(x2,y2);C(x3,y3);D(x4,y4) - разрешенные области - прямоугольники? и найти: а) оптимальный путь б) пересечение путей для разных трасс (из совсем несвязанных точек) Честно-задач навалило. Самому ваять не успевается, вижу код растет и явно что-то делаю не так. Хелп, дайте направления в виде примера кода ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2014, 22:59 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Михаил Ч.Если есть возможность построить граф по данному лабиринту (описать все возможные маршруты по соседним перекресткам с указанием расстояний, где перекресток - это вершина графа, расстояния между перекрестками - ребра графа) то задачу по нахождению кратчайшего пути от любой точки до любой другой можно с помощью алгоритма Дейкстры (или Левита или Форда-Беллмана или Флойда-Уоршелла) Примеры нахождения кратчайших путей по графам размещал здесь: http://www.excelworld.ru/forum/3-6656-1 Если задачу свети к построению графа по указанному лабиринту, то найти кратчайшие пути будет не сложно. да, очень похоже, но как построит графы в моем случае в этом пробема ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2014, 23:13 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, берем код из первого поста Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Я не знаю на каком принципе Вы будете её заполнять, но... если представить эту область вершиной графа, то получаем (код примерный, т.к давно с ВБ не работал) Код: vbnet 1. 2.
где paths() состоит из двух частей iD - идентификатор вершины iDNear - идентификатор смежной вершины для каждого iD , может быть несколько записей (по кол-ву смежных вершин) Думаю, что массив вершин и смежных вершин лучше представить в виде Dictionary или Collection ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2014, 08:18 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
HandKotBobgos, берем код из первого поста Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Я не знаю на каком принципе Вы будете её заполнять, но... если представить эту область вершиной графа, то получаем (код примерный, т.к давно с ВБ не работал) Код: vbnet 1. 2.
где paths() состоит из двух частей iD - идентификатор вершины iDNear - идентификатор смежной вершины для каждого iD , может быть несколько записей (по кол-ву смежных вершин) Думаю, что массив вершин и смежных вершин лучше представить в виде Dictionary или Collection Id - идентификатор вершины, графа, которую еще нужно определить. Имеем на старте две вершины - точку начала и окончания. Как найти смежную вершину - точку в которой возможен поворот пути по коридорам областей. чтобы сначала заполнить граф. Код: vbnet 1. 2. 3.
Т.е. граф будет состоять из массива точек Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2014, 10:25 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, я не работаю с dwg и не знаю как там что хранится Вы сначала определите, как распарсить файл, что в нем хранится и как. Тогда будет уже более продуктивный разговор ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2014, 13:41 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
AFAIK dwg закрытый бинарный формат (хотя, раз другие его поддерживают, наверное уже полу-закрытый ))) ) Наверное проще сконвертировать DWG в DXF и парсить DXF. AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2014, 21:47 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
проблема не перевести из dwg в xls координаты. Вопрос как построить граф? считаем, что уже есть координаты областей по которым можно строить маршрут от точки А к точке Б. как построить граф и проложить маршрут - определить координат точек ломаной линии? Да еще и посчитать какой путь короче, для двух маршрутов найти точки пересечения? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2014, 08:49 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgosпроблема не перевести из dwg в xls координаты. Вопрос как построить граф? считаем, что уже есть координаты областей по которым можно строить маршрут от точки А к точке Б. как построить граф и проложить маршрут - определить координат точек ломаной линии? Да еще и посчитать какой путь короче, для двух маршрутов найти точки пересечения? предоставьте больше данных (побольше строк и не в виде картинки) и как это выглядит графически. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2014, 13:51 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, метод правой (или левой руки) прост: двигаемся в любую сторону, не отрывая руку от стенки, пока не выйдем. Можно зациклиться, если есть внутренний цикл. Тогда будем бесконечно крутиться вокруг, значит надо помечать пройденное место. Собсно, и весь алгоритм - в детстве ещё читал. И выше уже писали: сначала построить граф, затем проверить на циклы в грАфе. А нужно ли искать кратчайший? Помимо указанных форматов есть открытый формат DOT, готовится в ноутпаде. Такой формат легко засасывается в ячейки эксел и при необходимости там и правится, и проверяется. digraph имя { //здесь навалом пишем все пары в любом порядке a1 -> b1; a1 -> b2; a1 -> b3; b2 -> c1; f1 -> b3; b2 -> c1; b2 -> f1; a1 -> d1; a1 -> d1; и т.д. } Если просто надо визуализировать для проверки, то можно использовать неприхотлтвый, но мощный открытый пакет GraphViz. В нём основные утилиты dot.exe - конвертер в каринки и dotty.exe - визуальный редактор графа. Если же надо программно обработать граф, то изначально есть 2 канонических представления графа. Вообще, граф == отображение {A} --> {A}x{A}, где {A}-множество вершин, которое отобрашается в их Декартово произведение. А по-русски: это вершины и рёбра вместе взятые. Ой, чей-то много написал ... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 17:49 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, на вопрос как построить граф? А что за координаты на рисунке. Народ имел ввиду, что вы создёте массив центральных точек на всех перекрёстках - это вершины графа. Или вопрос как автоматизировать нахождение перекрёстков, когда есть вершины криволинейных прямоугольников-коридоров? В последнем случае, если руками указать все перекрёстки , то их центры взять как среднеарифм. координат. Да, о представлениях графа. В языках давно есть готовые Tree-структуры. Если с чистого листа, то: либо "матрица вершин" (почти вся пустая), либо "списки инцидентности", которые похожи на формат DOT. Но вот программировать удобнее на списках, тк. уже есть готовые методы: следующий, предыдущий, пусто и т.д. Ну и две стратегии обхода всего графа: поиск "в ширину"/"в глубину" - всё равно всё пройденное запоминать надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 17:59 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
И чтоб мысль закончить. Алгоритм эмпирического блуждания по графу - тогда не надо никаких поворотов/векторов/углов и проч. Просто полагаем, что ребро графа - это коридор. Ну или алгоритм поиска пути, приближённого к короткому. При выборе способов ещё важно, насколько повторяемо будет это задание. Если один раз сделать, то можно и полувручную. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 18:05 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
какой ещё вопрос остался? Bobgosпроблема не перевести из dwg в xls координаты. Вопрос как построить граф? считаем, что уже есть координаты областей по которым можно строить маршрут от точки А к точке Б. как построить граф и проложить маршрут - определить координат точек ломаной линии? Да еще и посчитать какой путь короче, для двух маршрутов найти точки пересечения? Если я правильно понял: имеем криволинейные полоски на плоскости, которые могут пересекаться, да? По типу топографической карты, рекка и её притоки + каналы и т.д. Или дороги на местности. А как карты векторизуют, они ведь пиксельные? Т.е. как превратить полоску в линию? Доморощенный и неудобный вариант: решение системы линейных неравенств вида: a1 *x +b1*y<=c1 a2 *x +b2*y>=c2, решение - это прямоугольник, отрезок, точка либо пусто. Два таких прямоугольника задают пересечение 2-х фрагментов "дорог". Находим все изолированные (или даже частично пересекрывающиеся парные пересечения) - это и будут перекрёстки. Для этого кластеризуем найденные пересечения. Центры найденных кластеров можно принять за перекрёстки. (Этот метод имеет погрешности) Универсальный метод "по гребню хребта". Каждый участок "дороги" сглаживаем окрестностным сглаживателем. В результате получаем вместо плоской дороги 3-хмерный вал (хребет на местности). Теоретически у хребта будет гребень (или узкое плато, идущее по вершине). Затем ищем точки пересечения гребней, т.е. 1-мерных линий. Но и тут есть некоторые нюансы, т.к. строгого пересечения может не быть. На qb я когда-то баловался, валяется черновик. авторКак найти смежную вершину - точку в которой возможен поворот пути по коридорам областей Например: Если в достаточно маленькой окрестности точки на линии есть точки другой линии. Здесь выбор за сглаживателем - это для каждой точки дороги просто взвешенная сумма всех её точек, попадающих в некоторую окрестность. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 18:29 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98, Не вовремя полетел винт на ноуте... Долго пытался находить смежные стороны у прямоугольников дорог, но уж очень сложен становится код, и граф получится не линий а полос. Спаибо за подсказки. Да, нужно для начала из прямоугольников сделать отрезки. Здесь координаты x1+(x2-x1)/2 нахожу центральные. Это видимо ребра графа? Пересечения ищу тупо перебирая с шагом скажем 10мм линию ребро графа на предмет нахождения с таким же отклонением (10мм) координаты у другого ребра. Вот тут понял, что метод в корне неверный.. Зная что мои векторы только вертикальных или горизонтальны думаю прще составить функцию описывающую каждый отрезок. Но как и как потом найти пересечения? Можно привести пример кода ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2014, 08:08 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, добрый вечер,я случайно сюда щас гянул. Ваш вопрос мне вполне интересен теоретически, и чего смогу, то подскажу. Но ведь не я один такой "умный" в инете. Выше уже просили показать побольше данных. Добавляю просьбу: - примеры координат в ТЕКСТОВОМ виде,точек 100,например. И вообще, каков масштаб проблемы,т.е. порядок точек всего? - рисунок характерных перекрёстков, пусть даже и сделанный в пайнтбраше. Возможно пропорции перекрёстков окажутся важны. Задача ведь не элементарная. Когда будет понятно с алгоритмом, с кодом будет легче. Насколько я понимаю в технике программирования, то при обходах графов полезны рекурсивные вызовы функции со статическими переменными (либо их замена на глобально доступные переменные). Насчёт алгоритмов у меня появилась идея, но применима ли она здесь - надо посмотреть распределение точек с координатами. Из рисунка надо оценить сложность перекрёстков: "Ж"-обрАзные, Г-, Т-,Х-,"(", "|" и т.д ? Из последнего сообщения мне показалось, что Вы думали о графе, который строится из "стенок" коридоров,да? Я уверен, что здесь предлагался как раз граф "коридоров" и перекрёстков. Хотя м.б. подойдёт идея соединить стенки коридоров в цепочку рёбер,тогда граф т.ск. уже построен. Вопрос с функцией отрезков мне не очень понятен. Если есть уравнение 2-х прямых, то их т. пересечения вычисляется теоретически. В частности, для примера, пока Вы вполне можете руками в экселе сделать матрицу парных расстояний тех точек, которые определяют перекрёстки (как я понимаю - это углы коридоров). Лучше для статистики вообще любых точек, в т.ч. и на перекрёстках. Расстоянние самое Евклидовое sqrt( (x1-x2)^2 + (y1-y2)^2 ), впрочем можно обойтись без корня,т.к. нам важно их только сравнить. Затем вытягиваете матрицу в один столбец. Затем все смотрим ТОЧЕЧНУЮ диаграмму по этому столбцу. Есть подозрение, что даже визуально точки будут распадаться на кластеры. Дальнейшие выводы возможны после визуализации, но идея такая. Кластеры с минимальными значениями соответствуют перекрёсткам, но при этом ВСЕМ перекрёсткам. Чтобы отделить один от другого нужно с каждым парным расстоянием ассоциировать конкретные координаты этих точек. Т.о. точки получают признак "перекрёсток". Затем умно "кластеризуем" сами точки. Умозрительно говоря, два этих множества должны пересекаться как раз в местах перекрёстков. Это всё можно сделать формулами при помощи рук. Это всё делается только для того, чтобы нащупать канву алгоритма, а без характерных данных я дальше не фантазирую. Ну, есть ещё способ: превратить всё в растр и напустить векторизатор в автоматизированом режиме, а потом вытащить координаты и программировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2014, 17:27 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
А, вот включил картинки,теперь вижу пример плана. Он характерный? Напоминает трубопроводы пневмопочты на одном этаже) Всё равно, запрос на примеры данных не отменяется. Конечно прямоугольники далеко друг от друга. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2014, 17:47 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98, да, план характерный... только нужен универсальный инструмент для любой сложности коридоров. во вложении шаблон для записи точек коридоров. В dwg предлагаю не углубляться - за исходные берем лист sprAreas (формат представления данных о коридорах. Алгоритм вижу следующий а) ищем оси коридоров (длинная сторона области - направление оси б) находим пресечения осей - точки вершины графа в) формируем таблицу данных графа отрезки между пересечениями осей, где пересечения - вершины графа собственно построение: г) указываем две точки в разрешенных областях - разных (точка начала источник1 и окончания назначение 1 маршрута) д) находим путь к оси ближайшей области, включаем в граф отрезки от точки исходной до точки попадания в маршрут, от точки попадания в маршрут до крайних значений этого отрезка (всего три новых отрезка для точки - источника, три новых отрезка для точки назначения) е) прокладываем маршрут, определяем длину. повторяем г)-е) для других точек источник2- назначение2 ж) находим пересечения з) прорисовываем маршрут, выделяем пересечения ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 12:20 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, файл- то я посмотрел, да только Экс-2010 нету, а в опенофисе там ничего нет кроме прежних 4х точек. Нырять с головой в неизведанное множество данных не считаю практичным. Сначала смотрим репрезентативную часть данных. Устанавливаем границы размерности задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 14:56 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98, ок выложу файлик описанными областями на одном из примеров. к сожалению nanocad3.7 как-то странно реагирует на VBA обращения к слоям. А ноут мой похоронен до получения премиальных. Придется найти способ снять данные о точках. но сразу говорю. Размерность задачи - областей коридоров порядка 50 шт. Максимум - не ограничивается - но думаю обрисовывать более 3-4 сотен коридоров не потребуется в принципе. Типов маршрутов - маршрутов различных цветов для различных видов материальных потоков - в пределах десятка (это 1. сырье нерастаренное, 2-3 полуфабрикаты 2-х или трех степеней готовности, 4. тара, 5. ТБО, 6. органические отходы, 7. упаковочные материалы) Для основного типа маршрутов - движение полуфабрикатов (для одновременного отображения) - порядка до 15 линий + еще до 7ми трасс для других видов трасс. т.е одновременное отображение для 15 +7 трасс, проходящих по не более 200 областям между ориентировочно 100 начальными/конечными точками. Такой комментарий достаточен для выработки предложения по построению алгоритма? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 18:26 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
поправлю немного: Bobgosт.е одновременное отображение для (15+7)* N трасс, проходящих по не более 200 областям между ориентировочно 100 начальными/конечными точками. где N - это число этапов от 2-х до 10 (максимум) - число точек начала/окончания для выбранного маршрута это задача максимум. Задача минимум - одновременное построение (1+0)*N трасс, т.е. маршрут продукта от одного рабочего центра к другому. но хранение данных о уже прорисованных маршрутах как активных и проверки на пересечение с некоторыми неосновными категориями маршрутов. Такой комментарий достаточен для выработки предложения по построению алгоритма? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 18:36 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Ха! вопрос усложняется. Вы полагаете, что самое сложное - это решить задачу транспортного типа, а я думаю, что сложнее полностью автоматическое построение графа по любому подобному плану. И я как раз прежде всего рассматривал этот аспект задачи, а Ваше мнение? В противном случае руками создаём учебный граф, рёбрам присваиваем вес=длина пути и начинаем формулировать частные виды задач. Выбор за Вами. Боюсь, что "кружочки" придётся оцифровывать вручную. А пока можно ведь снять координаты с приведённого плана в пэйнтбраше. И сосредоточимся на одном "типе маршрута", на самом важном. В любом случае, хорошо бы определиться с терминологией. Был приведён рисунок фрагмент плана. Что на нём есть что? 1. "Один коридор" - это что? Я думал, что границы коридоров начерчены чёрными линиями, а что тогда такое ступенчатое в середине? там границы коричневые. А по периметру малиновая линия. 2. Что такое "область коридора"? это равно "область"? 3. Что на рисунке "трасса"? 4. Что означает цвет линии? 5. Что такое "маршрут"? что такое "этап"? 6. Если "начальными/конечными точками"=100, а "областей"=200, то граф предполагается какой? 100 вершин и 200 рёбер? 7. Маршруты (на графе), которые мы предполагаем строить могут не позволять строиться другим маршрутам? 8. "Рабочий центр" является одной из вершин будущего графа? 9. Под "графом" я всегда понимал топологию "коридоров", которые полагал физическими коридорами. Это значит, что для конкретного плана граф один и то же независимо от того, какой тип материальных потоков будем рассматривать. Такое возможно? Просто тогда налагаем доп. ограничения на допустимый путь по графу. 10. Ну и для начала главное, ручная оцифровка плана, превращение его в граф, совершенно не допустима? может допустим автоматизированный режим? Да, и ещё важно. На приведённом рисунке некоторые "коридоры" по длине соизмеримы с шириной. Такое может быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2014, 21:09 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98Ха! вопрос усложняется. Вы полагаете, что самое сложное - это решить задачу транспортного типа, а я думаю, что сложнее полностью автоматическое построение графа по любому подобному плану. И я как раз прежде всего рассматривал этот аспект задачи, а Ваше мнение? В противном случае руками создаём учебный граф, рёбрам присваиваем вес=длина пути и начинаем формулировать частные виды задач. Выбор за Вами. Боюсь, что "кружочки" придётся оцифровывать вручную. Вручную необходимо будет формировать список точек источников-приемников. Координаты их планировал вносить из Excel с помощью отдельной команды: Код: vbnet 1.
exp98А пока можно ведь снять координаты с приведённого плана в пэйнтбраше. И сосредоточимся на одном "типе маршрута", на самом важном. согласен, что сконцентрироваться на одном exp98В любом случае, хорошо бы определиться с терминологией. Был приведён рисунок фрагмент плана. Что на нём есть что? 1. "Один коридор" - это что? Я думал, что границы коридоров начерчены чёрными линиями, а что тогда такое ступенчатое в середине? там границы коричневые. А по периметру малиновая линия. -периметр - общая область чертежа для поиска пути. Если не потребуется - то и ладненько...exp982. Что такое "область коридора"? это равно "область"? да разрешенная для поиска пути область - коридор. "Очерчен черной линией, но с заделом для "красивости" прорисовки при снятии размеров - обведения коридоров предполагал, что область будет например на 100 мм уже, чем сам коридор. exp983. Что на рисунке "трасса"? это ломаннная линия по центру коридоров exp984. Что означает цвет линии? это тип маршрута или трассыexp985. Что такое "маршрут"? что такое "этап"? это ломанная линия по центру коридора или трассаexp986. Если "начальными/конечными точками"=100, а "областей"=200, то граф предполагается какой? 100 вершин и 200 рёбер? 100 начальных конечных точек - это именно точки. Да, они в том числе должны будут добавляться к графу. Вершины графа: а) точки начальные/конечные, точки вхождения в маршрут и б) точки поворотов коридоров. Ребра графа а) отрезки между поворотами б) отрезки между например исходной точкой маршрута и ближайшим расстоянием до отрезка -оси коридора exp987. Маршруты (на графе), которые мы предполагаем строить могут не позволять строиться другим маршрутам? давайте сначала нужно нарисовать один маршрут exp988. "Рабочий центр" является одной из вершин будущего графа? это и есть начальные /конечные точки маршрута exp989. Под "графом" я всегда понимал топологию "коридоров", которые полагал физическими коридорами. Это значит, что для конкретного плана граф один и то же независимо от того, какой тип материальных потоков будем рассматривать. Такое возможно? Просто тогда налагаем доп. ограничения на допустимый путь по графу. да, граф должен быть а) статический - определенный топологией коидоров и б) динамическая часть, определяемая точкам начала, конца маршрутов и точками вхождения для того чтобы добраться от начальной точки до линии маршрута exp9810. Ну и для начала главное, ручная оцифровка плана, превращение его в граф, совершенно не допустима? может допустим автоматизированный режим? для начала допустима. Поставил на второй ноут NanoCad Вечером. если успею - сниму точки с какого-нить плана exp98Да, и ещё важно. На приведённом рисунке некоторые "коридоры" по длине соизмеримы с шириной. Такое может быть? соизмеримы могут, но не квадратны. Принимаем это за аксиому, чтобы можно было найти ось коридора. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2014, 09:37 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Я понял так. Вы предлагаете "коридорами" считать наборы прямоугольников с рамкой коричневого цвета. Шарики - это рабочие места, их включаем в множество вершин графа. Предполагаем, что все нужные координаты уже заданы. Начинаем мучиться с транспортной задачей, хотя по классике это всё же "задача транспортного типа". Только моё ИМХО. Не должно быть для начала у графа никаких "динамическая часть, определяемая точками старта/финиша". Или как, раб.места могут менять координаты от запуска к запуску? Начальный граф будет статическим, всё остальное, которое динамическое, будет доп.струтктурами. Это для начала. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2014, 15:16 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Вот вроде для затравки. Я усматриваю 3 основных этапа задачи. 1) Превращение dwg в "наш" формат. 2) Собственна задачи на графе. 3) Экспорт и рисоваание найденных маршрутов в dwg. Да, а решаем в VBA? Тогда вот как я бы начал. 1) - полагаю сделанным, для этого составляю таблицу в эксел. Нумерую все вершины графа как-нибудь. В таблице эксел эта нумерация отражена например так: N1 X Y N2 X Y N3 X Y .......... ЗАдаю размерность задачи, чтобы поместился рисунок, например до 25 вершин графа, рёбер будет примерно столько же. Выбираю описание графа в виде матрицы вершин Г(25х25). Граф предполагается не направленный (т.е. движение в любую сторону возможно)? Тогда матрица Г будет симметричной. Если с направлениями, то не симметричной. Надо определиться с этим заранее. Определяю Г(ij) Каждую строку матрицы Г отводим для описания связей с остальными вершинами. Г(ij)=0 <=> вершины i и j не связаны друг с другом, где i - строка, j - столбец Г(ij)=1 <=> они связаны. Вместо 1 удобно писать вес ребра и "минус вес" если в этом направлении запрет движения. В дальнейшем при поиске путей всегда двигаемся вдоль СТРОК. Направленнось рёбер или нет можно будет поправить позднее: упрёмся - разберёмся. Лично мне нужно вспоминать как рекомендуют. Вроде длдя 2-направленности подразумевали 2 противонаправленных ребра - тогда матрица м.б. несимметрична. 2) Ну собственно этап поиска пути да, задаём начальную вершину, ограничения, конечную и впрёд - выбираем один из способов нахождения маршрута, а предварительно конвертируем матрицу Г() в требуемый формат. Результат возвращаем в виде матрицы М(25х25), а можно в виде последовательного направленного списка, состоящего из номеров вершин Г. Пока в 0-м приближении так. Ах ну да, очевидно, Ваш граф может содержать циклы, поэтому у него нет понятия корень/листья как у дерева. Для каждого маршрута, который хотим найти берутся вершины начала и конца маршрута. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2014, 15:59 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Насчёт этого: exp98 Г(ij)=1 <=> они связаны. Вместо 1 удобно писать вес ребра и "минус вес" если в этом направлении запрет движения. в случае запрета обратного движения вроде ставим "0", хотя можно "минус бесконечность" или "плюс беск.", чотбоы по длине пути отсеялось, на месте разберёмся. Если "0", то встретив его, придётся его обрабатывать как запрет движения. Эту часть уже вполне можно сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2014, 19:44 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98Вот вроде для затравки. Я усматриваю 3 основных этапа задачи. 1) Превращение dwg в "наш" формат. 1.1. Прикрепил файл с оцифрованным чертежом. sprAreas = координаты 4-х точек областей, доступных для трассировки по ним нужно найти оси и пересечения осей для формирования вершин графа sprWCentre - координаты рабочих центров 1-я точка центр круга, 2-я точка - направление начала движения, если потребуется (но лучше определить в VBA к ближайшей оси области) ncGrafTemp - лист для составления графа от точки x1y1 на листе sprWCentre нужно найти кратчайший путь до ближайшей оси - ребра графа, дополнить граф вершиной - точками входа в маршрут ncTraceType - лист типов трасс (маршрутов) для начала возьмем а) Сырье класс1 и б) Готовая продукция = два типа маршрутов для которых потом найти пересечения exp982) Собственна задачи на графе. еще раз для слепеньких. Граф - это список вершин с координатами? exp983) Экспорт и рисоваание найденных маршрутов в dwg. 3-экспорт не считал нужным. Вся идея - выполнять на лету. Т.е. выбрал какой=то продукт к которому привязаны рабочие центры, сырьеЮ полуфабрикаты поделенные на классы из листа ncTraceType и показал на слое трассировку выпуска, посчитал расстояния для перемещения exp98Да, а решаем в VBA? Тогда вот как я бы начал. 1) - полагаю сделанным, для этого составляю таблицу в эксел. Нумерую все вершины графа как-нибудь. В таблице эксел эта нумерация отражена например так: N1 X Y N2 X Y N3 X Y .......... ЗАдаю размерность задачи, чтобы поместился рисунок, например до 25 вершин графа, рёбер будет примерно столько же. Выбираю описание графа в виде матрицы вершин Г(25х25). Граф предполагается не направленный (т.е. движение в любую сторону возможно)? Тогда матрица Г будет симметричной. Если с направлениями, то не симметричной. Надо определиться с этим заранее. Определяю Г(ij) Каждую строку матрицы Г отводим для описания связей с остальными вершинами. Г(ij)=0 <=> вершины i и j не связаны друг с другом, где i - строка, j - столбец Г(ij)=1 <=> они связаны. Вместо 1 удобно писать вес ребра и "минус вес" если в этом направлении запрет движения. В дальнейшем при поиске путей всегда двигаемся вдоль СТРОК. Направленнось рёбер или нет можно будет поправить позднее: упрёмся - разберёмся. Лично мне нужно вспоминать как рекомендуют. Вроде длдя 2-направленности подразумевали 2 противонаправленных ребра - тогда матрица м.б. несимметрична. 2) Ну собственно этап поиска пути да, задаём начальную вершину, ограничения, конечную и впрёд - выбираем один из способов нахождения маршрута, а предварительно конвертируем матрицу Г() в требуемый формат. Результат возвращаем в виде матрицы М(25х25), а можно в виде последовательного направленного списка, состоящего из номеров вершин Г. Пока в 0-м приближении так. Ах ну да, очевидно, Ваш граф может содержать циклы, поэтому у него нет понятия корень/листья как у дерева. Для каждого маршрута, который хотим найти берутся вершины начала и конца маршрута. нужно переварить малость... а если в коде и по порядку? Часть вершин графа уже есть в списке рабочих центров = это точки назначения и источника Остальные нужно определить: см. начало этого поста. Как это в коде реализовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2014, 00:43 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Для меня эта тема интересная с точки зрения нахождения кратчайшего пути. Вся сложность состоит именно в построении корректного графа по чертежу. Алгоритм нахождения кратчайших путей запрограммировать не сложно (алгоритмом Дейкстры, Левита, Форда-Беллмана, Флойда-Уоршелла), ссылку на реализации я уже давал. Автоматизировать процесс построения графа по прямоугольникам - основная задача. Предполагаю, что лабиринт статичен, и достаточно один раз построить по нему граф в ручном или полуавтоматизированном режиме, а находить кратчайшие пути между точками делать уже математически. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2014, 08:29 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
BobgosBobgos1.1. Прикрепил файл с оцифрованным чертежом. Картинка того, с чего снимались координаты: что-то картинку не видно ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2014, 08:42 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
HandKotBobgosпропущено... Картинка того, с чего снимались координаты: что-то картинку не видно попробуйте открыть в новом окне ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2014, 08:49 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Михаил Ч.Для меня эта тема интересная с точки зрения нахождения кратчайшего пути. Вся сложность состоит именно в построении корректного графа по чертежу. Алгоритм нахождения кратчайших путей запрограммировать не сложно (алгоритмом Дейкстры, Левита, Форда-Беллмана, Флойда-Уоршелла), ссылку на реализации я уже давал. Автоматизировать процесс построения графа по прямоугольникам - основная задача. Предполагаю, что лабиринт статичен, и достаточно один раз построить по нему граф в ручном или полуавтоматизированном режиме, а находить кратчайшие пути между точками делать уже математически. полностью согласен. Лабиринт статичен, процедуры внесения изменений будут разрабатываться после решения основной задачи. Но их может быть много и нужен инструмент. Предложите максимально детальную последовательность или пример кода для построения графа. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2014, 08:51 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, авторГраф - это список вершин с координатами? Граф - это матемтическая абстракция состоящая из множества вершин и множества дуг (рёбер) между ними. Дуги могут быть направленными туда-сюда либо ненаправленными. Для наглядности граф рисуют например в виде кружочков, соединённых линиями. На линиях могут рисоваться стрелочки и веса. В общем это шутейный ответ, хотя и правильный. Надеюсь, что теперь слово "граф" будем использовать в качестве термина, а термин "дуга" оказалось проще писать)) Ведь Ваша задача НЕ нарисовать граф, а составить ту самую абстракцию, которую затем нужно программно обработать. В программе удобно представить граф в виде квадратной матрицы G(n x n). Я бы не стал раньше времени использовать списки. Ну и какой тут нафиг код? Код: vbnet 1.
То есть! граф НЕ БУДЕТ содержать координат! Ещё до написания кода, на основе исходной таблицы (которую задаём непосредственно в ячейках эксела): автор.......... N1 X Y N2 X Y N3 X Y .......... мы найдём геометрическике длины дуг. Ну простой код здесь, я вообще формулами бы сделал. Затем, держа в голове знание о топологии графа, заполним вторую таблицу Г(ij) любым автоматизированным способом (Ну я бы именно так начал), в которую занесём (в отличие от того, что я сначала написал))): авторГ(ij)="плюс бесконечность" <=> вершины i и j не связаны друг с другом, где i - строка, j - столбец Г(ij)="длина_дуги" <=> они связаны, полагая, что движение м.б. 2-сторонним. В начале программы втягиваем ячейки Г(ij) в матрицу G(1 to N, 1 to N). Опять же, простой код. Тут есть замечания. 1) Бесконечность - взять достаточно большое число, которое влезает в формат матрицы G(). Т.к. в процессе суммирований нам придётся эти бесконечности складывать, то n*бесконечность должна гарантированно влезать в формат, и скорее всего "бесконечность" д.б. < Суммы любых настоящих весов. 2) Я освежил в голове краткое описания алгоритма Дейкстры (некий его вариант). Он находит в принципе все пути от заданной вершины до любой другой вершины, если все веса >0. Но дуги д.б. направленными, зато граф может содержать циклы. Кроме того, форма представления графа там моет отличаться от простой матричной. Может есть и другие варианты, я не смотрел. Поэтому лично я, сперва не стал бы гнаться за эффективностью реализации, а взял представление в виде матрицы с ненаправленными дугами. Затем методом "поиска ширину или глубину" просто перебрал бы все варианты и нашёл из них МИН. Код поиска предельно простой, если найдёте в Инете, то гут, нет - м.б. к завтра отсканирую псевдокод с разъяснениями. Файл скачал, что скажет опенофис? а картинки тоже не вижу. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2014, 15:31 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Мм-да, пока оптимизма на 67%. Взял 22 точки х1,у1, посмотрел парные расстояния. Распределение расстояний см. на рисунке. Т.к. матрица парных расстояний симметрична, достаточно видеть одну половину. Всего точек 484, значения на нуле - это диагональные элементы, их не смотрим. Выделены значения, которые между 0 и 5500 - это очевидная визуальная граница, которую хочется посмотреть. Попало 9 точек. Кто они, не смотрел. Пока работать надо. Есть надежда, если взять остальные 3*22 точки, получится что-то путное. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2014, 17:48 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Граф по исходному лабиринту я представляю как представлено на картинке во вложении. Где черные точки - это вершины графа, а красные линии - ребра. Достаточно сделать описание графа в виде матрицы смежности, либо с указанием растояний от одной вершины до другой. Как сделать автоматизированным описание - не знаю. Но уже по описанному графу найти расстояния между различными вершинами - не проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2014, 17:59 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
не нарисовалась одна линия, но и так понятно ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2014, 18:01 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Может с помощью рисунка половина моего плана станет понятней. На диаграммах: сверху: у(х) для коридоров, здесь угадываются контуры прямоугольников снизу: у(х) для шариков, здесь видны напаравляющие веекторы. 0) На данный момент все координаты забиты вручную, зато имеем нужные признаки по принадлежности: Вектор - шарик, 4 точки - прямоугольник. Этот этап (п.0) ещё предстоит автоматизировать, а сейчас действуем по-задуманному. Заведомые ляпы - плз, критикуем. 1)Для каждого прямоугольника составить уравнение прямой, которая будет его осью. Уравнение имеет вид ax + by=c 2)для каждого шарика составить уравнение ЛУЧА, вид уравнения аналогичен. С лучём работаем как с прямой, только потом, когда в п.4) будем фильтровать точки пересечения, не забыть, что это луч. Для этого в коде просто зашивается вычисляющая формула. 3) Находим ВСЕ парные пересечения ПРЯМЫХ и ЛУЧЕЙ. Тоже в коде зашивается вычисляющая формула. Здесь м.б. нетривиальный момент. два прямоугольника стыкуются параллельно, но со сдвигом по вертикали на 1 ед.изм. Тогда нужного пересечения по строгой формуле не получить, а надо бы. Тогда для "достаточно параллельных" лучей и прямых точку пересечения присваиваем насильно как ср.арифметич. угловых точек 2-х прямоугольников, которые ближе всего друг к другу. 4) В результате получим много лишних точек, которые надо исключить из графа. Исключаем их по прринципу, что они находятся вне достаточо малой окрестности допустимой области 2-х прямоугольников (либо шарика и прямоугольника). 5) Из оставшихся тт. составляем промежуточный ПОЛНОСВЯЗНЫЙ граф. 6) Из него вычёркиваем лишние дуги. По какому принципу? Наверное что-то типа "геометрическое представление дуги имеет отрезок, чья длина выходит далеко из допустимой области прямоугольника или шарика". Пока видится так. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2014, 21:25 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Михаил Ч., Да, теперь начинаю понимать. в Excel формулами построил отрезки осей прямоугольников. вроде вышло. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2014, 23:59 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98Может с помощью рисунка половина моего плана станет понятней. На диаграммах: сверху: у(х) для коридоров, здесь угадываются контуры прямоугольников снизу: у(х) для шариков, здесь видны напаравляющие веекторы. 0) На данный момент все координаты забиты вручную, зато имеем нужные признаки по принадлежности: Вектор - шарик, 4 точки - прямоугольник. Этот этап (п.0) ещё предстоит автоматизировать, а сейчас действуем по-задуманному. Заведомые ляпы - плз, критикуем. не догоняю я точечные диаграммы exp981)Для каждого прямоугольника составить уравнение прямой, которая будет его осью. Уравнение имеет вид ax + by=c Пойдем по пунктам пункт 1 формулами состоял из шагов на картинке 1-0..1-3 1-0 - сортировка координат в составе строки массива областей. нужно реализовать в коде при снятии с dwg 1-1 - определяем средние координаты для x и y 1-2 - находим правильное направление (экстремумы, а точнее разницу между максимумом и минимумом по каждой оси для каждой области 1-3 - в зависимости от результата п1-2 присваиваем значение либо средних координат (т.е. средние значения по оси Х для области Xmin+(Xmax-Xmin)/2) , если у1-y2<x1-x2) получены координаты отрезков - НО не прямых. Внимание: как полученные данные применить в виде уравнения? для первой области в массиве прямая определяется кажется выражением: a1+a2*x+b1+b2*y = 0, где b1=23130, b2=0 a1=0, a2=y НО для отрезка по сути еще нужно еще добавить, (а точнее только составить систему неравенств -условий) : Xmax>=X>=Xmin Y=Ymin+(Ymax-Ymin)/2 Вопрос: что использовать отрезки или прямые? Если отрезки, то крайние точки отрезков не являются точками пересечения осей (см. рисунок) и нужно искать ближайшую точку пересечений. Как? Если прямые, то не учитываются ограничения коридоров. И точек пересечение будет больше или они будут одинаковыми и понять какой вес (длина) у ребра графа действительна (не пересекает стену) не получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2014, 00:41 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Решение задачи по нахождению кратчайших путей во вложении, реализовано Дейкстрой и Левитом. Граф строил вручную. Сложность задачи заключается в построение корректного графа по чертежу. Можно предложить следующий алгоритм: 1. Определяем оси коридоров (прямоугольников) в виде координат отрезков. 2. Попарно сравниваем все отрезки, находим пересечения, если они есть, то точка пересечения является вершиной графа. 3. Попарно проверяем все вершины, если они находятся на одном отрезке, то значит между вершинами есть ребро, находим расстояние геометрическим способом. По полученному графу производим вычисления. Есть сложности в реализации данного алгоритма, как математическое, так и относительно качества чертежа (прямоугольники могуд не пересекатся а стыковаться, тогда пересечение осей не будет, хотя прямоугольники фактически пересекаются). Кроме того, конечные точки нужно также подтягивать к коридорам, это тоже задача для размышления. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2014, 13:42 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Сделал вычесление "на лету" через UDF При изменение значений в B2 и C2 маршрут сразу перерисовывается ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2014, 14:08 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, дополняем друг друга по-немногу. Забудьте пока про сложности с уравнениями, это фигня, считайте, что они у вас есть и именно в том виде, как я написал. Сегодня пришла мысь. Предыдущую мою простыню положим в архив, а пока вырисовывается вариант попроще. По сути у нас есть граф, у которого вершины состоят из прямоугольников, надо только этот граф формально построить, т.е. найти последовательность, в которой их соединять. Наши исходные упрощения сильно облегчают построение. Перекрёстков вида "Ж" у нас нет сейчас, есть только Т, Г, |, Х и м.б. "трезубец". Плюс к этому шарики, а там они типа Т. И у нас нет изолированных циклов. Задача такая. Имеем прямоугольники, заданные своими координатами, и шарики, заданные координатами центров. Прямоугольники стыкуются без промежутков, т.е. у них общие боковые стороны. На самом деле прямоугольники могут быть и трапециями, у которых скос небольшой, тогда перекрёстки будут типа "(". Для построения графа ищем соседние прям-ки методом "поиск в ширину". Канва алгоритма простая. 1) Кажем начальный прям-к. Сразу имеем 2 вершины графа на концах прям-ка и дугу между ними. 2) Берём необработанную вершину и задём направление от прям-ка, куда двигаться вдоль срединной оси прям-ка. Рекурсивной процедурой "поиском в ширину" ОБРАБАТЫВАЕМ все соседние с ним прям-ки. Сделать это можно примерно так. 2.1. Поскольку взятая в п.2) вершина лежит на стороне прям-ка, то у неё есть 2 соседние угловые точки этого прям-ка. Одна из них для ВЕРШИНЫ всегда левая, другая - правая. Нумеруем их слева направо. 2.2. Находим все прям-ки, соседние с обрабатываемой стороной. Для этого В цикле для каждой из этих 3-х точек "заметаем" геометрическое пространство в поисках ближайшей стороны соседних прям-ков. 2.3. Устраняем дублирование в найденном наборе. В результате получаем новые дуги и вершины. Заносим их в граф. 2.4. Если прям-к на краю чертежа, то одна вершина графа тупиковая, т.е. "лист". У неё нет других дочерних вершин и нам туда не надо. Этой дуге назначаем бесконечный вес. 2.5. Ну, значительно проще найти соседствующие шарики. 3) Для каждого изолированного цикла алгоритм придётся повторить. Напоминаю, что это всего лишь канва алгоритма. Предлагаю её начать детализировать. Потом стыкуем с программой МихЧ. Кстати, МихЧ писал про соединения встык, у меня это "трезубец", а в случае "|" ширина прям-ков может разниться. Полагаю, что новый алгоритм построения графа лучше тем, что работаем с нестрогими прям-ками, и что в предыдущем надо находить точки пересечения прямых, и иногда склеивать несколько точек в одну вершину графа. В новом варианте склеек может не понадобиться, т.к. вершины графа мы фактически имеем с самого начала. Но это ИМХО. И мне всё же ещё работать надо. Обещанный скан смогу только послезавтра. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2014, 14:11 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Михаил Ч.Сделал вычесление "на лету" через UDF При изменение значений в B2 и C2 маршрут сразу перерисовывается Михаил, спасибо. теперь дело "за малым"... За комментарии отдельная благодарность. Заметил один из маршрутов прокладывается сначала по отрезку в одну стороны (влево) потом на на перекрестке разворачивается на 180° и дальше идет к точке назначения. теперь не могу вспомнить между какими точками. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2014, 21:13 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
[quot Bobgos]Михаил Ч.теперь не могу вспомнить между какими точками. Из "Точки 2" в "Точку 24", не правильно было указано ребро, поправил ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2014, 22:03 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
точнее из 2й в 26ю ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2014, 22:08 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98Bobgos, дополняем друг друга по-немногу. Забудьте пока про сложности с уравнениями, это фигня, считайте, что они у вас есть и именно в том виде, как я написал. Сегодня пришла мысь. Предыдущую мою простыню положим в архив, а пока вырисовывается вариант попроще. поэтому и благодарен вам за помощь - оптимальные решения в большинстве случаев принимаются коллегиально exp98По сути у нас есть граф, у которого вершины состоят из прямоугольников, надо только этот граф формально построить, т.е. найти последовательность, в которой их соединять. Наши исходные упрощения сильно облегчают построение. Перекрёстков вида "Ж" у нас нет сейчас, есть только Т, Г, |, Х и м.б. "трезубец". Плюс к этому шарики, а там они типа Т. И у нас нет изолированных циклов. перекрестков I и трезубец? мне кажется перекрестки по принятым ограничениям могут быть только Г, Т, X Точки пунктов (шарики) - это просто точки прежде всего. exp98Задача такая. Имеем прямоугольники, заданные своими координатами, и шарики, заданные координатами центров.ага - просто точки диапазона vertexexp98 Прямоугольники стыкуются без промежутков, т.е. у них общие боковые стороны. подозреваю, будут ошибкиexp98На самом деле прямоугольники могут быть и трапециями, у которых скос небольшой, тогда перекрёстки будут типа "(". Для построения графа ищем соседние прям-ки методом "поиск в ширину". Канва алгоритма простая. 1) Кажем начальный прям-к. Сразу имеем 2 вершины графа на концах прям-ка и дугу между ними. да, это на последнем моем формулами находил - концы зеленых линийexp98 2) Берём необработанную вершину и задаём направление от прям-ка, куда двигаться вдоль срединной оси прям-ка. Рекурсивной процедурой "поиском в ширину" ОБРАБАТЫВАЕМ все соседние с ним прям-ки. Сделать это можно примерно так. 2.1. Поскольку взятая в п.2) вершина лежит на стороне прям-ка, то у неё есть 2 соседние угловые точки этого прям-ка. Одна из них для ВЕРШИНЫ всегда левая, другая - правая. Нумеруем их слева направо. надеюсь, что правильно понял, что "левая" и "правая" - относительно направления в котором отрезок оси заканчивается,т.е. точки короткой стороны прямоугольников коридоров. тогда можно просто определить короткие стороны прямоугольников коридоров и найти координаты центраexp982.2. Находим все прям-ки, соседние с обрабатываемой стороной. Для этого В цикле для каждой из этих 3-х точек "заметаем" геометрическое пространство в поисках ближайшей стороны соседних прям-ков. нужно задать ограничение для "заметания" - не более погрешности снятия данных чертежа. например, 1/2 ширины коридора. Что значит "заметаем"? exp98 2.3. Устраняем дублирование в найденном наборе. В результате получаем новые дуги и вершины. Заносим их в граф. сначала нужно определить как заметать и потом думать какая вершина будет основной,а какая дублем. подумать о том, как построить новые дуги - что будет связующим элементом.exp982.4. Если прям-к на краю чертежа, то одна вершина графа тупиковая, т.е. "лист". У неё нет других дочерних вершин и нам туда не надо. Этой дуге назначаем бесконечный вес.если есть вершина, то она может быть связана с любым из перекрестков или пунктов, а через одну дугу как минимум с дочерней (или наоборот с parent). Задача подразумевает развитие,поэтому без необходимости границы чертежа предлагаю не использовать. Прямоугольник может быть не на краю чертежа, но тем не менее быть тупиком. Пока не представляю как это реализовать в коде. Может предложите на базе файла Graph4SQL2? exp982.5. Ну, значительно проще найти соседствующие шарики.просто,это если перебором дуги строго по горизонтали/вертикали и в условиях координат с шестизначными числами (и если не округлять с кучей знаков после запятой) подозреваю будет тормоза. Поясните как exp983) Для каждого изолированного цикла алгоритм придётся повторить. Напоминаю, что это всего лишь канва алгоритма. Предлагаю её начать детализировать. Потом стыкуем с программой МихЧ. Кстати, МихЧ писал про соединения встык, у меня это "трезубец", а в случае "|" ширина прям-ков может разниться. правильно понял трезубец - на картинке? exp98Полагаю, что новый алгоритм построения графа лучше тем, что работаем с нестрогими прям-ками, и что в предыдущем надо находить точки пересечения прямых, и иногда склеивать несколько точек в одну вершину графа. В новом варианте склеек может не понадобиться, т.к. вершины графа мы фактически имеем с самого начала. Но это ИМХО. И мне всё же ещё работать надо. Обещанный скан смогу только послезавтра. а "2.3. Устраняем дублирование в найденном наборе." ЭТО разве не склеивание нескольких точек в одну вершину? Ребята, жду выходных. у самого отчетные - не до... exp98Потом стыкуем с программой МихЧ. Предлагаю на базе программы МихЧ. тестовый модуль сделать для кода и предложить: а) "Рекурсивной процедурой "поиском в ширину" ОБРАБАТЫВАЕМ все соседние с ним прям-ки" я к сожалению совсем не программер, поэтому путаюсь в терминах, а уж код получается кривой и уж очень сложный (видимо заметили) . Б) Рассмотреть другой подход к формированию исходных данных - коридоров. Точки вершин понятно - выбрал из списка, ткнул в чертеж и подписал, или заполнил прочие доп. свойства inputbox или формой. Коридоры в dwg проще обрисовать, но теоретически можно вставлять ромбы (квадраты, повернутые на 22,5° ) в местах поворота в каждом перекрестке, что позволит проложить через один перекресток 4-ре несоосные ломанные, т.е графически отобразить одновременно 4-ре маршрута одного вида. в случае с ромбами сложнее будет с пониманием в каких местах будут повороты. Будут пропуски и соответственно неверные трассы. коридоры обводить надежнее. Можно минимизировать ошибки при вводе, проверяя, существует ли вводимая координата одной из точек коридора и обязательно соблюдая сопряжение областей. т.е. разрешить (точнее заставить пользователя подтвердить) запись координат только первой снимаемой области и задать ограничения - чтобы коридоры вносились при первом съеме координат последовательно сопряженные. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2014, 22:19 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Михаил Ч., как твое мнение по поводу ромбов предыдущего поста? придется включать синусы/косинусы Может подумать об упрощении исходной задачи - поочередной прорисовке одной трассы. Конечно цель была другая.... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2014, 22:24 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, под трезубцем я имел ввиду множественные разветвления (греческая "Пси"), не важно. В результате родился Вариант 3. Плагая,что почти окончательный при имеющихся упрощениях. В отличие от Вар.2. соединяем не прямоугольники, а их срединные отрезки,тогда всё предельно упрощено. Набросал рисунок. С этого места я бы уже начал писать прогу. Хочется верить, что схемой предусмотрено большинство ситуаций. Из видимых мне недостатков: в случае "кривых" коридоров и стыков отрисовка маршрута становится отдельной задачей. Насчёт ромба - ну тогда можно треугольник. И мой совет к проге. При неясности в реализации типа "найти пересечение" и т.п. пишите сабрутину-пустышку и забывайте о ней до отладки. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2014, 13:06 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, немного пояснений. По Варианту 3 допускается, что прям-ки необязательно стыкуются,поэтому я нарисовал нечто вроде синапсов. Предусматривается несколько проходов. Красные окружности - это для текущей обрабатываемой вершины мы ишем соседей. Если в окрестность никто не попал,то вершина терминальная, т.е. конечный лист. Однако эта дуга необязательно тупик,т.к. после прохода по всей связной компоненте останутся изолированные компоненты. Их присоединяем похожим способом - зелёные окружности. В эти окретсности может попасть либо вершина,либо сторона. Если вершина,то ихорошо. У них д.б. радиус побольше. Процедура называется "найти ближайшую точку на отрезке среди всех отрезков". Синие отрезки - это аналогичная процедура только от шариков. И наконец отдельный случай - когда шарик в конце коридора. Т.к. заранее неизвестно у какого коридора,то рассматрриваем все терминальные вершины, оставшиесяпосле 1-го и 2-го прохода. У них нарисованы серые отрезки (но я не увсех нарисовал). К ним применяем процедуру присоединения шариков. Склеивать или не склеивать совпадающие вершины - я бы не стал,даже если их координаты равны. Вершин получится сильно обольше, чем в идеальном случае. Возникающие в результате артефакты переносятся на этап отрисовки маршрута. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2014, 16:56 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Если учесть, что прямоугольники (коридоры) всегда вертикальны или горизонтальны, тогда можно упростить задачу и найти более простое решение, подумаю над реализацией ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2014, 10:01 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Михаил Ч., а если в исходном плане огрехи? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2014, 12:04 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, вот я и проверил Вариант 3 на простом лабиринте как было в первом эксел-файле. Сначала некотоые результаты меня удивили, поэтому счёл нужным лабиринт нарисовать. Страница во вложении. Файл будет тормозить, т.к. использовал условное форматирование. Для большей скорости формулы превратил в значения. Масштаб 1 : 500, впрочем внизу я дал условные обозначения. На рисунке есть огрехи из-за целочисленности и отрицательных координат. И сам план конечно вверх ногами. Все координаты точек рассчитаны формулами, так что алгоритм годный. Кстати вычислял в целых значениях. Такая точость не существенна. Некоторые выводы по эксперименту. 1) Из 3-х проходов алгоритма я проделал только 1-й проход,т.к. из рисунка мне очевидно, что остальные 2 прохода сработают без проблем: присоединение изолированных прям-ков и шариков. 2) 1-й проход дал мало компонент графа. Существенную часть дадут 2-й и 3-й. Это зависит от того как разбивать каридоры на прям-ки. Было бы лучше для 1-го прохода ограничивать прям-ки "от перекрёстка до перекрёстка". Например сейчас имеем один длинный горизонтальный прям-к во всю ширину плана. В результате вершина АО-45 находит только одну соседнюю АМ-49. Здесь перекрёсток типа Х, и я не ожидал, что прям-ки дают тип "два состыкованных Т-типа". Т.е. перекрёсток коридоров Х-типа отличается по типу от стыковки 3-х прям-ков. 3) Присоединение шарика как в ячейке DL-36. Здесь к нему подходят 2 коридора. Этот нюанс я не описывал, но если присоединять не терминальные вершины к шарику, а наоборот, то всё сработает 4) Ну и конечно достаточны существенны фактические расстояния между объектами. Я основывался на максимальной ширине коридора, а правильнее будет на адаптивной величине. П.С. Теперь мы с МихЧ можем открыть контору и выполнять такие задачи, если даёте нам координаты точек. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2014, 12:08 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, ответьте на такие вопросы: 1. вот эти прямоугольники, как я понял стены, они каких размеров бывают? 2. на какое расстояние по вертикали и горизонтали они могут быть перемещены при редактировании? или программа, в которой Вы рисуете план, это вида обычного PAINTа? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 08:17 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
HandKot, на мой взгляд, прям-ки - это коридоры, их внутренность. А программа скорее всего автокад либо нанокад, ибо формат DWG. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 13:12 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, поскольку вычисление пути Вам подогнали, обещанный мною скан не потребуется. За мной оставалось расстояние от точки до отрезка, где отрезки - это наши срединные линии. У нас отрезок задан координатами концов Z1= (x1, y1) и Z2= (x2, y2). Процедура рассчёта сначала смотрит, попадает ли точка в границы координат отрезка. Если НЕТ, то вычисляем расстояние до ближайшего конца отрезка. Если ДА, то вычисляем как расстояние до прямой, используем формулу ниже. Удобно задать прямую в векторном параметрическом виде: Z= Z1 + R*t, где t - числовой параметр, действительное число, его вычислим и получим место, где на прямой находится ближайшая точка. Z= (x, y) - вычисляемые координаты прямой Z1= (x1, y1) - координаты известной точки на прямой, в нашем случае= один из концов отрезка. R= (rx, ry)= (x2-x1, y2-y1) - направляющий вектор прямой, в нашем случае направление ко второму концу отрезка. В реализации могут быть варианты. Для примера: Private TYPE COORDIN x as LONG y as LONG END TYPE DIM Z as COORDIN, Z1 as COORDIN, Zт as COORDIN, R as COORDIN ................. call myDystance( .............) ................. SUB myDystance(Zт as COORDIN, Z1 as COORDIN, R as COORDIN, d as LONG, Z0 as COORDIN, flag as INTEGER) - Входные значения: Zт=(Хт,Ут) - координаты точки Z1 и R - коэффициенты уравнения прямой. Возвращает: d= расстоянию Z0 - координаты ближайшей точки на отрезке, которая, если требуется, становится новой вершиной графа, либо специальный flag, что ею является одна из вершин отрезка, тогда новых вершин графа не возникает. Координаты ближайшей точки Z на прямой: Z= Z1 + R*t - сюда подставить значение t и округлить до целого. для к-ты Х, tx= (Хт - x1) / (rx + ry ) для к-ты Y, ty= (Yт - y1) / (ry - rx ) Расстояние до прямой: Dim dx as double, dy as double, d2 as double dx= - ry * tx dy= rx * ty d2= sqr( dx*dx + dy*dy) и округлить до целого. d= d2 End Sub За опечатки извините. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 13:17 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98HandKot, на мой взгляд, прям-ки - это коридоры, их внутренность. А программа скорее всего автокад либо нанокад, ибо формат DWG. мне показалось по другому. Просто донесу свою версию построения графа: Пусть ширина коридора не может быть меньше и кратна "условной единицы". Пусть ширина и толщина стен не может быть меньше и кратна "условной единицы". Пусть размер помещения NxM условных единиц Тогда создаем граф для помещения с количеством вершин NxM и размером вершины 1x1 "условная единица". У каждой вершины получается от 2 (по углам) до 4 (ни у края, ни в углах) связанных вершин. После этого берем стену (прямоугольник) и выкидываем из графа те вершины, которые попали внутрь этого прямоугольника и так для всех стен. В результате мы получим граф коридоров. Поиск маршрута в нем уже дело техники. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 13:53 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
ошибка у меня. Какие нафиг tx и ty ? одно t для всех компонент вектора. Иф ормулу неправильные. На днях исправлю, они чуть сложнее. exp98для к-ты Х, tx= (Хт - x1) / (rx + ry ) для к-ты Y, ty= (Yт - y1) / (ry - rx ) Расстояние до прямой: Dim dx as double, dy as double, d2 as double dx= - ry * tx dy= rx * ty dx= ry * |t| dy= rx * |t|, тк t м.б. < 0. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 16:49 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
HandKot, не понял вот этот посыл "размер помещения NxM ". чем помещение оличается от коридора? А почему тогда у меня в последнем рисунке был один прямоугольник во всю ширину плана? - как раз коридор был. И средние точки в коридоры попали - противоречий не увидел,и шарики во вне коридоров. Ну просто координаты можно сравнить. А вообще идея хорошая: формально вычеркнуть лишние связи. Граф только огромный будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 16:59 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Кажется теперь правильно. У себя проверил, а как перенёс сюда?.. 1) Z0= Z1 + R*t - в векторной форме, сюда подставить значение t и округлить до целого, к-ты ближней т. на прямой. Z0 = (X0, Y0) t= ( rx * (Xt - X1) + ry * (Yt-Y1) ) / ( rx^2 + ry^2 ) 2) Расстояние до прямой: Dim dx as double, dy as double, d2 as double dx= Xt - X0 dy= Yt - Y0 d= sqr( dx^2 + dy^2 ) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 17:50 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
HandKotBobgos, ответьте на такие вопросы: 1. вот эти прямоугольники, как я понял стены, они каких размеров бывают? 2. на какое расстояние по вертикали и горизонтали они могут быть перемещены при редактировании? или программа, в которой Вы рисуете план, это вида обычного PAINTа? 1. прямоугольники которые помещения могут быть самых разных размеров Например: 2000х2000 или 20000х18000 Коридоры по длине неограничиваются. Ширина 800,1000, 1200, 1500, 1800, 3000, 3500, и так далее до 6000мм, а может и больше. ОБласти (теже коридоры внутри помещеений совсем разнообразны, но обычно не более 3000мм. 2. на любое. Задача - универсальный инструмент. взяли dwg прорисовали запуская из excel прямоугольники - коридоры, снимая координаты, указали точки - источники/назначения и рисуем что хотим excel. А рисуем мы трассы - полилини 3. программа: нанокад. тоже можно делать в автокад ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2014, 01:24 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98Bobgos, поскольку вычисление пути Вам подогнали, обещанный мною скан не потребуется. За мной оставалось расстояние от точки до отрезка, где отрезки - это наши срединные линии. У нас отрезок задан координатами концов Z1= (x1, y1) и Z2= (x2, y2). Процедура рассчёта сначала смотрит, попадает ли точка в границы координат отрезка. Если НЕТ, то вычисляем расстояние до ближайшего конца отрезка. Если ДА, то вычисляем как расстояние до прямой, используем формулу ниже. Удобно задать прямую в векторном параметрическом виде: Z= Z1 + R*t, где t - числовой параметр, действительное число, его вычислим и получим место, где на прямой находится ближайшая точка. Z= (x, y) - вычисляемые координаты прямой Z1= (x1, y1) - координаты известной точки на прямой, в нашем случае= один из концов отрезка. R= (rx, ry)= (x2-x1, y2-y1) - направляющий вектор прямой, в нашем случае направление ко второму концу отрезка. В реализации могут быть варианты. Для примера: Private TYPE COORDIN x as LONG y as LONG END TYPE DIM Z as COORDIN, Z1 as COORDIN, Zт as COORDIN, R as COORDIN ................. call myDystance( .............) ................. SUB myDystance(Zт as COORDIN, Z1 as COORDIN, R as COORDIN, d as LONG, Z0 as COORDIN, flag as INTEGER) - Входные значения: Zт=(Хт,Ут) - координаты точки Z1 и R - коэффициенты уравнения прямой. Возвращает: d= расстоянию Z0 - координаты ближайшей точки на отрезке, которая, если требуется, становится новой вершиной графа, либо специальный flag, что ею является одна из вершин отрезка, тогда новых вершин графа не возникает. Координаты ближайшей точки Z на прямой: Z= Z1 + R*t - сюда подставить значение t и округлить до целого. для к-ты Х, tx= (Хт - x1) / (rx + ry ) для к-ты Y, ty= (Yт - y1) / (ry - rx ) Расстояние до прямой: Dim dx as double, dy as double, d2 as double dx= - ry * tx dy= rx * ty d2= sqr( dx*dx + dy*dy) и округлить до целого. d= d2 End Sub За опечатки извините. вот это дело. математика 7 класс давно забыта, а тут... надо пробовать тогда будут возникать вопросы. жду выходных, ибо спать элементарно не успеваю. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2014, 01:28 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
HandKotexp98HandKot, на мой взгляд, прям-ки - это коридоры, их внутренность. А программа скорее всего автокад либо нанокад, ибо формат DWG. мне показалось по другому. Просто донесу свою версию построения графа: Пусть ширина коридора не может быть меньше и кратна "условной единицы". Пусть ширина и толщина стен не может быть меньше и кратна "условной единицы". Пусть размер помещения NxM условных единиц Тогда создаем граф для помещения с количеством вершин NxM и размером вершины 1x1 "условная единица". У каждой вершины получается от 2 (по углам) до 4 (ни у края, ни в углах) связанных вершин. После этого берем стену (прямоугольник) и выкидываем из графа те вершины, которые попали внутрь этого прямоугольника и так для всех стен. В результате мы получим граф коридоров. Поиск маршрута в нем уже дело техники. да нужно задуматься об ограничениях. 1. Пусть ширина коридора не может быть меньше и кратна "условной единицы". верна первая часть не может быть меньше 500 кратна - нет. т.к. прорисовывается по чертежу, который не проверяется на кратность. если конечно округлить, то можно принять толщину стены - 250 как шаг (точнее лучше 100 если учитывать сэндвич), после которого следующая проверяемая точка уже пересечет границы коридора -прямоугольника. 2. "Пусть ширина и толщина стен не может быть меньше и кратна "условной единицы". " ширина -нет. возможны уступы для Z с любым расстоянием сдвига. Но проверить можно ширина и толщина не менее 100мм. Значения можно внести в константы или заложить в конфигурируемые параметры модели 3. Пусть размер помещения NxM условных единиц помещения - любого размера. Можно при съеме координат накладывать на общую сетку, т.е. применять те самые условные единицы. это несложно. Зачем нам помещения? заново чертить все помещения не требуется, более того трасса может пролегать внутри помещения по виртуальным коридорам, которые прочерчиваются (при съёме модели чертежа в эксель) между оборудованием.. мы не говорим о модели всего чертежа. Размеры файлов могут достигать 100Мб, сложно будет. В слоях вечный беспорядок..... ИМХО проще всего обрисовать прямоугольниками коридоры для прокладки маршрутов. Если сложно построить граф по прямоугольникам, лучше прочертить сразу граф осевых линий и определить пересечения этих линий. но это не даст возможность прочерчивать несколько трасс вдоль осевых линий без риска начертить трассы по стене или вообще по помещению за стеной. Например: коридор 800, по нему проходит 4 трасс, которые для восприятия должны иметь толщину не менее 150-200, т.е если будет минимальный отступ, 50, то как миним одна из трасс выйдет за пределы коридора. Но пока чертим по осевым.... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2014, 01:51 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98Кажется теперь правильно. У себя проверил, а как перенёс сюда?.. 1) Z0= Z1 + R*t - в векторной форме, сюда подставить значение t и округлить до целого, к-ты ближней т. на прямой. Z0 = (X0, Y0) t= ( rx * (Xt - X1) + ry * (Yt-Y1) ) / ( rx^2 + ry^2 ) 2) Расстояние до прямой: Dim dx as double, dy as double, d2 as double dx= Xt - X0 dy= Yt - Y0 d= sqr( dx^2 + dy^2 ) Путает немного. Можно файлик с этим примером. Применяемые обозначения верно поняты: Z= (x, y) - вычисляемые координаты прямой. Z(x,y) - это точка лежащая на прямой которая проверяется ? Zт=(Хт,Ут) - координаты точки, т.е тоже самое: Z(x,y) - это точка лежащая на прямой которая проверяется ? Z0 - координата искомой точки (или проверяемой в текущий момент), , т.е тоже самое: Z(x,y) - это точка лежащая на прямой которая проверяется ? Z1= (x1, y1) - координаты известной точки на прямой, в нашем случае= один из концов отрезка. Это понятно R - коэффициент 2 (k2) R= (rx, ry)= (x2-x1, y2-y1) - направляющий вектор прямой, в нашем случае направление ко второму концу отрезка. где x и y кратны "условной единице" толщины стены, например. НО мы точно не попадем именно в точку получается: Z0 = (X0, Y0) - я понял как то что искомая точка устанавливается в координаты x=0? y=0? но ведь нам нужно найти x и y! t= ( rx * (Xt - X1) + ry * (Yt-Y1) ) / ( rx^2 + ry^2 ) t - это то самое "условное значение" приращения вектора? что такое: rx Xt X1 ry Yt Y1 ??? Сори за невосприятие. А можно код с комментариями переложить в файл который сформирует хотя бы в черновичке граф? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2014, 02:13 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Ну да, толщину стенки принимаем в пол кирпича)) Bobgos, прошу не смешивать алгоритмы. Разница принципиальная. Определитесь с вариантом и тогда уже уточняйте, может я больше не понадоблюсь. Я сужу по цитате: R= (rx, ry)= (x2-x1, y2-y1) - направляющий вектор прямой, в нашем случае направление ко второму концу отрезка. где x и y кратны "условной единице" толщины стены, например. НО мы точно не попадем именно в точку Если это суждение основано на моём рисунке, то оно в корне не верно, т.к. я вычислил всё из исходных координат и только затем нарисовал, а чтобы уместить на листе, взял масштаб 1:500, стенки вообще руками закрасил для наглядности. Поэтому попадём именно "в точку". И для случая HandKot клетки - это только вершины графа, но каждая клетка имеет конкретные координаты на плане. Итак, на сегодня имеем 2 алгоритма построения графа. Графы получатся совершенно разные. Общее у них то, что короткие пути по ним будут похожи. HandKot 1) HandKot , усовершенствую немного - строим сетку на плане , сетка с некоторым шагом. Кратность шагу не требуется (например задаём параметром для каждого плана ~ 1/100). Координаты задаются для помещений , которые удобнее представлять как набор прямоугольников, + как-то надо задать пространство , чтобы шарики были связаны с коридорами, иначе граф не найдёт к ним пути. "Виртуальные коридоры" придётся дополнительно оцифровывть снаружи прям-ками. Далее вычеркнуть все клеточки, которые полностью либо частично перекрываются с помещениями. Из оставшихся клеток сам собою остаётся связный граф с дугами длиной в 1 шаг. Легко программировать, если всё прямоугольное. Линии могут оказаться не прямыми, а ступеньчатыми, но это зависит уже от алгоритма построения пути, как он выбирает минимум. Это ИМХО. Мой 2) Мой Вариант 3, на идее распознавания, а в нём всегда возможны артефакты. Здесь коорд-ты задаются для коридоров и необязательно покрывают всю коридорную площадь. Прогать сложнее. Поэтому требует визуальной проверки для возможной корректировки. Теперь по сабрутине, здесь чуть больше, чем 7-й класс. В принципе Вам достаточно ФОРМАЛЬНО подставить значения в фурмулы. Для примера сделайте это сперва на бумаге. Ещё раз смотрите сюда. Это уже имеем для процедуры: --------------- У нас любой отрезок задан координатами концов Z1= (x1, y1) и Z2= (x2, y2) Zт=(Хт,Ут) - координаты точки, от которой измеряем расстояние до прямой, представленной отрезком. В Варианте 3 - эта точка либо центр шарика, либо конец срединного отрезка. Это вычисляем в процедуре: ------------------------------------------- Z0 = (X0, Y0) - ближайшее место на отрезке. Геометрически это точка пересечения 2-х перпендикулярных прямых. Либо ею будет один из концов отрезка, смотря что ближе. Узнать это мы сможем только после нахождения т. Z0 . Далее вычисляем: (rx, ry)= (x2-x1, y2-y1) t= ( rx * (Xt - X1) + ry * (Yt-Y1) ) / ( rx^2 + ry^2 ) Подставляем значение t сюда: X0= x1 + rx*t Y0= y1 + rx*t Далее вычисляем: dx= Xt - X0 dy= Yt - Y0 d= sqr( dx^2 + dy^2 ) - искомое расстояние. По т. Z0 проверяем, выходит ли она за отрезок (здесь код ......). IF "выходит" THEN находим ближайший конец отрезка IF "не выходит" THEN d - искомое расстояние. END SUB П.С. Выше почти код, буквы только убрать. Кто хотел бы, давно бы сюда выложил, а при такой писанине я отдыхаю, а не работаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2014, 16:38 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98 усовершенствую немного - строим сетку на плане , сетка с некоторым шагом. Кратность шагу не требуется (например задаём параметром для каждого плана ~ 1/100). Координаты задаются для помещений , которые удобнее представлять как набор прямоугольников, + как-то надо задать пространство , чтобы шарики были связаны с коридорами, иначе граф не найдёт к ним пути. "Виртуальные коридоры" придётся дополнительно оцифровывть снаружи прям-ками. Далее вычеркнуть все клеточки, которые полностью либо частично перекрываются с помещениями. Из оставшихся клеток сам собою остаётся связный граф с дугами длиной в 1 шаг. Легко программировать, если всё прямоугольное. Линии могут оказаться не прямыми, а ступеньчатыми, но это зависит уже от алгоритма построения пути, как он выбирает минимум. Это ИМХО. Вы правильно поняли мою идею. Я просто, еще со школы, плохо доношу свои мысли в повествовательной форме ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2014, 08:05 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, Давайте пока доведём до конца сабрутину. В ней у нас осталось проверить, куда проектируется перпендикуляр к прямой: внутрь отрезка или снаружи. Вспоминаем обозначения точек: Z1 и Z2 - концы отрезка Zt - точка вне прямой Z0 - её мы токо-токо нашли. Вычисляем 3 расстояния: d0 - длина отрезка d1 = расст(Z1, Z0) d2 = расст(Z2, Z0) Затем вычисляем: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Или неправильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2014, 00:08 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98, синтаксис поправил, но не очень помогло. к чему приклеить сие... к перебору каждого направления от точки Z2? сверьте, верно ли воспринято описания на картине. Вопросы: 1. Встал остро вопрос с чем сравнивать: т.е. отрезок CD - он имеется и их много. но во первых - сравнив вхождение точки Zt в отрезок Z1Z2 если Zt=Z2, успех и выход, во вторых если съеме моделей коридоров, сразу будут пересечения, то Z0 будет находиться на Z1Z2. Выбирать для перебора отрезки CD, только которые перпендикулярны Z1Z2? тогда как быть со смещенными параллельными осями коридоров? 2. Так я понимаю, что предлагается удалять точки Z2, если Zt в пределах толщины стены. Т.е. заменить отрезок Z1Z2 на отрезок Z1Zt. Верно? Но тогда а) сначала понять какую точку менять, если исходные данные - прямоугольники. Концы осевого отрезка оси коридора найти можно по 4-м точкам коридора, а вот наоборот - не выходит б)и даже если не вносить изменения в модель коридоров(прямоугольников) - нужно снова проверить направления от точки Z2? 3 Самое главное - что откуда вызвать. Пример кода VBA в Эксел будет самым полезным советом. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2014, 07:17 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, вечер добрый! Поверьте, не это Вам сейчас важно. Важно понимать схему работы Варианта 3, коль скоро будет использоваться он. Вы действительно полагаете, что по программе разберётесь, не поняв алгоритма? Или Вы тот самый Том Сойер, которому надо было покрасить забор? Мне код сидеть писать 3-5 суток предлагаете? Скажу сейчас только 2 вещи: 1) Сабрутина всё же требует доводки, в т.ч. и по причине того, как именно она будет встраиваться в схему. 2) Bobgosк чему приклеить сие... к перебору каждого направления от точки Z2? Ваш рис. почти не о том. Забудьте о направлениях. Мы строим граф не последовательно в каком-то направлении, а путём перебора всех отрезков и шариков по принципам "близости" и "перебора в ширину". Это основывется на сделанных допущениях о природе прям-ков. По Вар.3 предполагается 3 прохода: У нас есть все срединные линии но нет графа. Начинаем его строить. 1. Начинаем с удобной срединной линии. Т.о. получаем сразу граф из 2-х связных вершин. Затем присоединяем к графу ближайшие срединные линии (из оставшихся на даный момент). К ним присоединяем следующие ближайшие. И т.д., пока что-то находим достаточно близко. 2. Вне графа останется множество свободных срединных линий, т.к. они "далеко" от вершин, которые уже в графе. Поэтому скорее всего они будут присоединены к внутренности отрезка, создавая новую вершину графа, а не к имеющейся вершине графа. В этом месте использ. сабрутину. Zt - здесь ВСЕ концы НЕприсоединённых срединных отрезков. Z1 и Z2 - концы всех присоединённых срединных отрезков. Эти множества точек НЕ пересекаются. Как распалагаются взаимно [Z1, Z2] и Zt заранее неизвестно. 3. Предполагается, что в 1-2 в граф втянули все срединные отрезки. Осталось присоединить шарики. В этом месте также использ. сабрутину. Но! Zt - здесь ВСЕ НЕприсоединённые шарики. [Z1 , Z2] - все дуги графа, они же и срединные отрезки. Мы немного предполагаем как распалагаются взаимно [Z1, Z2] и Zt. ("серые" отрезки на моём рис. НУЖНО не использовать, п.3 можно модифицировать, но об этом позднее, после понимания алгоритма). Да, и постарайтесь не смешивать понятия "дуга графа" и "срединный отрезок". После присоединения к графу срединный отрезок становится дугой. Однако от шарика до ближ. срединного отрезка строим новую дугу и новй отрезок, но он уже НЕ срединный, если там не было прям-ка. Bobgos если исходные данные - прямоугольники. Концы осевого отрезка оси коридора найти можно по 4-м точкам коридора, а вот наоборот - не выходит Как же нет, ежели прям-к задан? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2014, 19:46 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, начать рисовать блок-схемы будет хорошим советом. Не держите всё в голове. О, идея! Давайте начнём с конца, с 3-го прохода алгоритма. Исходные: У нас построен граф по всем прям-кам. Этот граф оказался связным. А шарики ещё не присоединены. Ваша блок-схема алгоритма? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2014, 20:00 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98Bobgos, начать рисовать блок-схемы будет хорошим советом. Не держите всё в голове. О, идея! Давайте начнём с конца, с 3-го прохода алгоритма. Исходные: У нас построен граф по всем прям-кам. Этот граф оказался связным. А шарики ещё не присоединены. Ваша блок-схема алгоритма? учтем принятые ограничения и правила: а) шарики - одна точка, которая по ближайщему x или y направлению можно связать с одним из осевых отрезков (или коридоров). б) все осевые отрезки строго вертикальны z1(x) = z2(x) или горизонтальны z1(y) = z2(y) Первое что пришло в голову: 1. Перебираем точки A(x,y)- *шарики) точнее их центры. 2. В каждом цикле запускаем алгоритм поиска минимального расстояния до ближайшего отрезка оси коридора для чего 2.1. перебираем направления (+x, +y, -x,-y) 2.2. для каждого ищем ближайшее отклонение от перпендикулярного отрезка дельтаX, дельтаY 2.2.1. сначала установив дельтаYmin=0, дельтаXmin=0 2.2.2. далее подойдет case для вектора по x или y для +x, -x ищем минимальное расстояние (дельтаXmin) до отрезков у которых z1(y) = z2(y). А для +y,-y ищем мин. для отрезков z1(x) = z2(x). например для +-x: дельтаX = iif(Z1(x)>A(x), Z1(x)-A(x),-Z1(x)+A(x)) 'нужно подправить для дельтаYmin= iif(and (дельтаX <> 0, дельтаX<дельтаXmin), дельтаY, дельтаYmin) нужна переменная - минимальное расстояние по x или y и индекс осевого отрезка Z1Z2 для которого расстояние по вектору минимально. и пара условий проверки отрезка, например для вектора по x: z1(y) = z2(y) 3. добавляем ребро графа где первая точка A(x,y), вторая точка графа для ABS(дельтаX)<ABS(дельтаY) это точка B(x=Z1(x), y=A(y)) для ABS(дельтаX)>=ABS(дельтаY) это точка B(x=A(x), y=Z1(y)) 4. ЗАПИСЫВАЕМ ребро на лист графа для текущего потроения .... запускаем поиск пути ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2014, 23:16 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
BobgosдельтаX = iif(Z1(x)>A(x), Z1(x)-A(x),-Z1(x)+A(x)) чувствую = найдется ближайшее расстояние до отрезка Z1Z2 для которого A(y) выходит за пределы диапазона Z1(y)...Z2(y) - это будет еще одним добавляемым условием. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2014, 23:21 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos Давно собирался спросить. Было бы хорошо, если прям-ки можно было нарисовать почти до центра шарика. Иначе придётся существенно использовать 2-ю точку, указывающую направление от шарика к коридору, о которой Вы говорили в одном из первых сообщений (см. замечание в конце). Гы)) теперь я недопонял: авторминимального расстояния до ближайшего отрезка оси коридора Но это неважно, предлагаю свой вариант. Допущение (б) я вообще не использую. П.п. с 1. по 4. предлагаю превратить в следующее. Посмотрим на единственный пример плана. На нём видно, что большинство шариков расположены удачно. а) А именно сидят с боку и близко от нужного ПРЯМ-КА. В этом случае вместе с шариком появится дополнительная вершина графа, лежащая на осевом отрезке, а дуга раздробится на 2-е. б) Ещё есть шарик, который сидит близко от торца нужного ПРЯМ-КА. В этом случае новой вершиной графа будет только шарик. Т.к. шарики КАСАЮТСЯ нужной стороны нужного КОРИДОРА, то на этом плане ближайшей стороной будет сторона именно нужного ПРЯМ-КА. И если забыть про замечание в конце, то ближайшим осевым отрезком будет именно нужный. Формально я вижу так: 1. Цикл Для каждого шарика 1.1. Берём центр шарика. 1.2. Вычисляем набор расстояний от него до всех осевых отрезков. Расстоянием будет либо расст. до внутренней т. отрезка, либо до одного из концов отрезка. 1.3. Среди вычисленных расстояний выбираем "наименьшее" расстояние, и берём отрезок для которого это выполняется. В принципе таких отрезков может оказаться несколько. На плане это случай (б), но вдруг будет и (а) тоже. 1.4. Цикл Для каждого найденного отрезка 1.4.1. В зависимости от того, как взаимно располагаются шарик и найденный отрезок, 1.4.2. Если ближайшая точка внутри отрезка, ТО обрабатываем случай (а). CALL procedur1() 1.4.3. Если ближайшая точка есть конец отрезка, ТО случай (б). CALL procedur2() Конец цикла 1.4. Конец цикла 1. 2. Контрольные проверки, что все осевые отрезки и шарики сидят в графе, что граф связный и т.д. 3. Таки да, "запускаем поиск пути". Есть принципиальные возражения, поправки? Замечание. Да, для произвольного плана есть шансы, что если рядом с шириком за углом будет коридор, который значительно Уже нужного нам коридора, то можно ошибочно выбрать узкий. Но если в алгоритме заменить "расстояния до осевых отрезков" на "расстояния до сторон прям-ка", то в большинстве случаев алгоритм выберет то, что надо. Предлагаю сейчас не делать эту замену, а сделать её после написания всего. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 17:38 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Предлагаю некую рыбу для начала. В макросе попробуйте разобраться с назначением массивов, которые описаны как PUBLIC. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 18:03 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Более свежая рыба, более приблИженная к последним пунктам 1,2,3,4. Чего в ней не хватает для полноты? Предыдущая теперь не первой свежести, можнобы и удалить. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2014, 00:06 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Вот улучшенная версия. По сравнению с предыдущим файлом поменял местами некоторые мелкие функциональности. Во всяком случае реализованы низкоуровневые процедуры и можно легко заносить точки в массив POINTS(), и т.о. можно проверить эту часть концепции на вшивость. При этом граф заполнять и необязательно, т.к. он не используется. В конце поместил группу функций для красивой работы с координатами точек - код теперь компактней. Предыдущий файл можно выкинуть. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2014, 23:24 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
А здесь координаты: концы отрезков и шарики. Рядом текст выражения, чтобы копи/вставка прямо в эксэл ... и можно проверять. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2014, 00:57 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
вложение здесь ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2014, 00:57 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Ну вот, доделал пример 3-го прохода. Угрохал весь день. В ходе отладки я пришёл к выводу, что 1-й и 2-й проходы реализуются очень похожим способом, так что самая существенная часть сделана. Конечно, для полноты ещё будут изменения, например уже есть дублирующие друг друга процедуры, а так - годится. Как всегда всё предыдущее можно выкинуть. Исходные отрезки и шарики на листе Лист1. Для него служебный лист Т. Диапазон координат задан в константах макроса. Результат графа см. на листе граф. Поскольку 1-й и 2-й проходы не имитировал, то и начальный граф был пустой, так что не удивляйтесь, что почти все вершины изолированы дргу от друга. И тут как раз наглядно видно, что в ходе вычислений ДУГА может дробиться и исчезать, при этом ОТРЕЗОК в массиве каким был, таким и остался. Зато появились новые точки, ставшие вершинами графа. Я обвёл рамкой 3 области, идущие подряд: - концы отрезков - шарики - вычисляемые точки присоединения шариков, если они новые. И да, значения в графе сейчас = расст. между точками либо 0, если точки не связаны. а для стыковки с нахождением пути, потребуется в дальнейшем заменять 0 на бескон-сть, но контекстная замена заменит также и правильные 0 - это надо в макросе менять. Ну вот, есть материал для развития. Взамен поделитесь, какими макросами экспортировать данные из dwg? Изучать неохота. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2014, 13:29 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Ну просто не знаю, с первого раза файл не крепится, уже не первый раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2014, 13:33 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98Ну просто не знаю, с первого раза файл не крепится, уже не первый раз.а) включи "быстрый ответ" или б) присоединяй файл после предпросмотра сообщения ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2014, 13:35 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Shocker.Pro, да-да, так и показалось, что просмотр сбивает. Или наверно можно без просмотра. Bobgos, если ещё интересуетесь, фактически готово. Только алгоритм пока не очень умный как предполагалось, зато программа закончена малыми усилиями. Здесь ещё есть недоделки - некотрые полезные дуги не создаются, но это легко доработать. Жду Ваших вопросов. Я приложил картинку графа по исходным данным, нарисовано автоматом, не мною. Здесь только топология, без расстояний. Читать её надо так. Номера вершин 1 - 42 - это концы отрезков 43 - 71 - шарики 72 - ... - новые точки, присоединения шариков, стыковки отрезков и т.д. У них могут быть нулевые расстояния, но на рисункеэто конечно не отображено. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2014, 15:21 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Всех с наступающим НГ и каникулами! Не сочтите маньяком. Для проверки нарисовал последний рисунок: коридоры, дуги графа и шарики, из которого сразу увидел ошибки. Они технические, найдём и исправим. В след. году. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2014, 19:46 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Ну ты даёшь! Спасибо огромное. Шампанского к Новому году точно надобно. Последний рисунок уже в dwg? Выложи обновление xls. Глядя на картинку, возникает подозрение что ошибки не только технические. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2014, 05:06 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Ох, и надоело же простыни писать( Рисовал в PHP, т.к. нанокад мне осенью активационный код вовремя не дал, и я от них отказался. Просто я хелп эксэла не ставил, а методом тыка графику не нащупал, в инет за справкой - только время терять было. Теоретически могу по фтп сразу заливать рисунок или данные вам куда-нить в папку на сайте. Сейчас в эксел формируется текст программы рисовалки на PHP, а можно и для автокада, если напишете её текст. Об ошибках. Те, что вижу я , предвиделись, но я не ожидал, что они все вылезут ) Я писал, что не сделаны умные проверки, в основном это обработка "синапсов", 3-х проходов вместо 2-х и новые торцевые отрезки на терминальных вершинах. + настройка радиуса окрестности. В общем, макет программы получен. В результате сейчас: 1) Ищется абсолютный минимум вместо нескольких ближайших. Но его обрабатываю с ошибкой. Это программистская ошибка. Её видно по Г-образным линиям у нижних шаров - ошибочное присоединенние к вертикальной осевой линии вместо конца отрезка. Остальное - это ошибки упрощёной методики. 2) Как раз на виртуальных коридорах сидит шар - перекрёсток типа Y не обработан. Здесь граф к шару пойдёт через стенку что ли? Нет запрета на то, что в этом месте 2 коридора НЕ ДОЛЖНЫ соединяться. 3) Длинные гориз-ные коридоры связаны справа - без объяснения. Скорее это связано с п.1) 4) Не могу понять, то ли я ошибся, то ли 2 коротких вертик-х коридора действительно не стыкуются с горизонтальными? 5) Сдвоенные линии - из-за целочисленных округлений. Кроме того я приравнял расстояния 10=0. 6) А вот , наверное ни из графа, ни из рисунка не видно, что если 2 шара присоединяются к одной линии, то в графе их связь в графе сейчас не создаётся. Это надо исправить. 7) Ну и пока не видно, как я уже писал, ошибочной связи шара с более узким коридором, нежели с более широким нужным. За это пока не брался. Что я ещё не увидел? Белый цвет линий? это эффект сложения противоположных цветов : синий+жёлтый одинаковой интенсивности, расположенные рядом, дают впечатление белого. Сейчас по сути 2 коротких подпрограммы всё делают, а будет штук 10. Сейчас 600 строк и половина комментов, потому так быстро и сделал. В итоге хочу сказать, что даже доводка до перечня 1-7 потребует полной занятости на неделю работы, не меньше. Даже только п.1) уже займёт время. Не обещаю даже, что возьмусь за устранение всех п.1-7. За хорошую плату бы сделал, потому что мой проект закрыли, а за полгода так и не плачено. И время самое удачное для поиска, может придётся переквалифицироваться в управдомы. Всех с НГ! Файл прилагаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2014, 20:54 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98, круто, если оставить в сторону графику на php то реальный код всего-то 3-4 листа А4. тормоза из-за полурешений - использования формул листа - тоже поправимо. Обращаться к каждой ячейке, не отключая screnupdate... Спасибо большое. Вижу решение не слишком-то и сложно, но требует комплексной доработки. К сожалению, тоже нет возможности полностью посвятить неделю (мне видимо потребуется значительно больше времени) на поиск ошибок. Проще переписать код заново, используя логику, которую принял в файле graf. Объясни какой смысл коде: '' Заглушка. OtrCnt = 0 Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
если затем заносятся настоящие значения? тот же вопрос относительно: Код: vbnet 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2015, 20:21 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
exp98Ох, и надоело же простыни писать( Рисовал в PHP, т.к. нанокад мне осенью активационный код вовремя не дал, и я от них отказался. Просто я хелп эксэла не ставил, а методом тыка графику не нащупал, в инет за справкой - только время терять было. Теоретически могу по фтп сразу заливать рисунок или данные вам куда-нить в папку на сайте. Сейчас в эксел формируется текст программы рисовалки на PHP, а можно и для автокада, если напишете её текст. для нанокада нужно просто создать массив из точек Arr(x1,y1,z1, x2,y2,z2, x3,y3,z3) вобщем не стоит заморачиваться. учитывая, что нет возможности тестить. Как выяснилось у пользователей стоит только NCad3.1 где модель со слоями не работает, писанная для 5.1. Вобщем в excele и рисовать придется. Интерактивная диаграмма в самый раз подойдет. exp98Об ошибках. Те, что вижу я , предвиделись, но я не ожидал, что они все вылезут ) Я писал, что не сделаны умные проверки, в основном это обработка "синапсов", 3-х проходов вместо 2-х и новые торцевые отрезки на терминальных вершинах. + настройка радиуса окрестности. В общем, макет программы получен. что такое "синапс" не зная. смысл сказонного не доошел. сори. exp98В результате сейчас: 1) Ищется абсолютный минимум вместо нескольких ближайших. Но его обрабатываю с ошибкой. Это программистская ошибка. Её видно по Г-образным линиям у нижних шаров - ошибочное присоединенние к вертикальной осевой линии вместо конца отрезка. Остальное - это ошибки упрощёной методики. да уже с методиками предстоит повозиться. Все больше задумываюсь, что проще посадить обезьянку протыкать точки поворотов для построения графов. Времени займет на 2 часа больше чем прочертить прямоугольники, но зато ошибки кода будут минимальны - лишь ошибки ввода. exp982) Как раз на виртуальных коридорах сидит шар - перекрёсток типа Y не обработан. Здесь граф к шару пойдёт через стенку что ли? Нет запрета на то, что в этом месте 2 коридора НЕ ДОЛЖНЫ соединяться. это в каком месте? exp983) Длинные гориз-ные коридоры связаны справа - без объяснения. Скорее это связано с п.1) согласен, в виду того и комментарий к п.1. exp984) Не могу понять, то ли я ошибся, то ли 2 коротких вертик-х коридора действительно не стыкуются с горизонтальными? в первоначальных координатах все коридоры стыковались. Вроде все то же... видимо п.1. exp985) Сдвоенные линии - из-за целочисленных округлений. Кроме того я приравнял расстояния 10=0. не нашел приравнивания. но это не проблема. На финише будет только одна линия пути по графу. exp986) А вот , наверное ни из графа, ни из рисунка не видно, что если 2 шара присоединяются к одной линии, то в графе их связь в графе сейчас не создаётся. Это надо исправить. действительно не видно. ошибка видимо исправляется переписыванием кода заново. exp987) Ну и пока не видно, как я уже писал, ошибочной связи шара с более узким коридором, нежели с более широким нужным. За это пока не брался. следствие полу-решений формулы эксель и код vba. формулы для первых тестов методов еще бы подошли, но в решении - не айс. exp98Что я ещё не увидел? Белый цвет линий? это эффект сложения противоположных цветов : синий+жёлтый одинаковой интенсивности, расположенные рядом, дают впечатление белого. в php не рисовал никогда - вам виднее. exp98 Сейчас по сути 2 коротких подпрограммы всё делают, а будет штук 10. Сейчас 600 строк и половина комментов, потому так быстро и сделал. В итоге хочу сказать, что даже доводка до перечня 1-7 потребует полной занятости на неделю работы, не меньше. Даже только п.1) уже займёт время. Не обещаю даже, что возьмусь за устранение всех п.1-7. и на том спасибо... если бы не вы, похерил бы идею на корню.... а теперь есть шансы доработать. Правда есть более приоритетные задачи - обеспечить корректными справочниками для шариков и типов линий, создать связи и интерфейс... Визуализация пока на втором плане. exp98 За хорошую плату бы сделал, потому что мой проект закрыли, а за полгода так и не плачено. И время самое удачное для поиска, может придётся переквалифицироваться в управдомы. Всех с НГ! Файл прилагаю. В Новом году желаю много успешных и высокооплачиваемых проектов. В управдомы не стремитесь - талант закопать всегда успеете. Еще раз Спасибо. Решу задачи для того, чтобы визуализация стала полезной - буду вплотную заниматься визуализацией. exp98, Мыло в личку скинь. Будет полезно пообщаться в узком кругу. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2015, 21:01 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, подарки от Снегурочки для проверок. С п.1) покончено. Шлите ещё вариант для контроля. Чтобы не было путаницы. Оба рисунка - графы (пусть и с ошибками пока). Один рис. - просто топология, другой - точки расположены в правильных координатах. Для проверки и отладки полезны оба. А переписывать заново - дело хозяйское. По Вашим вопросам: У меня нет "полурешений". Формулы плавно переросли в программу, а затем использовались только для проверок программы. ВХодные данные как ссылка на формульный диапазон - ну это из-за лени. Кто мешает сделать рассчёт в программе? В ВЫходных данных формулы для прямоугольников - тож самое. А выплюнуть готовый скрипт в файл - мне это надо? С эттим как раз обезьяна справится. Дальше. Раздел Констант надо задавать через форму, а сами константы сделать глобальными переменными. Кстати напомню: можете на любой угол повернуть координаты. В программе ничего не изменится, я надеюсь. Для проверки я сместил крайний правый шарик - там видно, что присоединяется он правильно. Можете вместо прям-ков взять трапеции или овалы и без плотной стыковки - только укажите осевые отрезки. "Примеры создания и доступа" - как написано, так и есть - была целостная единица с правильной последовательностью команд. Сейчас возможно она уже неправильная) Есть такой приём. Когда не хочется обдумывать всё долго и заранее или трудно, или думаешь урывками, я начинаю писать комментарии типа блок-схемы. Затем комменты наполняю очевидными командами / процедурами и т.п. Затем порции команд как одна логическая единица копирую в разные места и т.д. - одновременно мне легко вносить изменения в такие порции. Так на скелет наращивается мясо. Оптимизация потом. Но начать с чего-то всегда придётся. За принцип: сделать заведомо простое, может тогда сложного и не останется, пожизненая благодарность препу. А.Комбарову. С Вашим случаем как раз так и получилось. Точки поворотов. С ними как раз всё хорошо, лишняя дуга там отсеится сама Дейкстрой, это пока сейчас здесь ошибка (п. 6). П.2): Найдите на Рис. Шарики 70, 52, 55 - вот эта ситуация из области распознавания сцен. Кто знает заранее, рядом там тупик или нужный коридор? Это надо заранее обозначить признаком или т.п., мы говорили о Лучах. Или запустить 2-й цикл программы. Посмотрите на Шарик 51. Ещё немного и он притянется к нижнему коридору. А к какому правильно? Те же Лучи. Ну и 45-й так же может сработать и т.д. Синапс - ну это для сложных ветвлений. А пока навеяло как обойтись уже сделанным. П. 6) я легко сделаю автоматической постобработкой, пол дня как-нить выделю. Поскольку из Варианта 3 я объединил 1-й и 2-й прогоны и недореализовал их, то ввести постобработку, устраняющую недостатки, т.е. 4-й этап. Например ручками (кроме п.6) тыкается, что надо удалить или что исправить. Поскольку программа модульная, это легко сделать зациклив её на 2-й круг, но предварительно надо задать фильтры на вершины и дуги, а граф 2-й раз не инициировать. А для фильтров надо вместо моих циклов последовательного перебора по i,j: Otr(i) или PNTS(j) по точкам или отрезкам, вести перебор по фильтрам-спискам: Otr( ListO.next), PNTS( ListP.next) и т.д. Это действительно легко и просто. А например, для простой правки как у Шарика 70, можно оставить в фильтре только его и прям-к 19 и напустить на них алгоритм ещё раз. Тогда граф пополнится ещё одной дугой. В общем такие простые костыли практически без программирования. А можно наделать костылей на разные случаи по мере их появления и т.п. В любом случае без постобработки в Вашей задаче не обойтись, и уж глазками всегда надо смотреть для проверки. Кстати, 5-й этап - автодиагностика нужна ВХодных и ВЫходных данных. Кроме постобработки есть варианты: процедуры - это те же макросы, их можно в ячейках использовать с нужными параметрами, не завершая основную программу. Насчёт РНР. РНР запускается из эксела командой SHELL(). А так всё легко переложить на нём, и ГУИ сделать в браузере, javascript позволяет. По крайней мере простейший интерактивный графический редактор графа с перетаскиванием мышью нужных обектов на их правильное место. Только это не очень быстро сделать, зато лицензионная чистота 100% и кроссплатформенно. Вместо РНР есть питон,перл и т.п. Вы можете эту обработку разместить на сервере, а в браузере получать результат на планшет, загорая на пляже. И т.д., главное вовремя заткнуть фонтан идей. А можно найти готовый редактор векторных объектов и редактировать там. А если в редакторе ещё и макросы можно ... Вы сами видите, что даже мелких улучшений полно, и просто так тратиться на это желания нет. Основную идею я для себя проверил хотите пользуйтесь, не хотите - нет. Да я и без лички могу: alp98 (cat) ya. ru, надеюсь понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2015, 23:58 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Bobgos, ну что же, погодка блгаоприятствовала. Это вроде всё, что я обещал. Макрос во вложении. Получилось даже лучше и проще, чем ожидал. Граф далеко не оптимальный, но и неважно, это макет. Проверять можно, отключая запись на лист дуг для тех или иных вершин. Стыковку 2-х и более виртуальных коридоров с одним шаром можно обеспечить на 2-м (3-м ...) прогоне разными способами. Например, отключив сравнение шара с уже подключённым отрезком => он соединится с другим прям-ком. А можно открыть окно Imidiate, и непосредствено в нём выполнить команду вида GR(i,j)=1400 или какое там расстояние д.б. Или создать чёрный список. Теперь отмазка! Как в любой задаче распознавания возможны 2 типа ошибок: 1-го и 2-го рода, об этом я уже упоминал. Немножко регулировать можно отсевом по расстоянию, а если нет, то для каждого плана руками. Вместо бесконечности я заносил константу NOL=-1 - это к вопросу о стыковке с поиском пути. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2015, 21:52 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
php, а рисунок не изменился, вернее изменение не видно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2015, 21:55 |
|
Поиск маршрута vba и dwg
|
|||
---|---|---|---|
#18+
Ещё раз здравствуйте! Для тех кто в теме в порядке завершения: кому интересен функционал отрисовки путей на графе, стучитесь, т.к. здесь рнр не профильно. Функционал на php, но код порзрачен ибез труда перекладывается на любойязык. Приложен фрагмент рисунка, с кратчайшим путём. Скрипт рисует путь на графе 3 раза: - без смещения / и вправо / влево на неск. пикселов - задаётся константой. Это не сделать на 1-2, т.к. надо обрабатывать повороты по внешней и внутренней траектории. Для проверок я повернул исходные координаты точек на 30град относительно подложки, а саму подложку не трогал. Так что рисуется в большой мере независимо от прямых углов и направления. Даже специально сдвинул одну из точек ради острых и тупых углов траектории. Хотя какие-то недостатки наверное остались. Ещё возможно, что со временем упрощу и эту обработку. Фактическая ошибка траектории у шарика 52 (и у аналогичных) сохранилась от недоработки VBA алгоритма (либо устраняется полуручным исправлением графа там либо здесь). При необходимости алгоритм могу доработать на повторяющиеся ошибочные и другие специальные случаи. Просто разовые случаи легче исправить руками. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2015, 21:35 |
|
|
start [/forum/topic.php?all=1&fid=61&tid=2173670]: |
0ms |
get settings: |
12ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
109ms |
get tp. blocked users: |
2ms |
others: | 296ms |
total: | 480ms |
0 / 0 |