Интерполяция высот

Автор Тема: Интерполяция высот  (Прочитано 9508 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Интерполяция высот
« : 01-07-2021, 23:26:48 »



Вечер добрый! Долбаюсь над вот таким вопросом. Видимо не понимаю до конца работу с плоскостью. Есть фиолетовая и зеленая горизонтали, есть желтая 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();

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Интерполяция высот
« Ответ #1 : 01-07-2021, 23:41:42 »
Вот тут, как правильно направление вектора плоскости выбрать для проекции Xline и полилинии?
Какой плоскости? Я тут не вижу никакой плоскости.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Re: Интерполяция высот
« Ответ #2 : 01-07-2021, 23:44:24 »
Да, это вектор, на основании которого я в дальнейшем создаю plane

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

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Re: Интерполяция высот
« Ответ #3 : 01-07-2021, 23:45:17 »
Вероятно для решения этой задачи я иду нн по тоиу пути

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Интерполяция высот
« Ответ #4 : 01-07-2021, 23:45:50 »
Вероятно для решения этой задачи я иду нн по тоиу пути
Мне тоже так кажется.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Re: Интерполяция высот
« Ответ #5 : 01-07-2021, 23:52:34 »
Александр, в какую сторону копать?

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Интерполяция высот
« Ответ #6 : 02-07-2021, 09:13:13 »
ИМХО, что то Вы перемудрили.
Я бы и желтые точки опустил на Z=0, после чего расстояние между желтыми точками принял бы за единицу(длину линии), расстояние от начальной желтой точки до синей, как часть от единицы и эту часть от единицы умножил бы на разность высот желтых точек. Так получил бы приращение Z координаты для синих точек относительно начальной желтой точки, ну и потом вернул бы точки 3d полилинии на полученные отметки.
Это самый простой вариант, не учитывающих всяких петель и крутых загогулин, но можно учесть и их, для этого нужны не сами синие точки, а их перпендикулярные проекции на красную линию... 

Отмечено как Решение Podushkin 02-07-2021, 21:30:08

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Интерполяция высот
« Ответ #7 : 02-07-2021, 14:29:52 »
Создаю красную полилинию, далее от каждой синий точки по координате Z пускаю Xline. Нахожу пересечения Xline и красной полилинии. Присваиваю это значение синим точкам.
Вообще, строго говоря, строить отрезок между точками пересечения и выстраивать, опираясь на него - это неправильный подход. И он будет давать погрешность, которая будет сильнее сказываться, когда горизонтали будут сильнее изгибаться и 3D полилиния будет сильнее отклоняться от перпендикуляра к горизонталям.
P.S. Правильнее будет для каждой точки полилинии отдельно вычислять отметку по такой методике: https://einsteins.ru/subjects/inzhenernaya-geodeziya/zadachi-inzhenernaya-geodeziya/opredelit-vysotu-tochki

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Интерполяция высот
« Ответ #8 : 02-07-2021, 15:16:48 »
Podushkin,
Подсказка Дмитрий Загорулькин на мой взгляд оптимальная. От точки находишь ближайшие на двух полилиниях-горизонталях и при помощи пропорции (расстояние от точки до проекций полилиний на плоскость X0Y) находишь отметку Z для этой точки. Вообще же если у тебя есть триангуляция, то правильнее для получения Z находить проекции точки на треугольник над этой точкой.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Интерполяция высот
« Ответ #10 : 02-07-2021, 17:25:13 »
Дмитрий Загорулькин,
Ну при наличии Civil 3D тут вообще нечего программировать...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Re: Интерполяция высот
« Ответ #11 : 02-07-2021, 21:29:50 »
Спасибо всем