aerohost Posted January 24 Report Share Posted January 24 Товарищи, добрый день. Кто то знает как найти определенный объект, например у вершины полиллинии (радиус поиска допустим 3м). Допустим я знаю координаты точек вершин, проверяю как то каждую вершину полиллиии, есть ли в радиусе 3 м от вершины объект полиллия, если есть, выбрать данный объект или получить уникальный код этого объекта (пример красный отрезок) или как то проверить лежать ли несколько объектов в одной и той же точки полиллинии. . Quote Link to comment Share on other sites More sharing options...
Ivanco Posted January 24 Report Share Posted January 24 незнаю как решать, но вероятно изначально нужно уточнить постановку задачи. "есть ли в радиусе 3 м от вершины объект полиллия" - что есть "есть". BoundingBox искомой поллинии пересекает область от вершины? сама полилиния пересекает область от вершины? только ли полинии ищем или вообще все? "проверить лежать ли несколько объектов в одной и той же точки полиллинии." - что есть объекты? вот блок нарисован и помещен поверх точки. при этом ни один из его примитивов не в точке полилинии и т.д. Вообщем, как по мне, нужно сперва четко определить какие случаи и по каким типам объектов ищем. P.S. ищут вероятно всякими IntersectWith() но врядли это есть в ActivX API. скорее на C++. Quote Link to comment Share on other sites More sharing options...
aerohost Posted January 24 Author Report Share Posted January 24 1 час назад, Ivanco сказал: незнаю как решать, но вероятно изначально нужно уточнить постановку задачи. "есть ли в радиусе 3 м от вершины объект полиллия" - что есть "есть". BoundingBox искомой поллинии пересекает область от вершины? сама полилиния пересекает область от вершины? только ли полинии ищем или вообще все? "проверить лежать ли несколько объектов в одной и той же точки полиллинии." - что есть объекты? вот блок нарисован и помещен поверх точки. при этом ни один из его примитивов не в точке полилинии и т.д. Вообщем, как по мне, нужно сперва четко определить какие случаи и по каким типам объектов ищем. P.S. ищут вероятно всякими IntersectWith() но врядли это есть в ActivX API. скорее на C++. Отойду от текста, попробую по картинке описать суть, чего я добиваюсь. Имеется магистраль ( 1-10 красный цвет), имеются три отпайки от магистрали( 4-12 желтая, 7-14 зеленая, 8-16). На данный момент я научился получать координаты всех точек магистрали (запросив через VBA выбрать полиллинию), расчитывать длину каждого сигмена полиллинии, длину всей полиллинии (1-10) Но хочется еще, что бы при выборе магистрали ( красной линии) еще бы посчитал длину (1-4-12), 1-7-14, 1-8-16. Я предполагаю это сделать, как описал выше, принадлежит ли желтая зеленая розовая линия магистрали, если да, то посчитай расстояние ( хоть одна из вершин зеленой розовой зеленой линии будет лежать\ принадлежать на красной линии) Quote Link to comment Share on other sites More sharing options...
Ivanco Posted January 25 Report Share Posted January 25 если "отпайки" всегда от "узлов" (точек полилинии), и координаты "отпайки" точно совпадают, с координатами узловых точек "магистрали" - это простая задача. можно просто "в лоб" решать, алгоритм только постарасться оптимальный по скорости(если важно). на C#, на том же LINQ - просто и быстро. в VBA такой радости нет - надо думать над алгоритмом оптимального перебора. 2 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted January 25 Report Share Posted January 25 22 минуты назад, Ivanco сказал: C# Вот да! Тоже сопротивлялся, типа сложно неудобно На шарпе море примеров, на порядки больше чем для вба Ну и быстродействие от вба или лисп на порядки отличается.. Имха вба как этап конечно нужен, но чем быстрее перейти на шарп, меньше времени впустую потерянного 1 1 Quote Link to comment Share on other sites More sharing options...
aerohost Posted January 25 Author Report Share Posted January 25 Понял, товарищи. Тогда буду погружаться в изучение с шарпа 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted January 25 Report Share Posted January 25 1 минуту назад, aerohost сказал: Понял, товарищи. Тогда буду погружаться в изучение с шарпа Адн-кис в помощь Quote Link to comment Share on other sites More sharing options...
aerohost Posted January 25 Author Report Share Posted January 25 12 минут назад, doctorraz сказал: Адн-кис в помощь Имеется опыт в джава и Котлин, думаю си Шарп обучусь в быстром темпе. Но возникли сразу пару вопросов. Как делать отладку dll файлов. И как в ncad делать "горячую" перезагрузку моего этого dll файла. Чтоб постоянно не перезагружать ncad и снова загружать dll файл. Планирую использовать sharpdevelop ,т.к она имеет версию протэбл. Quote Link to comment Share on other sites More sharing options...
doctorraz Posted January 25 Report Share Posted January 25 16 минут назад, aerohost сказал: Но возникли сразу пару вопросов коль эта тема vba, предлагаю по отладке dll создать отдельную, тем боле кажется еще не было... 1 Quote Link to comment Share on other sites More sharing options...
Lion007 Posted February 3 Report Share Posted February 3 вообще-то можно сделать финт ушами. перебирать весь чертеж - это может быть грустно, даже на плюсах, не говоря уже о vba и прочих лиспах. да и вообще унизительно. а если при этом надо еще что-то посчитать (вроде попадания в область) так и вовсе. соответственно, первое что приходит в голову (ну, по крайней мере мне) - это сузить область поиска. ну и запросто : берем и запускаем обычную crossing-селекцию ректом. рект, естественно, задаем такой, чтобы в него как раз вписался тот самый нужный радиус. отрабатывает совершенно штатная механика выбора, которая работает по пространственному индексу. то, что она реализована на уровне потрохов - это ладно, главный прикол именно в индексе - в результате там получается (среднепотолочно) примерно логарифмическая сложность. на всякий случай - это когда на чертеже из миллиарда объектов (фиг кто нарисует, но на то и теория) выборка отработает в 30 раз медленнее, чем на чертеже из одного объекта. в 30, а не в 1000000000. ну а дальше - мы получили список потенциальных кандидатов (который, вероятно, будет составлять незначительную часть от общего количества объектов) - ну и их уже перебираем руками, как понравится... прожевать десяток-другой объектов - с этим вполне справится и лисп, и vba! такая вот хистория... 1 Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted February 3 Report Share Posted February 3 (edited) Можно предложить еще немного уточнить условия задачи. Осуществляется ли поиск именно вершин полилиний или пересечение сегментов тоже считается искомой точкой? Что делать, если найденная вершина от другой полилинии не является конечной (стартовой)? Куда же бе дуговых сегментов? С ними как? И еще из экзотики: что делать если полилинии пересекает саму себя? Предполагая, что изначально задача звучала как-то так: Есть некая сеть канализации, представленная полилиниями. Колодцы - вершины полилиний. Переход с одной полилинии на другую может быть только в узлах. Необходимо проложить кабель из точки А в точку Б по кратчайшему маршруту по канализации. В такой постановке нет необходимости в поиске пересечения областей. Достаточно проверки на совпадение вершин с заданной точностью (единственный параметр). Условие задачи - выбранные полилинии или имеющие некий отличительный признак (например, слой) Ну и каким-либо образом указание точки А и Б. Теоретически возможно составить некую матрицу "из любой вершины в любую вершину". Хотя представление такой матрицы может быть затруднительным при большом количестве вершин. Отмечу, что у нас сейчас есть рабочая похожая задача, где есть несколько полилиний и составляется матрица пересечений всех со всеми между собой. Запаковано это все в vlx (но и в нане просто лиспами тоже работоспособно), считает во вменяемое время, результат сбрасывается в текстовый файл. На мой взгляд, лучше изначально почесать репу над постановкой задачи, решение может оказаться более простым, чем казалось вначале. Edited February 3 by EdwardSt 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.