Проекция линии на плоскость

Автор Тема: Проекция линии на плоскость  (Прочитано 7811 раз)

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

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

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Добрый вечер!
Пытаюсь спроецировать линию на выбранную поверхность/плоскость, для этого каждую точку линии проецирую на поверхностьЖ
Код - C# [Выбрать]
  1. if (sketch != null) {
  2.     Plane plane = sketch.GetPlane();
  3.     XYZ firstPoint = PointProject(plane, line.GetEndPoint(0));
  4.     XYZ secondPoint = PointProject(plane, line.GetEndPoint(1));
  5. }
  6.  
  7. public XYZ PointProject(Plane plane, XYZ p) {
  8.     double d = plane.Normal.DotProduct(p - plane.Origin);
  9.     return q = p + d * plane.Normal;
  10. }
  11.  
Но проекция не всегда срабатывает, особенно с вертикальной поверхностью.
За основу брал http://thebuildingcoder.typepad.com/blog/2014/09/planes-projections-and-picking-points.html

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Проекция линии на плоскость
« Ответ #1 : 21-10-2015, 17:15:43 »
Если на выбранную поверхность, то, получив Face, можно воспользоваться методом Face.Project

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Проекция линии на плоскость
« Ответ #2 : 21-10-2015, 17:17:19 »
Это не всегда будет Face, это может быть уровень.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Проекция линии на плоскость
« Ответ #3 : 21-10-2015, 17:19:02 »
Тогда все еще проще. Заменяем Z точки на высоту уровня

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Проекция линии на плоскость
« Ответ #4 : 21-10-2015, 17:24:53 »
В этом есть смысл, но хотелось бы что-то более менее универсальное, потому как это может быть плоскость построенная по трем точкам, и в итоге я создаю SketchPlane для "любого элемента" (Face, уровень, Sketch по трем точкам).
А уже из Sketch-а я получаю поверхность, через GetPlane.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Проекция линии на плоскость
« Ответ #5 : 21-10-2015, 17:30:46 »
у меня есть метод, за основу брал по той же ссылке, в процессе отладки он получился вот такой:

Код - C# [Выбрать]
  1.         public static XYZ ProjectOnto(this Plane plane, XYZ p)
  2.         {
  3.             var d = plane.SignedDistanceTo(p);
  4.  
  5.             var q = p - d * plane.Normal;
  6.  
  7.             return q;
  8.         }
  9.  
  10.         public static double SignedDistanceTo(this Plane plane, XYZ p)
  11.         {
  12.             var v = p - plane.Origin;
  13.  
  14.             return plane.Normal.DotProduct(v);
  15.         }
  16.  

Подробностей уже не помню, честно говоря, хотел Тэммику написать, но как-то замотался, забыл

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Проекция линии на плоскость
« Ответ #6 : 21-10-2015, 17:36:15 »
ну вот это-то у меня и не работает, я только объединил в одну функцию, вместо двух,
SignedDistanceTo - здесь он берет расстояние до точки поверхности (origin)
ProjectOnto - а вот здесь по идее берет точку опущенного перпендикуляра на поверхность,

Отмечено как Решение shss 21-10-2015, 17:58:28

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Проекция линии на плоскость
« Ответ #7 : 21-10-2015, 17:38:05 »
Обратите внимание на знак

Код - C# [Выбрать]
  1. var q = p - d * plane.Normal;

В оригинале плюс был, у меня вроде бы все как надо работает

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Проекция линии на плоскость
« Ответ #8 : 21-10-2015, 17:58:25 »
Вот теперь все отлично работает!
Все дело в знаке, надо взять на заметку.
Спасибо, за подсказку!

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Проекция линии на плоскость
« Ответ #9 : 21-10-2015, 17:59:58 »
Супер, надо будет, все-таки, Тэммику написать  :)

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Проекция линии на плоскость
« Ответ #10 : 21-10-2015, 18:03:13 »
Это точно.
Хотя странно, что никто ему в комментах не написал об этом.
И, кстати, это уже не первый раз, где он со знаком ошибается :)

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Проекция линии на плоскость
« Ответ #11 : 21-10-2015, 18:05:26 »
Ну все мы люди, сколько раз я на учебе на всяких контрольных со знаком ошибался - не пересчитать :)