powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Поиск маршрута vba и dwg
101 сообщений из 101, показаны все 5 страниц
Поиск маршрута vba и dwg
    #38811297
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Задачка возможно для профи не стоит выделенного яйца.
Есть Excel и Nanocad.

В dwg начерчен лабиринт - здание с коридорной системой.
Нужно по данным Excel построить маршрут от точи А в точку Б не пересекая стены и лучше по осям коридоров.
Изменение направления маршрута под пока только под прямым углом.

Выполняем следующее:
1. Обрисовываем коридоры прямоугольниками, указывая точки доступных для перемещения областей,
при этом в Excel формируем таблицу координат с полями: ID,x1,y1,x2,y2,x3,y3,x4,y4,
тип данный vba:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Public Type NcAreasSQ 'тип разрешенная область
    a1 As NcXYZ
    a2 As NcXYZ
    a3 As NcXYZ
    a4 As NcXYZ
    iD As Integer
End Type


2. Указываем начальную и конечную точку маршрута (для упрощения уже внутри коридора)
тип данный vba:
Код: vbnet
1.
2.
3.
Public Type NcXYZ 'координаты
    x As Double: y As Double: z As Double
End Type


3. Формируем начальный вектор движения для каждой оси из значений -1,0,1
тип данный vba:
Код: vbnet
1.
2.
3.
Public Type NcVector
    x As Integer: y As Integer
End Type


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 текущей разрешенной области

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

Подскажете пожалуйста пример кода не слишком сложный для построения точек (координат маршрута)
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38811317
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BobgosНужно по данным Excel построить маршрут от точи А в точку Б не пересекая стены
по dwg ничего подсказать не могу, но по нахождению выхода из лабиринта можно использовать волновой алгоритм.
Если лабиринт перенести в Excel, то решение можно достаточно легко сделать волновым алгоритмом.
Как пример: https://yadi.sk/i/f0RrVpP5cpFYg
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38811539
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Михаил Ч.BobgosНужно по данным Excel построить маршрут от точи А в точку Б не пересекая стены
по dwg ничего подсказать не могу, но по нахождению выхода из лабиринта можно использовать волновой алгоритм.
Если лабиринт перенести в Excel, то решение можно достаточно легко сделать волновым алгоритмом.
Как пример: https://yadi.sk/i/f0RrVpP5cpFYg

полностью перенести наверно будет неправильно - дополнительные операции преобразования в ячейки, приведения к масштабу. Потом вернуть назад, с учетом скруглений, для переноса в excel вернется в dwg криво.

Комментариев немного в файле.
Можно пояснить принцип и последовательность операций - как это реализовано в Excel, привести ключевой код (название процедуры)?

1. Задаем начальное направление
2. Ищем точку в которой встречается препятствие.
....
что дальше?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38811550
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bobgos,
в примере Choose(i, 1, 0, -1, 0) - что такое?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38812472
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Михаил Ч.BobgosНужно по данным Excel построить маршрут от точи А в точку Б не пересекая стены
по dwg ничего подсказать не могу, но по нахождению выхода из лабиринта можно использовать волновой алгоритм.
Если лабиринт перенести в Excel, то решение можно достаточно легко сделать волновым алгоритмом.
Как пример: https://yadi.sk/i/f0RrVpP5cpFYg

Михаил, баг или что-то недопонял. Алгоритм из файла в тупик попадает. Трети не закрасил, и стал мотаться по кругу в области ячеек 20-30 по оси.

Вопрос в следующем:
перенести из dwg модель в Эксель тоже еще та задачка.

Можете описать основной принцип волнового метода?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38812556
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходная тема с лабиринтом: 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: влево, вверх, вправо, вниз.

Можете привести пример вашего лабиринта, чтобы понимать что именно нужно.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38812929
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Михаил Ч.,
Пример лабиринта во вложении
Задача - найти оптимальный путь (по длине) и начертить линии трасс по исходным данным, полученным при обработке чертежа и записанным в 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, чтобы потом быстро прорисовать без поиска или ручной оптимизации положения линий.
Ограничения проходов по ширине пока не рассматриваем.

Возможно применимость предлагаемого места вызывает смуту, потому как нужно найти не выход из лабиринта, а конкретный путь от точки А к точке Б?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38813100
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos, в свое время использовал алгоритм "поиск в ширину"
когда баловался и писал прогу по поиску маршрута в метро
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38813261
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot,

Указанный метод метод больше похоже на эффективное решение моей задачи.
Но все равно потребуется позиционироваться в пространстве dwg, чтобы определить возможные точки маршрута.

Для этого нужно или нет оцифровать в массив все пространство чертежа с необходимой дискретностью?

Или оцифровать доступные области в координатах чертежей, затем найти прилегающие координаты областей - которые будут областями для возможной смены маршрута? - достаточно?

А вот так не получится?
1. Иду вдоль первого выбранного вектора в направлении максимального отклонения по одной из осей точки А от точки Б.
2. Упираюсь в препятствие и поворачиваю по 2-м перпендикулярным векторам.
3. Проверяю доступность области по следующему шагу по новому вектору. Если после поворота по новому вектору нет доступной области на следующем шаге ветку направление от последнего поворота считаю без решения.
4. Повторяю 1-3 для всех решений перечислений пока не буду в пределах одного шага от цели
5. Фиксирую первое решение и его ветку вырисовываю. Последующие решения - опционально.... для построения более дешевого по разнице координат между поворотами. По идее самое дешевое решение появится первым.

Поможете с кодом VBA? Уже третий подход и все в тупик. То одно, то другое приводит к краху идеи.
Может примерчик какой для подобной задачи наваяем или подыщем?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38813965
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если есть возможность построить граф по данному лабиринту (описать все возможные маршруты по соседним перекресткам с указанием расстояний, где перекресток - это вершина графа, расстояния между перекрестками - ребра графа) то задачу по нахождению кратчайшего пути от любой точки до любой другой можно с помощью алгоритма Дейкстры (или Левита или Форда-Беллмана или Флойда-Уоршелла)

Примеры нахождения кратчайших путей по графам размещал здесь: http://www.excelworld.ru/forum/3-6656-1

Если задачу свети к построению графа по указанному лабиринту, то найти кратчайшие пути будет не сложно.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38818000
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos , что-то пропустил продолжение темы.
Как сказал Михаил Ч. надо построить граф по лабиринту. Здесь помочь мне сложно, т.к я не знаком с dwg

Вот Вы постоянно говорите "вектор". То в случае графа вектор и есть ребро графа, т.е начало и конец вектора - вершины графа
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38820084
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot Bobgos , что-то пропустил продолжение темы.
Как сказал Михаил Ч. надо построить граф по лабиринту. Здесь помочь мне сложно, т.к я не знаком с dwg

Вот Вы постоянно говорите "вектор". То в случае графа вектор и есть ребро графа, т.е начало и конец вектора - вершины графа

так как построить граф по лабиринту описанному точками A(x1,y1);B(x2,y2);C(x3,y3);D(x4,y4) - разрешенные области - прямоугольники?
и найти:
а) оптимальный путь
б) пересечение путей для разных трасс (из совсем несвязанных точек)

Честно-задач навалило. Самому ваять не успевается, вижу код растет и явно что-то делаю не так.
Хелп,
дайте направления в виде примера кода
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38820095
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Михаил Ч.Если есть возможность построить граф по данному лабиринту (описать все возможные маршруты по соседним перекресткам с указанием расстояний, где перекресток - это вершина графа, расстояния между перекрестками - ребра графа) то задачу по нахождению кратчайшего пути от любой точки до любой другой можно с помощью алгоритма Дейкстры (или Левита или Форда-Беллмана или Флойда-Уоршелла)

Примеры нахождения кратчайших путей по графам размещал здесь: http://www.excelworld.ru/forum/3-6656-1

