Получение объектов, входящих внутрь полилинии

Автор Тема: Получение объектов, входящих внутрь полилинии  (Прочитано 6581 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Оффлайн alexeyOMGАвтор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Всем привет!

У меня вопрос. Как можно получить все объекты, входящие внутрь полилинии (границы этих объектов с полилинией не должны пересекаться)?

В следующем куске кода

Код - C# [Выбрать]
  1. var ed = doc.Editor;
  2. var polyline = ...;
  3. // Вот здесь я получаю коллекцию узлов полининии
  4. AutocadApplicationGeometry.Point3dCollection ptOneColl = PolyToPoint3dCollection(polyline);
  5. AutocadApplicatioEditorInput.PromptSelectionResult psrSelectWindows = ed.SelectWindowPolygon(ptOneColl);
  6. var objectIds= psrSelectWindows.Value.GetObjectIds();
  7.  

Но. На то метод и называется "SelectWindowPolygon", что он высчитывает по полигону (прямые линии у границ), составленному из узлов полилинии.
Но полилинии могут состоять и из дуг. А это косяк жесткий. Так как объект может находиться около дуги и по сути входить внутрь полилинии, а по факту построится такой полигон, что этот объект будет лежать прям на линии полигона, а значит не попадет в итоговую выборку (а должен).

Я думал, что можно временно создавать дубликат текущей полилинии, которая будет располагаться прям поверх исходной. Но у новой полининии на дуге поставить кучу узлов на их протяжении (чтобы в итоге из узлов этой полилинии можно было сделать полигон, но не бояться за то, что углы где-то срежутся). Только я не знаю, как это сделать.
Но мб есть и более человеческий и простой вариант :)
Поэтому и вопрос: как мне можно реализовать получение объектов, входящих внутрь замкнутой полилинии, которая состоит не только их прямых отрезков, но и из дуг?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13881
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Но мб есть и более человеческий и простой вариант
Нету. Правильный вариант - это сначала отобрать все объекты, которые теоретически могут попасть внутрь контура (например, по BoundingBox), а потом уже проверять попадают ли они в действительности (тут всё будет значительно сложнее и зависит от типа примитивов, которые нас могут интересовать).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение alexeyOMG 25-09-2016, 18:17:10

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13881
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Я думал, что можно временно создавать дубликат текущей полилинии, которая будет располагаться прям поверх исходной. Но у новой полининии на дуге поставить кучу узлов на их протяжении (чтобы в итоге из узлов этой полилинии можно было сделать полигон, но не бояться за то, что углы где-то срежутся). Только я не знаю, как это сделать.
Здесь в коде есть алгоритм аппроксимации любой кривой (не только полилинии): http://adn-cis.org/poluchenie-tochek-peresecheniya-krivoj-i-ploskosti.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13881
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще хочу напомнить, что точки, которые передаются для SelectWindowPolygon должны быть в ПСК и все (!!!) видны на экране.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн alexeyOMGАвтор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Еще хочу напомнить, что точки, которые передаются для SelectWindowPolygon должны быть в ПСК и все (!!!) видны на экране.

Да, спасибо. Я знаю. Я перед расчетом делаю зум по размерам полилинии так, чтобы она вся отображалась.

Но мб есть и более человеческий и простой вариант
Нету. Правильный вариант - это сначала отобрать все объекты, которые теоретически могут попасть внутрь контура (например, по BoundingBox), а потом уже проверять попадают ли они в действительности (тут всё будет значительно сложнее и зависит от типа примитивов, которые нас могут интересовать).

А как тогда реализовать проверку "а потом уже проверять попадают ли они в действительности" ?
Как проверить вхождение границ объекта внутрь полилинии?
Даже если взять просто координаты обычной точки, то как проверить, что мы кликнули внутри полилинии?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13881
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Даже если взять просто координаты обычной точки, то как проверить, что мы кликнули внутри полилинии?
Ну это то совсем просто. Даже статья есть на эту тему: http://adn-cis.org/kak-sredstvami-opredelit-raspolozhenie-tochki-otnositelno-kontura.html
Для BoundingBox можно проверить попадание внутрь полилинии всех четырёх граничных точек.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение