которые стыкуются с блоками
пересекается с полилиниейТак стыкуются или пересекаются?
Правильнее будет все-таки стыкуется.В том виде как нарисовано в dwg-файле я не вижу способа обрабатывать информацию. Конечные точки полилинии не касаются блоков (т.е. имеется весьма ощутимый зазор). И скорее всего Entity.IntersectWith ничего не даст.
И костыль по типу координаты одного конца полилинии совпадает с координатами конца линии из блока не пройдет?Всё зависит постановки задачи. В общем случае (если нет ограничений на типы примитивов в блоке, масштаб по осям вставки блока и т.д.), то мягко говоря будет не слишком просто вычислить координаты линии, находящейся в блоке. И еще придётся пройтись по всем вставкам блоков, найти в них все линии, найти для каждой линии характерные точки и преобразовать в их в МСК, а затем их сравнивать с координатами вершин всех полилиний.
Единственное,что сейчас все работает тупо с перебором блоковПеребирать придётся в любом случае, но Дима_ подсказал как можно перебирать быстрее - пройтись по всем вставкам блоков в чертеже и сохранить в коллекции их BoundigBox'ы. Это может очень значительно ускорить процесс. Ну а следующая оптимизация - деревья.
Это не то же самое,что BoundingBoxes?Нет. Вы к каждому блоку запускаете долгую проверку на пересечение - а ее нужно запускать если только точка находиться в габаритах блока. С деревьями можно особо и не разбираться - а нагуглить готовые.
Это не то же самое,что BoundingBoxes?Нет. BoundingBox (точнее Entity.GeometricExtents) позволяет получить параллелепипед со сторонами параллельными осям X Y Z мировой системы координат (МСК), в который вписывается (полностью влезает) примитив.
Проблема была в том,что почему-то есть разница в номере конкретного блока между способом перебора и способом дерева.Индексировать по порядковому номеру - ихмо это очень плохая идея - лишнию сущность вводите - бесполезную. Либо ObjectId с дальнейшим извлечением объекта из транзакции (надежный метод - при "правильной" реализации), либо (если памяти не жалко) сразу объект блока - но можно попасть на переполнение памяти с "зависоном" или фаталом. У вас получается сложены худшие стороны обоих методов.
если только точка находиться в габаритах блока.
Есть коллекция BoundingBox. Как проверить что точка попала в это параллелепипедМожно чисто геометрически: x1 <= X <= x2, y1 <= Y <= y2, z1 <= Z <= z2. Тут X, Y, Z - координаты проверяемой точки. x1, y1, z1 - минимальная точка BoundingBox. x2, y2, z2 - максимальная точка BoundingBox.
Можно чисто геометрически: x1 <= X <= x2, y1 <= Y <= y2, z1 <= Z <= z2. Тут X, Y, Z - координаты проверяемой точки. x1, y1, z1 - минимальная точка BoundingBox. x2, y2, z2 - максимальная точка BoundingBox.Наверное это самый оптимальный и быстрый способ. Можно еще через BoundBlock3d, у которого есть метод Contains.
Можно чисто геометрически: x1 <= X <= x2, y1 <= Y <= y2, z1 <= Z <= z2. Тут X, Y, Z - координаты проверяемой точки. x1, y1, z1 - минимальная точка BoundingBox. x2, y2, z2 - максимальная точка BoundingBox.
Его параллелепипед будет фиолетовым или голубым?А что у тебя фиолетовый и голубой - это параллелепипеды? BoundingBox - это прямоугольный параллелепипед, со сторонами параллельными осям координат:
В чём подвох.Подвоха здесь никакого нет. В твоём случае задача совершенно другая. И вот когда ты сможешь сформулировать задачу - тогда станет понятно как её решать.
просто определить принадлежность точки полигону - это очень дорогая операцияЕсли многоугольник выпуклый, то определить принадлежность точки достаточно просто - Учёт числа пересечений. В ссылке описано как раз. Просто пускаете луч в одну сторону из точки - если пересек многоугольник четное число раз, значит точка снаружи, если нечетное - точка внутри
Если многоугольник выпуклый, то определить принадлежность точки достаточно просто - Учёт числа пересечений. В ссылке описано как раз. Просто пускаете луч в одну сторону из точки - если пересек многоугольник четное число раз, значит точка снаружи, если нечетное - точка внутринадо определить пересечения со всеми гранями полигона - а если их миллион?
Например, для треугольника вариант с BoundingBox может дать ой какие неверные результаты. Причем, чуть ли не с 50% погрешностью.так с помощью BoundingBox мы делаем лишь первичную фильтрацию, отсеиваем заведомо ложные варианты. А потом уже применяем нормальные проверки
Если многоугольник выпуклый, то определить принадлежность точки достаточно просто - Учёт числа пересечений.Не важно выпуклый или не выпуклый.