Если задачу свети к построению графа по указанному лабиринту, то найти кратчайшие пути будет не сложно.
да, очень похоже, но как построит графы в моем случае в этом пробема
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38820992
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos,
берем код из первого поста
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Public Type NcAreasSQ 'тип разрешенная область
    a1 As NcXYZ
    a2 As NcXYZ
    a3 As NcXYZ
    a4 As NcXYZ
    iD As Integer
End Type


Я не знаю на каком принципе Вы будете её заполнять, но...
если представить эту область вершиной графа, то получаем (код примерный, т.к давно с ВБ не работал)
Код: vbnet
1.
2.
Dim tops() as NcAreasSQ 'массив вершин графа
Dim paths() as Integer 'массив ребер графа


где paths() состоит из двух частей
iD - идентификатор вершины
iDNear - идентификатор смежной вершины
для каждого iD , может быть несколько записей (по кол-ву смежных вершин)

Думаю, что массив вершин и смежных вершин лучше представить в виде Dictionary или Collection
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38821081
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKotBobgos,
берем код из первого поста
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Public Type NcAreasSQ 'тип разрешенная область
    a1 As NcXYZ
    a2 As NcXYZ
    a3 As NcXYZ
    a4 As NcXYZ
    iD As Integer
End Type


Я не знаю на каком принципе Вы будете её заполнять, но...
если представить эту область вершиной графа, то получаем (код примерный, т.к давно с ВБ не работал)
Код: vbnet
1.
2.
Dim tops() as NcAreasSQ 'массив вершин графа
Dim paths() as Integer 'массив ребер графа


где paths() состоит из двух частей
iD - идентификатор вершины
iDNear - идентификатор смежной вершины
для каждого iD , может быть несколько записей (по кол-ву смежных вершин)

Думаю, что массив вершин и смежных вершин лучше представить в виде Dictionary или Collection

Id - идентификатор вершины, графа, которую еще нужно определить.
Имеем на старте две вершины - точку начала и окончания.
Как найти смежную вершину - точку в которой возможен поворот пути по коридорам областей. чтобы сначала заполнить граф.
Код: vbnet
1.
2.
3.
Public Type NcXYZ 'координаты
    x As Double: y As Double
End Type


Т.е. граф будет состоять из массива точек
Код: vbnet
1.
Dim  GPiont as NcXYZ 
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38821348
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos, я не работаю с dwg и не знаю как там что хранится
Вы сначала определите, как распарсить файл, что в нем хранится и как. Тогда будет уже более продуктивный разговор
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38823042
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AFAIK dwg закрытый бинарный формат (хотя, раз другие его поддерживают, наверное уже полу-закрытый ))) )
Наверное проще сконвертировать DWG в DXF и парсить DXF.

AFAIK
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38823210
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема не перевести из dwg в xls координаты. Вопрос как построить граф?
считаем, что уже есть координаты областей по которым можно строить маршрут от точки А к точке Б.

как построить граф и проложить маршрут - определить координат точек ломаной линии?
Да еще и посчитать какой путь короче, для двух маршрутов найти точки пересечения?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38823648
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgosпроблема не перевести из dwg в xls координаты. Вопрос как построить граф?
считаем, что уже есть координаты областей по которым можно строить маршрут от точки А к точке Б.

как построить граф и проложить маршрут - определить координат точек ломаной линии?
Да еще и посчитать какой путь короче, для двух маршрутов найти точки пересечения?
предоставьте больше данных (побольше строк и не в виде картинки) и как это выглядит графически.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38825256
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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}-множество вершин, которое отобрашается в их Декартово произведение. А по-русски: это вершины и рёбра вместе взятые.
Ой, чей-то много написал ...
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38825272
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos, на вопрос как построить граф?
А что за координаты на рисунке. Народ имел ввиду, что вы создёте массив центральных точек на всех перекрёстках - это вершины графа. Или вопрос как автоматизировать нахождение перекрёстков, когда есть вершины криволинейных прямоугольников-коридоров? В последнем случае, если руками указать все перекрёстки , то их центры взять как среднеарифм. координат.

Да, о представлениях графа. В языках давно есть готовые Tree-структуры.
Если с чистого листа, то: либо "матрица вершин" (почти вся пустая), либо "списки инцидентности", которые похожи на формат DOT. Но вот программировать удобнее на списках, тк. уже есть готовые методы: следующий, предыдущий, пусто и т.д.
Ну и две стратегии обхода всего графа: поиск "в ширину"/"в глубину" - всё равно всё пройденное запоминать надо.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38825287
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И чтоб мысль закончить. Алгоритм эмпирического блуждания по графу - тогда не надо никаких поворотов/векторов/углов и проч. Просто полагаем, что ребро графа - это коридор. Ну или алгоритм поиска пути, приближённого к короткому.
При выборе способов ещё важно, насколько повторяемо будет это задание. Если один раз сделать, то можно и полувручную.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38825339
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой ещё вопрос остался?
Bobgosпроблема не перевести из dwg в xls координаты. Вопрос как построить граф?
считаем, что уже есть координаты областей по которым можно строить маршрут от точки А к точке Б.

как построить граф и проложить маршрут - определить координат точек ломаной линии?
Да еще и посчитать какой путь короче, для двух маршрутов найти точки пересечения?

Если я правильно понял: имеем криволинейные полоски на плоскости, которые могут пересекаться, да? По типу топографической карты, рекка и её притоки + каналы и т.д. Или дороги на местности. А как карты векторизуют, они ведь пиксельные?

Т.е. как превратить полоску в линию?
Доморощенный и неудобный вариант: решение системы линейных неравенств вида:
a1 *x +b1*y<=c1
a2 *x +b2*y>=c2,
решение - это прямоугольник, отрезок, точка либо пусто.

Два таких прямоугольника задают пересечение 2-х фрагментов "дорог".
Находим все изолированные (или даже частично пересекрывающиеся парные пересечения) - это и будут перекрёстки.
Для этого кластеризуем найденные пересечения.
Центры найденных кластеров можно принять за перекрёстки.
(Этот метод имеет погрешности)

Универсальный метод "по гребню хребта".
Каждый участок "дороги" сглаживаем окрестностным сглаживателем. В результате получаем вместо плоской дороги 3-хмерный вал (хребет на местности). Теоретически у хребта будет гребень (или узкое плато, идущее по вершине).
Затем ищем точки пересечения гребней, т.е. 1-мерных линий. Но и тут есть некоторые нюансы, т.к. строгого пересечения может не быть.
На qb я когда-то баловался, валяется черновик.

авторКак найти смежную вершину - точку в которой возможен поворот пути по коридорам областей
Например:
Если в достаточно маленькой окрестности точки на линии есть точки другой линии.

Здесь выбор за сглаживателем - это для каждой точки дороги просто взвешенная сумма всех её точек, попадающих в некоторую окрестность.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38826869
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exp98,

Не вовремя полетел винт на ноуте...

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

Да, нужно для начала из прямоугольников сделать отрезки. Здесь координаты x1+(x2-x1)/2 нахожу центральные. Это видимо ребра графа?

Пересечения ищу тупо перебирая с шагом скажем 10мм линию ребро графа на предмет нахождения с таким же отклонением (10мм) координаты у другого ребра. Вот тут понял, что метод в корне неверный.. Зная что мои векторы только вертикальных или горизонтальны думаю прще составить функцию описывающую каждый отрезок. Но как и как потом найти пересечения?
Можно привести пример кода
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38827028
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos,
добрый вечер,я случайно сюда щас гянул. Ваш вопрос мне вполне интересен теоретически, и чего смогу, то подскажу. Но ведь не я один такой "умный" в инете.

Выше уже просили показать побольше данных. Добавляю просьбу:
- примеры координат в ТЕКСТОВОМ виде,точек 100,например. И вообще, каков масштаб проблемы,т.е. порядок точек всего?
- рисунок характерных перекрёстков, пусть даже и сделанный в пайнтбраше. Возможно пропорции перекрёстков окажутся важны.

Задача ведь не элементарная. Когда будет понятно с алгоритмом, с кодом будет легче. Насколько я понимаю в технике программирования, то при обходах графов полезны рекурсивные вызовы функции со статическими переменными (либо их замена на глобально доступные переменные).

