Пересечение элементов

Автор Тема: Пересечение элементов  (Прочитано 18500 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Пересечение элементов
« : 22-07-2015, 11:05:51 »
Добрый день, мне необходимо узнать, пересекаются ли два  элемента в определенной точке?
В Dynamo есть готовый блок, который это делает.
На входе у него два параметра: геометрия одного элемента и точка пересечения, а на выходе результат типа bool.
Подскажите, пожалуйста, как этот метод реализовать средствами API?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Пересечение элементов
« Ответ #1 : 22-07-2015, 11:34:58 »
На входе у него два параметра: геометрия одного элемента и точка пересечения
Так выходит этот метод определяет не пересечение двух элементов в заданной точке, а находится ли заданная точка внутри заданной геометрии или нет.

По теме, решения вижу два:
1) Проверить находится ли заданная точка внутри каждого из элементов. Если точка находится внутри каждого из элементов, то элементы пересекаются в заданной точке.
2) Найти результат пересечения геометрии двух элементов. Если результат есть (т.е. если элементы пересекаются в принципе), то проверить, не находится ли заданная точка внутри полученной геометрии.

Найти пересечение двух геометрии элементов можно при помощи класса BooleanOperationsUtils.
Сейчас поищу, есть ли готовый метод для определения нахождения точки внутри геометрии. Если нет, то его несложно реализовать.

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Пересечение элементов
« Ответ #2 : 22-07-2015, 12:08:34 »
Пересечение двух геометрий не подходит, необходимо только с определенной точкой. Так как пересечений может быть несколько, а меня интересует конкретное.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Пересечение элементов
« Ответ #3 : 22-07-2015, 12:35:29 »
Пересечение двух геометрий не подходит, необходимо только с определенной точкой.
Так я и  не предлагал использовать пересечение в чистом виде.
Оба из предложенных варианта требуют определения, находится ли заданная точка внутри геометрии.

Посмотрел что есть из готовых методов. Подходящим мне показался метод Solid.IntersectWithCurve.
Естественно, имеется ввиду, что рассматриваемая геометрия элемента является твердотельным объектом.

Алгоритм таков:
1) Берете твердотельный объект из геометрии элемента.
2) Создаете линию, где началом является заданная точка, а конец находится где-то ближе к бесконечности.
3) С помощью метода Solid.IntersectWithCurve определяете сколько раз линия пересекает твердотельный объект
4) Если нечетное количество раз, то точка находится внутри твердотельного объекта, если четное, то за его пределами.

Подобный алгоритм я рассматривал вот в этой статье.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение элементов
« Ответ #4 : 22-07-2015, 12:51:32 »
Добрый день, мне необходимо узнать, пересекаются ли два  элемента в определенной точке?
На входе у него два параметра: геометрия одного элемента и точка пересечения, а на выходе результат типа bool.
А каким образом функция будет знать о существовании второго элемента? Что-то тут не чисто...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Пересечение элементов
« Ответ #5 : 22-07-2015, 14:23:28 »
Элементы пересекаются поверхностями, из второго элемента я передаю точку на поверхности. А из списка элементов я уже нахожу к какому элементу она еще принадлежит.

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Пересечение элементов
« Ответ #6 : 22-07-2015, 14:49:22 »
Виктор, а как элемент привести к типу SpatialElement или любому другому, чтобы получить из него границы?
При помощи Solid  я делаю так, но у меня кол-во сегментов постоянно 0.
Код - C# [Выбрать]
  1.                 Instance genInstance = genericEl as Instance;
  2.                 XYZ point = genInstance.GetTransform().OfPoint(new XYZ(0, 0, 0));
  3.                 Line line = Line.CreateBound(point, new XYZ(10000, 0, 0));
  4.                 Curve curve = line as Curve;
  5.                 foreach (var structElem in structuralElements)
  6.                 {
  7.                     GeometryElement geomElement = structElem.get_Geometry(new Options());
  8.                     foreach (GeometryObject geomObj in geomElement)
  9.                     {
  10.                         GeometryInstance instance = geomObj as GeometryInstance;
  11.                         foreach (GeometryObject instObj in instance.SymbolGeometry)
  12.                         {
  13.                           Solid solid = instObj as Solid;
  14.                            if (solid==null) continue;
  15.                             SolidCurveIntersection intersection = solid.IntersectWithCurve(curve, null);
  16.                             for (int n = 0; n < intersection.SegmentCount; n++)
  17.                             {
  18.                             }
  19.                         }
  20.                     }
  21.  


Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Пересечение элементов
« Ответ #7 : 22-07-2015, 14:52:21 »
Элементы пересекаются поверхностями, из второго элемента я передаю точку на поверхности
Если это точно известно, то задача сводится к "лежит ли точка на поверхности или нет".

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Пересечение элементов
« Ответ #8 : 22-07-2015, 14:56:02 »
а как элемент привести к типу SpatialElement
Никак. SpatialElement - это помещение или пространство.
Статью я привел в качестве объяснения алгоритма по нахождению точки внутри пространства.

но у меня кол-во сегментов постоянно 0
а переменная intersection чему равна после вызова метода
Код - C# [Выбрать]
  1. SolidCurveIntersection intersection = solid.IntersectWithCurve(curve, null);
?

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Пересечение элементов
« Ответ #9 : 22-07-2015, 14:59:39 »
Вот

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Пересечение элементов
« Ответ #10 : 22-07-2015, 15:22:42 »
Результат значит только одно - точка не находится внутри геометрии твердотельного объекта.
Судя по коду:
Код - C# [Выбрать]
  1.                 Instance genInstance = genericEl as Instance;
  2.                 XYZ point = genInstance.GetTransform().OfPoint(new XYZ(0, 0, 0));
  3.                 Line line = Line.CreateBound(point, new XYZ(10000, 0, 0));
  4.                 Curve curve = line as Curve;
Почему вы уверены, что точка point лежит на поверхности второго объекта?

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Пересечение элементов
« Ответ #11 : 22-07-2015, 15:29:45 »
 XYZ point = genInstance.GetTransform().OfPoint(new XYZ(0, 0, 0));
Так находится точка в скрипте Dynamo, передаваемая далее для нахождения элемента пересечения.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Пересечение элементов
« Ответ #12 : 22-07-2015, 15:36:15 »
Так находится точка в скрипте Dynamo
Так нам ведь не известно, как дальше происходит определение и по какому алгоритму.
по коду - точка является серединой границы элемента. Я не вижу причин, почему она должна лежать на поверхности второго элемента, так как с ваших слов
Элементы пересекаются поверхностями

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Пересечение элементов
« Ответ #13 : 22-07-2015, 15:37:18 »
Так находится точка в скрипте Dynamo
А Динамо эту точку откуда берет?

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Пересечение элементов
« Ответ #14 : 22-07-2015, 15:48:21 »
Из элемента, который точно пересекается с каким-то элементом из списка.