Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 09-11-2017, 17:02:26

Название: Пересечение двух 3dFace
Отправлено: Алексей (IdeaSoft) от 09-11-2017, 17:02:26
Подскажите, с какими параметрами нужно вызвать метод IntersectWith
Мне нужно получить общую линию пересечения двух объектов 3dFace

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

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



Название: Re: Пересечение двух 3dFace
Отправлено: Александр Ривилис от 09-11-2017, 17:17:29
Тут чистая аналитическая геометрия - готовых методов в AutoCAD .NET API для этого нет.
Название: Re: Пересечение двух 3dFace
Отправлено: Алексей (IdeaSoft) от 09-11-2017, 17:22:26
Тут чистая аналитическая геометрия - готовых методов в AutoCAD .NET API для этого нет.
Э-эх! Опять мозги включать!

как на картинке по красной линии нужно получить две точки p1 и p2
 
(https://s1.postimg.org/7iq5oemuff/image.png) (https://postimg.org/image/7iq5oemuff/)
Название: Re: Пересечение двух 3dFace
Отправлено: Дмитрий Загорулькин от 09-11-2017, 17:43:23
Как один из алгоритмов:
1. Получаем плоскости для обеих 3D Face (объекты Autodesk.AutoCAD.Geometry.Plane).
2. Находим линию их пересечения (есть соответствующий метод у плоскости).
3. Определяем точки пересечения этой линии и линий границ нужной 3D Face.
Название: Re: Пересечение двух 3dFace
Отправлено: Александр Ривилис от 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)
Нужно только проверить, что будет если они не пересекаются. Подозреваю, что исключение и тогда скорость обработки будет ужасной.
Название: Re: Пересечение двух 3dFace
Отправлено: Дмитрий Загорулькин от 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.  
Название: Re: Пересечение двух 3dFace
Отправлено: Алексей (IdeaSoft) от 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