Насчёт алгоритмов у меня появилась идея, но применима ли она здесь - надо посмотреть распределение точек с координатами.
Из рисунка надо оценить сложность перекрёстков: "Ж"-обрАзные, Г-, Т-,Х-,"(", "|" и т.д ?

Из последнего сообщения мне показалось, что Вы думали о графе, который строится из "стенок" коридоров,да? Я уверен, что здесь предлагался как раз граф "коридоров" и перекрёстков. Хотя м.б. подойдёт идея соединить стенки коридоров в цепочку рёбер,тогда граф т.ск. уже построен.
Вопрос с функцией отрезков мне не очень понятен. Если есть уравнение 2-х прямых, то их т. пересечения вычисляется теоретически.

В частности, для примера, пока Вы вполне можете руками в экселе
сделать матрицу парных расстояний тех точек, которые определяют перекрёстки (как я понимаю - это углы коридоров). Лучше для статистики вообще любых точек, в т.ч. и на перекрёстках. Расстоянние самое Евклидовое sqrt( (x1-x2)^2 + (y1-y2)^2 ), впрочем можно обойтись без корня,т.к. нам важно их только сравнить.

Затем вытягиваете матрицу в один столбец.

Затем все смотрим ТОЧЕЧНУЮ диаграмму по этому столбцу. Есть подозрение, что даже визуально точки будут распадаться на кластеры.

Дальнейшие выводы возможны после визуализации, но идея такая.
Кластеры с минимальными значениями соответствуют перекрёсткам, но при этом ВСЕМ перекрёсткам.

Чтобы отделить один от другого нужно с каждым парным расстоянием ассоциировать конкретные координаты этих точек. Т.о. точки получают признак "перекрёсток".

Затем умно "кластеризуем" сами точки.
Умозрительно говоря, два этих множества должны пересекаться как раз в местах перекрёстков.

Это всё можно сделать формулами при помощи рук. Это всё делается только для того, чтобы нащупать канву алгоритма, а без характерных данных я дальше не фантазирую. Ну, есть ещё способ: превратить всё в растр и напустить векторизатор в автоматизированом режиме, а потом вытащить координаты и программировать.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38827034
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, вот включил картинки,теперь вижу пример плана. Он характерный? Напоминает трубопроводы пневмопочты на одном этаже) Всё равно, запрос на примеры данных не отменяется. Конечно прямоугольники далеко друг от друга.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38827883
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exp98,
да, план характерный... только нужен универсальный инструмент для любой сложности коридоров.

во вложении шаблон для записи точек коридоров. В dwg предлагаю не углубляться - за исходные берем лист sprAreas (формат представления данных о коридорах.

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

повторяем г)-е) для других точек источник2- назначение2
ж) находим пересечения
з) прорисовываем маршрут, выделяем пересечения
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38828108
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos,
файл- то я посмотрел, да только Экс-2010 нету, а в опенофисе там ничего нет кроме прежних 4х точек. Нырять с головой в неизведанное множество данных не считаю практичным. Сначала смотрим репрезентативную часть данных. Устанавливаем границы размерности задачи.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38828330
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exp98,

ок выложу файлик описанными областями на одном из примеров.
к сожалению nanocad3.7 как-то странно реагирует на VBA обращения к слоям. А ноут мой похоронен до получения премиальных. Придется найти способ снять данные о точках.

но сразу говорю.
Размерность задачи - областей коридоров порядка 50 шт. Максимум - не ограничивается - но думаю обрисовывать более 3-4 сотен коридоров не потребуется в принципе.
Типов маршрутов - маршрутов различных цветов для различных видов материальных потоков - в пределах десятка (это 1. сырье нерастаренное, 2-3 полуфабрикаты 2-х или трех степеней готовности, 4. тара, 5. ТБО, 6. органические отходы, 7. упаковочные материалы)
Для основного типа маршрутов - движение полуфабрикатов (для одновременного отображения) - порядка до 15 линий + еще до 7ми трасс для других видов трасс.

т.е одновременное отображение для 15 +7 трасс, проходящих по не более 200 областям между ориентировочно 100 начальными/конечными точками.

Такой комментарий достаточен для выработки предложения по построению алгоритма?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38828337
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
поправлю немного:
Bobgosт.е одновременное отображение для
(15+7)* N трасс, проходящих по не более 200 областям между ориентировочно 100 начальными/конечными точками.
где N - это число этапов от 2-х до 10 (максимум) - число точек начала/окончания для выбранного маршрута
это задача максимум.

Задача минимум - одновременное построение (1+0)*N трасс, т.е. маршрут продукта от одного рабочего центра к другому.
но хранение данных о уже прорисованных маршрутах как активных и проверки на пересечение с некоторыми неосновными категориями маршрутов.

Такой комментарий достаточен для выработки предложения по построению алгоритма?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38828423
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ха! вопрос усложняется.
Вы полагаете, что самое сложное - это решить задачу транспортного типа, а я думаю, что сложнее полностью автоматическое построение графа по любому подобному плану. И я как раз прежде всего рассматривал этот аспект задачи, а Ваше мнение? В противном случае руками создаём учебный граф, рёбрам присваиваем вес=длина пути и начинаем формулировать частные виды задач. Выбор за Вами. Боюсь, что "кружочки" придётся оцифровывать вручную.

А пока можно ведь снять координаты с приведённого плана в пэйнтбраше. И сосредоточимся на одном "типе маршрута", на самом важном.
В любом случае, хорошо бы определиться с терминологией. Был приведён рисунок фрагмент плана. Что на нём есть что?
1. "Один коридор" - это что? Я думал, что границы коридоров начерчены чёрными линиями, а что тогда такое ступенчатое в середине? там границы коричневые. А по периметру малиновая линия.
2. Что такое "область коридора"? это равно "область"?
3. Что на рисунке "трасса"?
4. Что означает цвет линии?
5. Что такое "маршрут"? что такое "этап"?
6. Если "начальными/конечными точками"=100, а "областей"=200, то граф предполагается какой? 100 вершин и 200 рёбер?
7. Маршруты (на графе), которые мы предполагаем строить могут не позволять строиться другим маршрутам?
8. "Рабочий центр" является одной из вершин будущего графа?
9. Под "графом" я всегда понимал топологию "коридоров", которые полагал физическими коридорами. Это значит, что для конкретного плана граф один и то же независимо от того, какой тип материальных потоков будем рассматривать. Такое возможно? Просто тогда налагаем доп. ограничения на допустимый путь по графу.
10. Ну и для начала главное, ручная оцифровка плана, превращение его в граф, совершенно не допустима? может допустим автоматизированный режим?

Да, и ещё важно. На приведённом рисунке некоторые "коридоры" по длине соизмеримы с шириной. Такое может быть?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38828629
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exp98Ха! вопрос усложняется.
Вы полагаете, что самое сложное - это решить задачу транспортного типа, а я думаю, что сложнее полностью автоматическое построение графа по любому подобному плану. И я как раз прежде всего рассматривал этот аспект задачи, а Ваше мнение? В противном случае руками создаём учебный граф, рёбрам присваиваем вес=длина пути и начинаем формулировать частные виды задач. Выбор за Вами. Боюсь, что "кружочки" придётся оцифровывать вручную.
Вручную необходимо будет формировать список точек источников-приемников. Координаты их планировал вносить из Excel с помощью отдельной команды:
Код: vbnet
1.
Set obj = NcDoc.ModelSpace.AddCircle(pt1, r1)



