Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Алексей Терно от 21-09-2018, 13:51:51
-
Задача заключается в объединении нескольких замкнутых полилиний в одну.
Сейчас я решаю эту задачу следующим образом:
- Создаю области (Region) из каждой полилинии
- Для каждой области провожу операцию объединения (BooleanOperation(BooleanOperationType operation, Region otherRegion))
- Разбиваю полученную область и получаю набор линий и дуг
- Объединяю все полученные объекты в одну полилинию
Этот алгоритм работает корректно, но с двумя большими минусами:
- очень долго - если обрабатываются сотни полилиний, то весь процесс может занимать минуту или больше
- не стабильно - бывают случаи, когда область не создается по полилинии, если у нее сложная геометрия, и итоговый результат получается неверным
Я хочу заменить работу с областями на какой-то другой алгоритм, но пока не знаю на какой. Какие способы объединения (вычитания и пересечения) знаете вы?
PS. команда для C3D, так что можно использовать объекты C3D )
-
Я хочу заменить работу с областями на какой-то другой алгоритм, но пока не знаю на какой. Какие способы объединения (вычитания и пересечения) знаете вы?
Готового алгоритма в AutoCAD API нет. Есть класс CurveCurveIntersector3d, который позволит идентифицировать пересечение кривых (GE-кривых, т.е. полилинии сначала следует преобразовать в Curve3d). Он позволяет получить информацию о точках пересечния, характере пересечения, наложения и т.д. Ну а дальше уже самостоятельно нужно придумывать алгоритм для объединения.
-
Кстати, у Debalance (http://adn-cis.org/forum/index.php?action=profile;u=256) есть подобная программа.
-
пересечение кривых
Так мне не разделять, а объединять нужно ))
-
пересечение кривых
Так мне не разделять, а объединять нужно ))
Ты хочешь сказать, что не понял того, что я написал? Ты не понимаешь, что объединять нужно сегменты, получающиеся между точками пересечений контуров?
-
Curve3d - это же сегмент полилинии?
-
Curve3d - это же сегмент полилинии?
Нет.
-
Я бы пошел по более простому пути.
Вычислил бы размер фигур и нарисовал бы вокруг них прямоугольник с некоторым запасом и потом с помощью boundary (http://through-the-interface.typepad.com/through_the_interface/2010/06/tracing-a-boundary-defined-by-autocad-geometry-using-net.html) нашел бы общий контур, лишнее удалил бы. Все.
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Ficecream.me%2Fuploads%2F8ba958464985b6bd983992b799556c04.png&hash=defda0254ce065e2fc79ee8bc8057a4d)
-
Я бы пошел по более простому пути.
Вычислил бы размер фигур и нарисовал бы вокруг них прямоугольник с некоторым запасом и потом с помощью boundary (http://through-the-interface.typepad.com/through_the_interface/2010/06/tracing-a-boundary-defined-by-autocad-geometry-using-net.html) нашел бы общий контур, лишнее удалил бы. Все.
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Ficecream.me%2Fuploads%2F8ba958464985b6bd983992b799556c04.png&hash=defda0254ce065e2fc79ee8bc8057a4d)
Этот способ имеет такое количество ограничений и подводных камней, что используемый способ с Region значительно предпочтительней.
-
Этот способ имеет такое количество ограничений и подводных камней, что используемый способ с Region значительно предпочтительней.
А можно несколько больше подробностей? Мне не так часто требуется что-то объединить, но знать об ограничениях применимости данного метода ИМХО крайне полезно.
-
А можно несколько больше подробностей?
Достаточно того, что для работы _BOUNDARY (или её .NET или ObjectARX обертки) требуется видимость всех примитивов на экране.