Пересечение двух 3dFace

Автор Тема: Пересечение двух 3dFace  (Прочитано 3547 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Пересечение двух 3dFace
« : 09-11-2017, 17:02:26 »
Подскажите, с какими параметрами нужно вызвать метод IntersectWith
Мне нужно получить общую линию пересечения двух объектов 3dFace

3dface obj1 = ...
3dface obj2 = ...
Один из 3dface всегда параллелен плоскости XY (рассматривается как горизонталь определенной высоты)
obj1.IntersectWith(obj2,...)

В результате нужно получить набор точек пересечения
Без учета частных случаев параллельности и т.п.




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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение двух 3dFace
« Ответ #1 : 09-11-2017, 17:17:29 »
Тут чистая аналитическая геометрия - готовых методов в AutoCAD .NET API для этого нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Пересечение двух 3dFace
« Ответ #2 : 09-11-2017, 17:22:26 »
Тут чистая аналитическая геометрия - готовых методов в AutoCAD .NET API для этого нет.
Э-эх! Опять мозги включать!

как на картинке по красной линии нужно получить две точки p1 и p2
 


Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Пересечение двух 3dFace
« Ответ #3 : 09-11-2017, 17:43:23 »
Как один из алгоритмов:
1. Получаем плоскости для обеих 3D Face (объекты Autodesk.AutoCAD.Geometry.Plane).
2. Находим линию их пересечения (есть соответствующий метод у плоскости).
3. Определяем точки пересечения этой линии и линий границ нужной 3D Face.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение двух 3dFace
« Ответ #4 : 09-11-2017, 17:57:17 »
Как один из алгоритмов:
1. Получаем плоскости для обеих 3D Face (объекты Autodesk.AutoCAD.Geometry.Plane).
2. Находим линию их пересечения (есть соответствующий метод у плоскости).
3. Определяем точки пересечения этой линии и линий границ нужной 3D Face.
Похоже есть поинтереснее способ - сейчас нет возможности проверить:
1. Вместо Plane получаем BoundedPlane (задаётся тремя точками 3DFACE)
2. Пользуемся методом BoundedPlane.IntersectWith и сразу получаем отрезок (LineSegment3d)
Нужно только проверить, что будет если они не пересекаются. Подозреваю, что исключение и тогда скорость обработки будет ужасной.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Пересечение двух 3dFace
« Ответ #5 : 09-11-2017, 18:16:48 »
Проверил - возвращает null вместо LineSegment3d, исключений не возникает. Отличный инструмент!
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.EditorInput;
  3. using Autodesk.AutoCAD.Geometry;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. namespace AcadTest
  7. {
  8.     public class TestBoundedPlane
  9.     {
  10.         [CommandMethod("TestBoundedPlane")]
  11.         public void Run()
  12.         {
  13.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  14.             Editor ed = adoc.Editor;
  15.  
  16.             if (GetPoint(ed, "\nFirst1:", out Point3d firstPt1)
  17.                 && GetPoint(ed, "\nSecond1:", out Point3d secondPt1)
  18.                 && GetPoint(ed, "\nThird1:", out Point3d thirdPt1)
  19.                 && GetPoint(ed, "\nFirst2:", out Point3d firstPt2)
  20.                 && GetPoint(ed, "\nSecond2:", out Point3d secondPt2)
  21.                 && GetPoint(ed, "\nThird2:", out Point3d thirdPt2))
  22.             {
  23.                 BoundedPlane
  24.                     first = new BoundedPlane(firstPt1, secondPt1, thirdPt1),
  25.                     second = new BoundedPlane(firstPt2, secondPt2, thirdPt2);
  26.  
  27.                 LineSegment3d inters = first.IntersectWith(second);
  28.  
  29.                 if (inters != null)
  30.                 {
  31.                     ed.WriteMessage
  32.                         ("\nLine. Start point: {0}, end point: {1}",
  33.                         inters.StartPoint,
  34.                         inters.EndPoint);
  35.                 }
  36.                 else
  37.                 {
  38.                     ed.WriteMessage("\nNot intersected!");
  39.                 }
  40.             }          
  41.         }
  42.  
  43.         static bool GetPoint(Editor ed, string msg, out Point3d pt)
  44.         {
  45.             Matrix3d ucs2wcs = ed.CurrentUserCoordinateSystem;
  46.            
  47.             PromptPointResult ppr1
  48.                 = ed.GetPoint(new PromptPointOptions(msg));
  49.             if (ppr1.Status != PromptStatus.OK)
  50.             {
  51.                 pt = default(Point3d);
  52.                 return false;
  53.             }
  54.             pt = ppr1.Value.TransformBy(ucs2wcs);
  55.             return true;
  56.         }
  57.     }
  58. }
  59.  

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Пересечение двух 3dFace
« Ответ #6 : 12-11-2017, 11:05:28 »
Тут чистая аналитическая геометрия

Да если чисто по геометрии, то можно получить две точки пересечения отрезков.
Решив систему уравнений
1) Уравнение прямой
2) Уравнение плоскости (В моем случае уравнение плоскости для горизонтали упрощается до z=H )
и коорд. x y находятся тогда просто:

Код - vb.net [Выбрать]
  1. Imports CAD_GEO = Autodesk.AutoCAD.Geometry
  2. ...
  3.    ' p1 и p2 чтоки отрезка, H- высота горизонтали
  4.        
  5. Public Function GetXY_H(ByVal p1 As CAD_GEO.Point3d, _
  6.                         ByVal p2 As CAD_GEO.Point3d, _
  7.                         ByVal H As Double, _
  8.                         ByRef as pnt as CAD_GEO.Point3d) As Integer
  9.             If (Math.Abs(p2.Z - p1.Z) = 0) Then Return 1
  10.             Dim x As Double = (((H - p1.Z) * (p2.X - p1.X)) / (p2.Z - p1.Z)) + p1.X
  11.             Dim y As Double = (((H - p1.Z) * (p2.Y - p1.Y)) / (p2.Z - p1.Z)) + p1.Y
  12.             pnt = New VAD_GEO.point3d((x, y, H)
  13.             Return 0
  14.  
  15. End Function