exp98А пока можно ведь снять координаты с приведённого плана в пэйнтбраше. И сосредоточимся на одном "типе маршрута", на самом важном.
согласен, что сконцентрироваться на одном
exp98В любом случае, хорошо бы определиться с терминологией. Был приведён рисунок фрагмент плана. Что на нём есть что?
1. "Один коридор" - это что? Я думал, что границы коридоров начерчены чёрными линиями, а что тогда такое ступенчатое в середине? там границы коричневые. А по периметру малиновая линия.
-периметр - общая область чертежа для поиска пути. Если не потребуется - то и ладненько...exp982. Что такое "область коридора"? это равно "область"?
да разрешенная для поиска пути область - коридор. "Очерчен черной линией, но с заделом для "красивости" прорисовки при снятии размеров - обведения коридоров предполагал, что область будет например на 100 мм уже, чем сам коридор.
exp983. Что на рисунке "трасса"?
это ломаннная линия по центру коридоров exp984. Что означает цвет линии? это тип маршрута или трассыexp985. Что такое "маршрут"? что такое "этап"? это ломанная линия по центру коридора или трассаexp986. Если "начальными/конечными точками"=100, а "областей"=200, то граф предполагается какой? 100 вершин и 200 рёбер?
100 начальных конечных точек - это именно точки. Да, они в том числе должны будут добавляться к графу.
Вершины графа: а) точки начальные/конечные, точки вхождения в маршрут и б) точки поворотов коридоров. Ребра графа а) отрезки между поворотами б) отрезки между например исходной точкой маршрута и ближайшим расстоянием до отрезка -оси коридора exp987. Маршруты (на графе), которые мы предполагаем строить могут не позволять строиться другим маршрутам? давайте сначала нужно нарисовать один маршрут exp988. "Рабочий центр" является одной из вершин будущего графа? это и есть начальные /конечные точки маршрута exp989. Под "графом" я всегда понимал топологию "коридоров", которые полагал физическими коридорами. Это значит, что для конкретного плана граф один и то же независимо от того, какой тип материальных потоков будем рассматривать. Такое возможно? Просто тогда налагаем доп. ограничения на допустимый путь по графу. да, граф должен быть а) статический - определенный топологией коидоров и б) динамическая часть, определяемая точкам начала, конца маршрутов и точками вхождения для того чтобы добраться от начальной точки до линии маршрута exp9810. Ну и для начала главное, ручная оцифровка плана, превращение его в граф, совершенно не допустима? может допустим автоматизированный режим? для начала допустима. Поставил на второй ноут NanoCad Вечером. если успею - сниму точки с какого-нить плана exp98Да, и ещё важно. На приведённом рисунке некоторые "коридоры" по длине соизмеримы с шириной. Такое может быть?
соизмеримы могут, но не квадратны. Принимаем это за аксиому, чтобы можно было найти ось коридора.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38829080
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял так.
Вы предлагаете "коридорами" считать наборы прямоугольников с рамкой коричневого цвета.
Шарики - это рабочие места, их включаем в множество вершин графа.
Предполагаем, что все нужные координаты уже заданы.
Начинаем мучиться с транспортной задачей, хотя по классике это всё же "задача транспортного типа".

Только моё ИМХО. Не должно быть для начала у графа никаких "динамическая часть, определяемая точками старта/финиша". Или как, раб.места могут менять координаты от запуска к запуску?
Начальный граф будет статическим, всё остальное, которое динамическое, будет доп.струтктурами.
Это для начала.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38829147
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вроде для затравки.
Я усматриваю 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-м приближении так.
Ах ну да, очевидно, Ваш граф может содержать циклы, поэтому у него нет понятия корень/листья как у дерева. Для каждого маршрута, который хотим найти берутся вершины начала и конца маршрута.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38829511
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчёт этого:
exp98 Г(ij)=1 <=> они связаны. Вместо 1 удобно писать вес ребра и "минус вес" если в этом направлении запрет движения.


в случае запрета обратного движения вроде ставим "0", хотя можно "минус бесконечность" или "плюс беск.", чотбоы по длине пути отсеялось, на месте разберёмся. Если "0", то встретив его, придётся его обрабатывать как запрет движения.
Эту часть уже вполне можно сделать.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38829717
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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-м приближении так.
Ах ну да, очевидно, Ваш граф может содержать циклы, поэтому у него нет понятия корень/листья как у дерева. Для каждого маршрута, который хотим найти берутся вершины начала и конца маршрута.
нужно переварить малость... а если в коде и по порядку?

Часть вершин графа уже есть в списке рабочих центров = это точки назначения и источника
Остальные нужно определить: см. начало этого поста. Как это в коде реализовать?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38829721
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bobgos1.1. Прикрепил файл с оцифрованным чертежом. Картинка того, с чего снимались координаты:
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38829786
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для меня эта тема интересная с точки зрения нахождения кратчайшего пути.
Вся сложность состоит именно в построении корректного графа по чертежу.
Алгоритм нахождения кратчайших путей запрограммировать не сложно (алгоритмом Дейкстры, Левита, Форда-Беллмана, Флойда-Уоршелла), ссылку на реализации я уже давал.

Автоматизировать процесс построения графа по прямоугольникам - основная задача.
Предполагаю, что лабиринт статичен, и достаточно один раз построить по нему граф в ручном или полуавтоматизированном режиме, а находить кратчайшие пути между точками делать уже математически.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38829791
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BobgosBobgos1.1. Прикрепил файл с оцифрованным чертежом. Картинка того, с чего снимались координаты:


что-то картинку не видно
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38829796
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKotBobgosпропущено...
Картинка того, с чего снимались координаты:


что-то картинку не видно
попробуйте открыть в новом окне
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38829798
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Михаил Ч.Для меня эта тема интересная с точки зрения нахождения кратчайшего пути.
Вся сложность состоит именно в построении корректного графа по чертежу.
Алгоритм нахождения кратчайших путей запрограммировать не сложно (алгоритмом Дейкстры, Левита, Форда-Беллмана, Флойда-Уоршелла), ссылку на реализации я уже давал.

Автоматизировать процесс построения графа по прямоугольникам - основная задача.
Предполагаю, что лабиринт статичен, и достаточно один раз построить по нему граф в ручном или полуавтоматизированном режиме, а находить кратчайшие пути между точками делать уже математически.
полностью согласен.
Лабиринт статичен, процедуры внесения изменений будут разрабатываться после решения основной задачи. Но их может быть много и нужен инструмент.

Предложите максимально детальную последовательность или пример кода для построения графа.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38830298
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos,
авторГраф - это список вершин с координатами?
Граф - это матемтическая абстракция состоящая из множества вершин и множества дуг (рёбер) между ними. Дуги могут быть направленными туда-сюда либо ненаправленными.
Для наглядности граф рисуют например в виде кружочков, соединённых линиями. На линиях могут рисоваться стрелочки и веса. В общем это шутейный ответ, хотя и правильный.

Надеюсь, что теперь слово "граф" будем использовать в качестве термина, а термин "дуга" оказалось проще писать))
Ведь Ваша задача НЕ нарисовать граф, а составить ту самую абстракцию, которую затем нужно программно обработать.

В программе удобно представить граф в виде квадратной матрицы G(n x n). Я бы не стал раньше времени использовать списки. Ну и какой тут нафиг код?
Код: vbnet
1.
Dim G(1 to N, 1 to N) as float


То есть! граф НЕ БУДЕТ содержать координат!

Ещё до написания кода, на основе исходной таблицы (которую задаём непосредственно в ячейках эксела):
автор..........
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. Но дуги д.б. направленными, зато граф может содержать циклы. Кроме того, форма представления графа там моет отличаться от простой матричной. Может есть и другие варианты, я не смотрел. Поэтому лично я, сперва не стал бы гнаться за эффективностью реализации, а взял представление в виде матрицы с ненаправленными дугами. Затем методом "поиска ширину или глубину" просто перебрал бы все варианты и нашёл из них МИН. Код поиска предельно простой, если найдёте в Инете, то гут, нет - м.б. к завтра отсканирую псевдокод с разъяснениями.

Файл скачал, что скажет опенофис? а картинки тоже не вижу.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38830542
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мм-да, пока оптимизма на 67%.
Взял 22 точки х1,у1, посмотрел парные расстояния.
Распределение расстояний см. на рисунке.
Т.к. матрица парных расстояний симметрична, достаточно видеть одну половину.
Всего точек 484, значения на нуле - это диагональные элементы, их не смотрим.
Выделены значения, которые между 0 и 5500 - это очевидная визуальная граница, которую хочется посмотреть.
Попало 9 точек. Кто они, не смотрел. Пока работать надо.

