|
Поиск маршрута 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 |
|
|
start [/forum/topic.php?fid=61&msg=38831381&tid=2173670]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
25ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 274ms |
total: | 397ms |
0 / 0 |