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

ADN Club => AutoCAD .NET API => Тема начата: Podushkin от 01-07-2021, 23:26:48

Название: Интерполяция высот
Отправлено: Podushkin от 01-07-2021, 23:26:48

(https://i.postimg.cc/rKbHcqTr/image.jpg) (https://postimg.cc/rKbHcqTr)

Вечер добрый! Долбаюсь над вот таким вопросом. Видимо не понимаю до конца работу с плоскостью. Есть фиолетовая и зеленая горизонтали, есть желтая 3д полилиния. Все синие точки на полилинии имеют Z = 0, крайние точки равняются высотам  линий с которыми они пересекаются. Как выстроить синие точки по высоте от желтой до красной.
Как решаю эту заадчу:
Создаю красную полилинию, далее от каждой синий точки по координате Z пускаю Xline. Нахожу пересечения Xline и красной полилинии. Присваиваю это значение синим точкам.
Выполняю в цикле:
Код - C# [Выбрать]
  1.  Vector3d sd = (vertices[vertices.Count - 1].Position - vertices[0].Position).GetNormal(); //Вот тут, как правильно направление вектора плоскости выбрать для проекции Xline и полилинии?
  2.                             Vector3d sd2 = new Vector3d(sd.X, sd.Y, 0).RotateBy(90.0, new Vector3d(0, 0, 1));
  3.  
  4.                          
  5.                             Plane planeXoy2 = new Plane(Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem.CoordinateSystem3d.Origin, sd2);
  6.                          
  7.                             var xline = new Xline();
  8.                             xline.BasePoint = vertices[j].Position;
  9.                             xline.UnitDir = Vector3d.ZAxis;
  10.  
  11.                             Point3dCollection ip2 = new Point3dCollection();
  12.                             xline.IntersectWith(polyline, Intersect.OnBothOperands, planeXoy2, ip2, IntPtr.Zero, IntPtr.Zero);
  13.                             if (ip2.Count != 0)
  14.                             {
  15.                                 // открываем объект на запись
  16.                                 vertices[j].UpgradeOpen();
  17.                                 // перемещаем вхождение блока
  18.                                 vertices[j].Position = new Point3d(vertices[j].Position.X, vertices[j].Position.Y, ip2[0].Z);
  19.  
  20.                             }
  21.                             if (ip2.Count == 0)
  22.                             {
  23.                                 DrawCircle(vertices[j].Position.X, vertices[j].Position.Y);
  24.                             }
  25.                        
  26.                             Entity entity3 = (Entity)tr.GetObject(polyline.Id, OpenMode.ForWrite, false, true);
  27.                             entity3.Erase();
Название: Re: Интерполяция высот
Отправлено: Александр Ривилис от 01-07-2021, 23:41:42
Вот тут, как правильно направление вектора плоскости выбрать для проекции Xline и полилинии?
Какой плоскости? Я тут не вижу никакой плоскости.
Название: Re: Интерполяция высот
Отправлено: Podushkin от 01-07-2021, 23:44:24
Да, это вектор, на основании которого я в дальнейшем создаю plane
Название: Re: Интерполяция высот
Отправлено: Podushkin от 01-07-2021, 23:45:17
Вероятно для решения этой задачи я иду нн по тоиу пути
Название: Re: Интерполяция высот
Отправлено: Александр Ривилис от 01-07-2021, 23:45:50
Вероятно для решения этой задачи я иду нн по тоиу пути
Мне тоже так кажется.
Название: Re: Интерполяция высот
Отправлено: Podushkin от 01-07-2021, 23:52:34
Александр, в какую сторону копать?
Название: Re: Интерполяция высот
Отправлено: Владимир Шу от 02-07-2021, 09:13:13
ИМХО, что то Вы перемудрили.
Я бы и желтые точки опустил на Z=0, после чего расстояние между желтыми точками принял бы за единицу(длину линии), расстояние от начальной желтой точки до синей, как часть от единицы и эту часть от единицы умножил бы на разность высот желтых точек. Так получил бы приращение Z координаты для синих точек относительно начальной желтой точки, ну и потом вернул бы точки 3d полилинии на полученные отметки.
Это самый простой вариант, не учитывающих всяких петель и крутых загогулин, но можно учесть и их, для этого нужны не сами синие точки, а их перпендикулярные проекции на красную линию... 
Название: Re: Интерполяция высот
Отправлено: Дмитрий Загорулькин от 02-07-2021, 14:29:52
Создаю красную полилинию, далее от каждой синий точки по координате Z пускаю Xline. Нахожу пересечения Xline и красной полилинии. Присваиваю это значение синим точкам.
Вообще, строго говоря, строить отрезок между точками пересечения и выстраивать, опираясь на него - это неправильный подход. И он будет давать погрешность, которая будет сильнее сказываться, когда горизонтали будут сильнее изгибаться и 3D полилиния будет сильнее отклоняться от перпендикуляра к горизонталям.
P.S. Правильнее будет для каждой точки полилинии отдельно вычислять отметку по такой методике: https://einsteins.ru/subjects/inzhenernaya-geodeziya/zadachi-inzhenernaya-geodeziya/opredelit-vysotu-tochki
Название: Re: Интерполяция высот
Отправлено: Александр Ривилис от 02-07-2021, 15:16:48
Podushkin,
Подсказка Дмитрий Загорулькин на мой взгляд оптимальная. От точки находишь ближайшие на двух полилиниях-горизонталях и при помощи пропорции (расстояние от точки до проекций полилиний на плоскость X0Y) находишь отметку Z для этой точки. Вообще же если у тебя есть триангуляция, то правильнее для получения Z находить проекции точки на треугольник над этой точкой.
Название: Re: Интерполяция высот
Отправлено: Дмитрий Загорулькин от 02-07-2021, 17:22:14
Вообще же если у тебя есть триангуляция
... то надо в Civil 3D создать поверхность из треугольников (https://knowledge.autodesk.com/ru/support/civil-3d/troubleshooting/caas/sfdcarticles/sfdcarticles/RUS/Creating-Surface-from-3D-Faces.html), из 3D-полилинии создать характерную линию (https://knowledge.autodesk.com/ru/support/civil-3d/learn-explore/caas/CloudHelp/cloudhelp/2018/RUS/Civil3D-UserGuide/files/GUID-EE3E1463-2BCE-45D9-98EE-24E984D2E2E2-htm.html) и поднять её на поверхность (https://knowledge.autodesk.com/ru/support/civil-3d/learn-explore/caas/CloudHelp/cloudhelp/2018/RUS/Civil3D-UserGuide/files/GUID-07357A77-3973-4D5D-AED9-8A2AB6327D25-htm.html)  8)
Название: Re: Интерполяция высот
Отправлено: Александр Ривилис от 02-07-2021, 17:25:13
Дмитрий Загорулькин,
Ну при наличии Civil 3D тут вообще нечего программировать...
Название: Re: Интерполяция высот
Отправлено: Podushkin от 02-07-2021, 21:29:50
Спасибо всем