Есть надежда, если взять остальные 3*22 точки, получится что-то путное.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38830555
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Граф по исходному лабиринту я представляю как представлено на картинке во вложении.
Где черные точки - это вершины графа, а красные линии - ребра.

Достаточно сделать описание графа в виде матрицы смежности, либо с указанием растояний от одной вершины до другой.
Как сделать автоматизированным описание - не знаю.
Но уже по описанному графу найти расстояния между различными вершинами - не проблема.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38830558
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не нарисовалась одна линия, но и так понятно
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38830730
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может с помощью рисунка половина моего плана станет понятней.

На диаграммах:
сверху: у(х) для коридоров, здесь угадываются контуры прямоугольников
снизу: у(х) для шариков, здесь видны напаравляющие веекторы.

0) На данный момент все координаты забиты вручную, зато имеем нужные признаки по принадлежности:
Вектор - шарик,
4 точки - прямоугольник.
Этот этап (п.0) ещё предстоит автоматизировать, а сейчас действуем по-задуманному. Заведомые ляпы - плз, критикуем.

1)Для каждого прямоугольника составить уравнение прямой, которая будет его осью.
Уравнение имеет вид ax + by=c

2)для каждого шарика составить уравнение ЛУЧА, вид уравнения аналогичен. С лучём работаем как с прямой, только потом, когда в п.4) будем фильтровать точки пересечения, не забыть, что это луч.
Для этого в коде просто зашивается вычисляющая формула.

3) Находим ВСЕ парные пересечения ПРЯМЫХ и ЛУЧЕЙ. Тоже в коде зашивается вычисляющая формула. Здесь м.б. нетривиальный момент. два прямоугольника стыкуются параллельно, но со сдвигом по вертикали на 1 ед.изм. Тогда нужного пересечения по строгой формуле не получить, а надо бы. Тогда для "достаточно параллельных" лучей и прямых точку пересечения присваиваем насильно как ср.арифметич. угловых точек 2-х прямоугольников, которые ближе всего друг к другу.

4) В результате получим много лишних точек, которые надо исключить из графа. Исключаем их по прринципу, что они находятся вне достаточо малой окрестности допустимой области 2-х прямоугольников (либо шарика и прямоугольника).

5) Из оставшихся тт. составляем промежуточный ПОЛНОСВЯЗНЫЙ граф.

6) Из него вычёркиваем лишние дуги. По какому принципу? Наверное что-то типа "геометрическое представление дуги имеет отрезок, чья длина выходит далеко из допустимой области прямоугольника или шарика".

Пока видится так.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38830786
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Михаил Ч.,
Да, теперь начинаю понимать.
в Excel формулами построил отрезки осей прямоугольников. вроде вышло.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38830805
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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

Вопрос: что использовать отрезки или прямые?
Если отрезки, то крайние точки отрезков не являются точками пересечения осей (см. рисунок) и нужно искать ближайшую точку пересечений. Как?
Если прямые, то не учитываются ограничения коридоров. И точек пересечение будет больше или они будут одинаковыми и понять какой вес (длина) у ребра графа действительна (не пересекает стену) не получится.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38831340
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение задачи по нахождению кратчайших путей во вложении, реализовано Дейкстрой и Левитом.
Граф строил вручную. Сложность задачи заключается в построение корректного графа по чертежу.

Можно предложить следующий алгоритм:
1. Определяем оси коридоров (прямоугольников) в виде координат отрезков.
2. Попарно сравниваем все отрезки, находим пересечения, если они есть, то точка пересечения является вершиной графа.
3. Попарно проверяем все вершины, если они находятся на одном отрезке, то значит между вершинами есть ребро, находим расстояние геометрическим способом.

По полученному графу производим вычисления.

Есть сложности в реализации данного алгоритма, как математическое, так и относительно качества чертежа (прямоугольники могуд не пересекатся а стыковаться, тогда пересечение осей не будет, хотя прямоугольники фактически пересекаются).
Кроме того, конечные точки нужно также подтягивать к коридорам, это тоже задача для размышления.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38831378
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал вычесление "на лету" через UDF
При изменение значений в B2 и C2 маршрут сразу перерисовывается
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38831381
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos, дополняем друг друга по-немногу. Забудьте пока про сложности с уравнениями, это фигня, считайте, что они у вас есть и именно в том виде, как я написал. Сегодня пришла мысь. Предыдущую мою простыню положим в архив, а пока вырисовывается вариант попроще.

По сути у нас есть граф, у которого вершины состоят из прямоугольников, надо только этот граф формально построить, т.е. найти последовательность, в которой их соединять. Наши исходные упрощения сильно облегчают построение. Перекрёстков вида "Ж" у нас нет сейчас, есть только Т, Г, |, Х и м.б. "трезубец". Плюс к этому шарики, а там они типа Т. И у нас нет изолированных циклов.

Задача такая. Имеем прямоугольники, заданные своими координатами, и шарики, заданные координатами центров. Прямоугольники стыкуются без промежутков, т.е. у них общие боковые стороны. На самом деле прямоугольники могут быть и трапециями, у которых скос небольшой, тогда перекрёстки будут типа "(".
Для построения графа ищем соседние прям-ки методом "поиск в ширину". Канва алгоритма простая.

1) Кажем начальный прям-к. Сразу имеем 2 вершины графа на концах прям-ка и дугу между ними.

2) Берём необработанную вершину и задём направление от прям-ка, куда двигаться вдоль срединной оси прям-ка. Рекурсивной процедурой "поиском в ширину" ОБРАБАТЫВАЕМ все соседние с ним прям-ки. Сделать это можно примерно так.

2.1. Поскольку взятая в п.2) вершина лежит на стороне прям-ка, то у неё есть 2 соседние угловые точки этого прям-ка. Одна из них для ВЕРШИНЫ всегда левая, другая - правая. Нумеруем их слева направо.

2.2. Находим все прям-ки, соседние с обрабатываемой стороной. Для этого В цикле для каждой из этих 3-х точек "заметаем" геометрическое пространство в поисках ближайшей стороны соседних прям-ков.

2.3. Устраняем дублирование в найденном наборе. В результате получаем новые дуги и вершины. Заносим их в граф.

2.4. Если прям-к на краю чертежа, то одна вершина графа тупиковая, т.е. "лист". У неё нет других дочерних вершин и нам туда не надо. Этой дуге назначаем бесконечный вес.

2.5. Ну, значительно проще найти соседствующие шарики.

3) Для каждого изолированного цикла алгоритм придётся повторить.

Напоминаю, что это всего лишь канва алгоритма. Предлагаю её начать детализировать. Потом стыкуем с программой МихЧ.
Кстати, МихЧ писал про соединения встык, у меня это "трезубец", а в случае "|" ширина прям-ков может разниться.

Полагаю, что новый алгоритм построения графа лучше тем, что работаем с нестрогими прям-ками, и что в предыдущем надо находить точки пересечения прямых, и иногда склеивать несколько точек в одну вершину графа. В новом варианте склеек может не понадобиться, т.к. вершины графа мы фактически имеем с самого начала. Но это ИМХО. И мне всё же ещё работать надо. Обещанный скан смогу только послезавтра.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38831933
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Михаил Ч.Сделал вычесление "на лету" через UDF
При изменение значений в B2 и C2 маршрут сразу перерисовывается
Михаил, спасибо. теперь дело "за малым"...
За комментарии отдельная благодарность.

Заметил один из маршрутов прокладывается сначала по отрезку в одну стороны (влево) потом на на перекрестке разворачивается на 180° и дальше идет к точке назначения.
теперь не могу вспомнить между какими точками.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38831954
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Bobgos]Михаил Ч.теперь не могу вспомнить между какими точками.
Из "Точки 2" в "Точку 24", не правильно было указано ребро, поправил
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38831958
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точнее из 2й в 26ю
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38831964
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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-ре маршрута одного вида.
в случае с ромбами сложнее будет с пониманием в каких местах будут повороты. Будут пропуски и соответственно неверные трассы.
коридоры обводить надежнее. Можно минимизировать ошибки при вводе, проверяя, существует ли вводимая координата одной из точек коридора и обязательно соблюдая сопряжение областей. т.е. разрешить (точнее заставить пользователя подтвердить) запись координат только первой снимаемой области и задать ограничения - чтобы коридоры вносились при первом съеме координат последовательно сопряженные.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38831967
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Михаил Ч.,

как твое мнение по поводу ромбов предыдущего поста?
придется включать синусы/косинусы

Может подумать об упрощении исходной задачи - поочередной прорисовке одной трассы. Конечно цель была другая....
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38832365
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos, под трезубцем я имел ввиду множественные разветвления (греческая "Пси"), не важно.
В результате родился Вариант 3. Плагая,что почти окончательный при имеющихся упрощениях.

В отличие от Вар.2. соединяем не прямоугольники, а их срединные отрезки,тогда всё предельно упрощено.
Набросал рисунок. С этого места я бы уже начал писать прогу. Хочется верить, что схемой предусмотрено большинство ситуаций. Из видимых мне недостатков: в случае "кривых" коридоров и стыков отрисовка маршрута становится отдельной задачей.
Насчёт ромба - ну тогда можно треугольник.
И мой совет к проге. При неясности в реализации типа "найти пересечение" и т.п. пишите сабрутину-пустышку и забывайте о ней до отладки.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38832768
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos, немного пояснений.
По Варианту 3 допускается, что прям-ки необязательно стыкуются,поэтому я нарисовал нечто вроде синапсов.

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

Однако эта дуга необязательно тупик,т.к. после прохода по всей связной компоненте останутся изолированные компоненты. Их присоединяем похожим способом - зелёные окружности. В эти окретсности может попасть либо вершина,либо сторона. Если вершина,то ихорошо. У них д.б. радиус побольше. Процедура называется "найти ближайшую точку на отрезке среди всех отрезков".

Синие отрезки - это аналогичная процедура только от шариков.

И наконец отдельный случай - когда шарик в конце коридора. Т.к. заранее неизвестно у какого коридора,то рассматрриваем все терминальные вершины, оставшиесяпосле 1-го и 2-го прохода. У них нарисованы серые отрезки (но я не увсех нарисовал). К ним применяем процедуру присоединения шариков.

Склеивать или не склеивать совпадающие вершины - я бы не стал,даже если их координаты равны. Вершин получится сильно обольше, чем в идеальном случае. Возникающие в результате артефакты переносятся на этап отрисовки маршрута.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38833057
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если учесть, что прямоугольники (коридоры) всегда вертикальны или горизонтальны, тогда можно упростить задачу и найти более простое решение, подумаю над реализацией
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38833974
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Ч., а если в исходном плане огрехи?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38833985
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos,
вот я и проверил Вариант 3 на простом лабиринте как было в первом эксел-файле.
Сначала некотоые результаты меня удивили, поэтому счёл нужным лабиринт нарисовать. Страница во вложении. Файл будет тормозить, т.к. использовал условное форматирование. Для большей скорости формулы превратил в значения.

Масштаб 1 : 500, впрочем внизу я дал условные обозначения. На рисунке есть огрехи из-за целочисленности и отрицательных координат. И сам план конечно вверх ногами.

Все координаты точек рассчитаны формулами, так что алгоритм годный. Кстати вычислял в целых значениях. Такая точость не существенна.

Некоторые выводы по эксперименту.
1) Из 3-х проходов алгоритма я проделал только 1-й проход,т.к. из рисунка мне очевидно, что остальные 2 прохода сработают без проблем: присоединение изолированных прям-ков и шариков.

2) 1-й проход дал мало компонент графа. Существенную часть дадут 2-й и 3-й. Это зависит от того как разбивать каридоры на прям-ки. Было бы лучше для 1-го прохода ограничивать прям-ки "от перекрёстка до перекрёстка".

Например сейчас имеем один длинный горизонтальный прям-к во всю ширину плана. В результате вершина АО-45 находит только одну соседнюю АМ-49. Здесь перекрёсток типа Х, и я не ожидал, что прям-ки дают тип "два состыкованных Т-типа". Т.е. перекрёсток коридоров Х-типа отличается по типу от стыковки 3-х прям-ков.

3) Присоединение шарика как в ячейке DL-36. Здесь к нему подходят 2 коридора. Этот нюанс я не описывал, но если присоединять не терминальные вершины к шарику, а наоборот, то всё сработает

4) Ну и конечно достаточны существенны фактические расстояния между объектами. Я основывался на максимальной ширине коридора, а правильнее будет на адаптивной величине.

П.С. Теперь мы с МихЧ можем открыть контору и выполнять такие задачи, если даёте нам координаты точек.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38834682
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos, ответьте на такие вопросы:
1. вот эти прямоугольники, как я понял стены, они каких размеров бывают?
2. на какое расстояние по вертикали и горизонтали они могут быть перемещены при редактировании?

или программа, в которой Вы рисуете план, это вида обычного PAINTа?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38834974
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot,
на мой взгляд, прям-ки - это коридоры, их внутренность. А программа скорее всего автокад либо нанокад, ибо формат DWG.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38834983
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
За опечатки извините.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38835040
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98HandKot,
на мой взгляд, прям-ки - это коридоры, их внутренность. А программа скорее всего автокад либо нанокад, ибо формат DWG.

мне показалось по другому.
Просто донесу свою версию построения графа:
Пусть ширина коридора не может быть меньше и кратна "условной единицы".
Пусть ширина и толщина стен не может быть меньше и кратна "условной единицы".
Пусть размер помещения NxM условных единиц

Тогда создаем граф для помещения с количеством вершин NxM и размером вершины 1x1 "условная единица". У каждой вершины получается от 2 (по углам) до 4 (ни у края, ни в углах) связанных вершин.
После этого берем стену (прямоугольник) и выкидываем из графа те вершины, которые попали внутрь этого прямоугольника и так для всех стен.
В результате мы получим граф коридоров.
Поиск маршрута в нем уже дело техники.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38835303
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ошибка у меня. Какие нафиг 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.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38835315
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot, не понял вот этот посыл "размер помещения NxM ".
чем помещение оличается от коридора? А почему тогда у меня в последнем рисунке был один прямоугольник во всю ширину плана? - как раз коридор был. И средние точки в коридоры попали - противоречий не увидел,и шарики во вне коридоров. Ну просто координаты можно сравнить.

А вообще идея хорошая: формально вычеркнуть лишние связи. Граф только огромный будет.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38835358
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 )
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38835609
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKotBobgos, ответьте на такие вопросы:
1. вот эти прямоугольники, как я понял стены, они каких размеров бывают?
2. на какое расстояние по вертикали и горизонтали они могут быть перемещены при редактировании?

или программа, в которой Вы рисуете план, это вида обычного PAINTа?
1. прямоугольники которые помещения могут быть самых разных размеров Например: 2000х2000 или 20000х18000
Коридоры по длине неограничиваются. Ширина 800,1000, 1200, 1500, 1800, 3000, 3500, и так далее до 6000мм, а может и больше. ОБласти (теже коридоры внутри помещеений совсем разнообразны, но обычно не более 3000мм.

2. на любое. Задача - универсальный инструмент. взяли dwg прорисовали запуская из excel прямоугольники - коридоры, снимая координаты, указали точки - источники/назначения и рисуем что хотим excel. А рисуем мы трассы - полилини

3. программа: нанокад. тоже можно делать в автокад
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38835613
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 класс давно забыта, а тут... надо пробовать тогда будут возникать вопросы.
жду выходных, ибо спать элементарно не успеваю.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38835619
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKotexp98HandKot,
на мой взгляд, прям-ки - это коридоры, их внутренность. А программа скорее всего автокад либо нанокад, ибо формат DWG.

мне показалось по другому.
Просто донесу свою версию построения графа:
Пусть ширина коридора не может быть меньше и кратна "условной единицы".
Пусть ширина и толщина стен не может быть меньше и кратна "условной единицы".
Пусть размер помещения NxM условных единиц

Тогда создаем граф для помещения с количеством вершин NxM и размером вершины 1x1 "условная единица". У каждой вершины получается от 2 (по углам) до 4 (ни у края, ни в углах) связанных вершин.
После этого берем стену (прямоугольник) и выкидываем из графа те вершины, которые попали внутрь этого прямоугольника и так для всех стен.
В результате мы получим граф коридоров.
Поиск маршрута в нем уже дело техники.

да нужно задуматься об ограничениях.
1. Пусть ширина коридора не может быть меньше и кратна "условной единицы".
верна первая часть не может быть меньше 500
кратна - нет. т.к. прорисовывается по чертежу, который не проверяется на кратность. если конечно округлить, то можно принять толщину стены - 250 как шаг (точнее лучше 100 если учитывать сэндвич), после которого следующая проверяемая точка уже пересечет границы коридора -прямоугольника.
2. "Пусть ширина и толщина стен не может быть меньше и кратна "условной единицы". "
ширина -нет. возможны уступы для Z с любым расстоянием сдвига. Но проверить можно ширина и толщина не менее 100мм.
Значения можно внести в константы или заложить в конфигурируемые параметры модели
3. Пусть размер помещения NxM условных единиц
помещения - любого размера. Можно при съеме координат накладывать на общую сетку, т.е. применять те самые условные единицы. это несложно.

Зачем нам помещения? заново чертить все помещения не требуется, более того трасса может пролегать внутри помещения по виртуальным коридорам, которые прочерчиваются (при съёме модели чертежа в эксель) между оборудованием..
мы не говорим о модели всего чертежа. Размеры файлов могут достигать 100Мб, сложно будет. В слоях вечный беспорядок..... ИМХО проще всего обрисовать прямоугольниками коридоры для прокладки маршрутов.
Если сложно построить граф по прямоугольникам, лучше прочертить сразу граф осевых линий и определить пересечения этих линий. но это не даст возможность прочерчивать несколько трасс вдоль осевых линий без риска начертить трассы по стене или вообще по помещению за стеной. Например: коридор 800, по нему проходит 4 трасс, которые для восприятия должны иметь толщину не менее 150-200, т.е если будет минимальный отступ, 50, то как миним одна из трасс выйдет за пределы коридора.
Но пока чертим по осевым....
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38835626
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
???

Сори за невосприятие. А можно код с комментариями переложить в файл который сформирует хотя бы в черновичке граф?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38836174
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, толщину стенки принимаем в пол кирпича))

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

П.С. Выше почти код, буквы только убрать. Кто хотел бы, давно бы сюда выложил, а при такой писанине я отдыхаю, а не работаю.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38836603
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98 усовершенствую немного - строим сетку на плане , сетка с некоторым шагом. Кратность шагу не требуется (например задаём параметром для каждого плана ~ 1/100). Координаты задаются для помещений , которые удобнее представлять как набор прямоугольников, + как-то надо задать пространство , чтобы шарики были связаны с коридорами, иначе граф не найдёт к ним пути. "Виртуальные коридоры" придётся дополнительно оцифровывть снаружи прям-ками.
Далее вычеркнуть все клеточки, которые полностью либо частично перекрываются с помещениями. Из оставшихся клеток сам собою остаётся связный граф с дугами длиной в 1 шаг. Легко программировать, если всё прямоугольное. Линии могут оказаться не прямыми, а ступеньчатыми, но это зависит уже от алгоритма построения пути, как он выбирает минимум. Это ИМХО.

Вы правильно поняли мою идею. Я просто, еще со школы, плохо доношу свои мысли в повествовательной форме
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38837657
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
SELECT CASE
    CASE IS  (d1 < d0 AND d2 < d0)         '' сорри, забыл как это точно пишется
         REM  "Z0 внутри отрезка и не совпадает с его концами"
         ''d - вычислено ранее
   CASE (d1 = d0)      '' здесь пригодилась целочисленность значений
         REM  "Z0 совпадает с Z1"
         ''d - вычислено ранее
   CASE (d2 = d0)      '' здесь пригодилась целочисленность значений 
        REM  "Z0 совпадает с Z2"
         ''d - вычислено ранее
  CASE  ELSE
        REM  "Z0 вне отрезка и не совпадает с его концами"
        d= MIN(d1, d2)
        IF d=d1 THEN  
              '' Z0 ближе к Z1, добавить в граф  Zt,  соединить Zt  с  Z1 
        ELSE 
              '' Z0 ближе к Z2, добавить в граф  Zt,  соединить Zt  с  Z2
        END IF
END SELECT


Или неправильно?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38838892
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exp98,
синтаксис поправил, но не очень помогло. к чему приклеить сие... к перебору каждого направления от точки Z2?
сверьте, верно ли воспринято описания на картине.


Вопросы:
1. Встал остро вопрос с чем сравнивать: т.е. отрезок CD - он имеется и их много. но во первых - сравнив вхождение точки Zt в отрезок Z1Z2 если Zt=Z2, успех и выход, во вторых если съеме моделей коридоров, сразу будут пересечения, то Z0 будет находиться на Z1Z2.
Выбирать для перебора отрезки CD, только которые перпендикулярны Z1Z2?
тогда как быть со смещенными параллельными осями коридоров?
2. Так я понимаю, что предлагается удалять точки Z2, если Zt в пределах толщины стены.
Т.е. заменить отрезок Z1Z2 на отрезок Z1Zt.
Верно?
Но тогда а) сначала понять какую точку менять, если исходные данные - прямоугольники. Концы осевого отрезка оси коридора найти можно по 4-м точкам коридора, а вот наоборот - не выходит б)и даже если не вносить изменения в модель коридоров(прямоугольников) - нужно снова проверить направления от точки Z2?
3 Самое главное - что откуда вызвать.
Пример кода VBA в Эксел будет самым полезным советом.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38839155
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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-м точкам коридора, а вот наоборот - не выходит Как же нет, ежели прям-к задан?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38839158
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos, начать рисовать блок-схемы будет хорошим советом. Не держите всё в голове.

О, идея! Давайте начнём с конца, с 3-го прохода алгоритма.
Исходные:
У нас построен граф по всем прям-кам. Этот граф оказался связным. А шарики ещё не присоединены.
Ваша блок-схема алгоритма?
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38840101
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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. ЗАПИСЫВАЕМ ребро на лист графа для текущего потроения

....
запускаем поиск пути
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38840105
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BobgosдельтаX = iif(Z1(x)>A(x), Z1(x)-A(x),-Z1(x)+A(x))
чувствую = найдется ближайшее расстояние до отрезка Z1Z2 для которого A(y) выходит за пределы диапазона Z1(y)...Z2(y) - это будет еще одним добавляемым условием.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38841991
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. Таки да, "запускаем поиск пути".

Есть принципиальные возражения, поправки?

Замечание.
Да, для произвольного плана есть шансы, что если рядом с шириком за углом будет коридор, который значительно Уже нужного нам коридора, то можно ошибочно выбрать узкий. Но если в алгоритме заменить "расстояния до осевых отрезков" на "расстояния до сторон прям-ка", то в большинстве случаев алгоритм выберет то, что надо. Предлагаю сейчас не делать эту замену, а сделать её после написания всего.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38842030
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю некую рыбу для начала.
В макросе попробуйте разобраться с назначением массивов, которые описаны как PUBLIC.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38842234
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более свежая рыба, более приблИженная к последним пунктам 1,2,3,4. Чего в ней не хватает для полноты?
Предыдущая теперь не первой свежести, можнобы и удалить.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38844284
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот улучшенная версия. По сравнению с предыдущим файлом поменял местами некоторые мелкие функциональности.
Во всяком случае реализованы низкоуровневые процедуры и можно легко заносить точки в массив POINTS(), и т.о. можно проверить эту часть концепции на вшивость. При этом граф заполнять и необязательно, т.к. он не используется.

В конце поместил группу функций для красивой работы с координатами точек - код теперь компактней.
Предыдущий файл можно выкинуть.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38844317
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А здесь координаты: концы отрезков и шарики.
Рядом текст выражения, чтобы копи/вставка прямо в эксэл ... и можно проверять.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38844318
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вложение здесь
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38844756
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, доделал пример 3-го прохода. Угрохал весь день. В ходе отладки я пришёл к выводу, что 1-й и 2-й проходы реализуются очень похожим способом, так что самая существенная часть сделана. Конечно, для полноты ещё будут изменения, например уже есть дублирующие друг друга процедуры, а так - годится. Как всегда всё предыдущее можно выкинуть.

Исходные отрезки и шарики на листе Лист1. Для него служебный лист Т. Диапазон координат задан в константах макроса. Результат графа см. на листе граф.

Поскольку 1-й и 2-й проходы не имитировал, то и начальный граф был пустой, так что не удивляйтесь, что почти все вершины изолированы дргу от друга. И тут как раз наглядно видно, что в ходе вычислений ДУГА может дробиться и исчезать, при этом ОТРЕЗОК в массиве каким был, таким и остался. Зато появились новые точки, ставшие вершинами графа.

Я обвёл рамкой 3 области, идущие подряд:
- концы отрезков
- шарики
- вычисляемые точки присоединения шариков, если они новые.
И да, значения в графе сейчас = расст. между точками либо 0, если точки не связаны. а для стыковки с нахождением пути, потребуется в дальнейшем заменять 0 на бескон-сть, но контекстная замена заменит также и правильные 0 - это надо в макросе менять.

Ну вот, есть материал для развития. Взамен поделитесь, какими макросами экспортировать данные из dwg? Изучать неохота.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38844759
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну просто не знаю, с первого раза файл не крепится, уже не первый раз.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38844760
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98Ну просто не знаю, с первого раза файл не крепится, уже не первый раз.а) включи "быстрый ответ"
или
б) присоединяй файл после предпросмотра сообщения
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38845740
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, да-да, так и показалось, что просмотр сбивает. Или наверно можно без просмотра.


Bobgos, если ещё интересуетесь, фактически готово. Только алгоритм пока не очень умный как предполагалось, зато программа закончена малыми усилиями. Здесь ещё есть недоделки - некотрые полезные дуги не создаются, но это легко доработать.
Жду Ваших вопросов.

Я приложил картинку графа по исходным данным, нарисовано автоматом, не мною. Здесь только топология, без расстояний.
Читать её надо так.
Номера вершин 1 - 42 - это концы отрезков
43 - 71 - шарики
72 - ... - новые точки, присоединения шариков, стыковки отрезков и т.д. У них могут быть нулевые расстояния, но на рисункеэто конечно не отображено.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38846855
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всех с наступающим НГ и каникулами!
Не сочтите маньяком. Для проверки нарисовал последний рисунок: коридоры, дуги графа и шарики, из которого сразу увидел ошибки. Они технические, найдём и исправим. В след. году.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38846984
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну ты даёшь! Спасибо огромное. Шампанского к Новому году точно надобно.
Последний рисунок уже в dwg?

Выложи обновление xls. Глядя на картинку, возникает подозрение что ошибки не только технические.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38847322
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох, и надоело же простыни писать(
Рисовал в 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. За хорошую плату бы сделал, потому что мой проект закрыли, а за полгода так и не плачено. И время самое удачное для поиска, может придётся переквалифицироваться в управдомы.

Всех с НГ!
Файл прилагаю.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38847672
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exp98,

круто, если оставить в сторону графику на php то реальный код всего-то 3-4 листа А4.
тормоза из-за полурешений - использования формул листа - тоже поправимо. Обращаться к каждой ячейке, не отключая screnupdate...
Спасибо большое.

Вижу решение не слишком-то и сложно, но требует комплексной доработки.
К сожалению, тоже нет возможности полностью посвятить неделю (мне видимо потребуется значительно больше времени) на поиск ошибок. Проще переписать код заново, используя логику, которую принял в файле graf.

Объясни какой смысл коде:
'' Заглушка.
OtrCnt = 0
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
'' Примеры создания и доступа. Иниц массив точек и отрезков
OtrCnt = OtrCnt + 1 '' тек. кол-во отрезков
PntCnt = PntCnt + 1: PNTS(PntCnt) = z1: PNTSType(PntCnt) = 1 '' тек. точка А
Otres(OtrCnt).IDA = PntCnt
PntCnt = PntCnt + 1: PNTS(PntCnt) = z2: PNTSType(PntCnt) = 2  '' тек. точка В
Otres(OtrCnt).IDB = PntCnt

SpherCnt = SpherCnt + 1
PNTS(PntCnt + SpherCnt) = zs: PNTSType(SpherCnt) = 3  '' тек. шарик
'' конец одной порции иниц.


если затем заносятся настоящие значения?

тот же вопрос относительно:
Код: vbnet
1.
2.
3.
4.
5.
'' Создать новые шарики
SpherCnt = 0
SpherCnt = myNewSpher(4422, 36840)  '' ID=1
SpherCnt = myNewSpher(15063, 43937) '' ID=2
SpherCnt = myNewSpher(11990, 39390) '' ID=3
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38847676
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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, Мыло в личку скинь. Будет полезно пообщаться в узком кругу.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38847692
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, надеюсь понятно.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38847693
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38847694
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рнр
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38849519
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobgos, ну что же, погодка блгаоприятствовала. Это вроде всё, что я обещал. Макрос во вложении. Получилось даже лучше и проще, чем ожидал. Граф далеко не оптимальный, но и неважно, это макет. Проверять можно, отключая запись на лист дуг для тех или иных вершин. Стыковку 2-х и более виртуальных коридоров с одним шаром можно обеспечить на 2-м (3-м ...) прогоне разными способами.
Например, отключив сравнение шара с уже подключённым отрезком => он соединится с другим прям-ком.
А можно открыть окно Imidiate, и непосредствено в нём выполнить команду вида GR(i,j)=1400 или какое там расстояние д.б.
Или создать чёрный список.

Теперь отмазка! Как в любой задаче распознавания возможны 2 типа ошибок: 1-го и 2-го рода, об этом я уже упоминал. Немножко регулировать можно отсевом по расстоянию, а если нет, то для каждого плана руками. Вместо бесконечности я заносил константу NOL=-1 - это к вопросу о стыковке с поиском пути.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38849520
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
php, а рисунок не изменился, вернее изменение не видно.
...
Рейтинг: 0 / 0
Поиск маршрута vba и dwg
    #38864831
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё раз здравствуйте!
Для тех кто в теме в порядке завершения: кому интересен функционал отрисовки путей на графе, стучитесь, т.к. здесь рнр не профильно. Функционал на php, но код порзрачен ибез труда перекладывается на любойязык.

Приложен фрагмент рисунка, с кратчайшим путём.
Скрипт рисует путь на графе 3 раза:
- без смещения / и вправо / влево на неск. пикселов - задаётся константой. Это не сделать на 1-2, т.к. надо обрабатывать повороты по внешней и внутренней траектории.

Для проверок я повернул исходные координаты точек на 30град относительно подложки, а саму подложку не трогал.
Так что рисуется в большой мере независимо от прямых углов и направления. Даже специально сдвинул одну из точек ради острых и тупых углов траектории. Хотя какие-то недостатки наверное остались. Ещё возможно, что со временем упрощу и эту обработку.

Фактическая ошибка траектории у шарика 52 (и у аналогичных) сохранилась от недоработки VBA алгоритма (либо устраняется полуручным исправлением графа там либо здесь). При необходимости алгоритм могу доработать на повторяющиеся ошибочные и другие специальные случаи. Просто разовые случаи легче исправить руками.
...
Рейтинг: 0 / 0
101 сообщений из 101, показаны все 5 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Поиск маршрута vba и dwg
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]