Как работать с векторами, получения перпендикуляра от получаемого вектора?

Автор Тема: Как работать с векторами, получения перпендикуляра от получаемого вектора?  (Прочитано 4364 раз)

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Здравствуйте коллеги, вся надежда на Вас , устал уже голова отказывается понимать как все это работает. Подскажите мне надо из двух точек построить вектор, потом от начало этого вектора по Х + 5 построить перпендикуляр длина перпендикуля тоже 5 и получить точку конца этого перпендикуляра. Не могу додумать подскажите точки улетают не понятно куда. Как отсчитывать от начала вектора ?

был тут
https://adn-cis.org/forum/index.php?topic=2871.msg10474#msg10474

еще тут
https://www.caduser.ru/forum/topic48772.html

Код - C# [Выбрать]
  1. Point3d p1 = new Point3d(50, 0, 0);
  2. Point3d p2 = new Point3d(70, 20, 0);
  3. var vector3d = p2 - p1;
  4. Point3d pt3 = p2 - vector3d.GetNormal();
  5. var perpendicular = vector3d.GetPerpendicularVector();
  6. var endPoint3d = pt3 - perpendicular * 5;
  7.  
  8.  
  9. Polyline acPoly = new Polyline();
  10. acPoly.AddVertexAt(0, new Point2d(p1.X, p1.Y), -0.4141, 0, 0);
  11. acPoly.AddVertexAt(1, new Point2d(endPoint3d.X, endPoint3d.Y), 0, 0, 0);
  12. acBlkTblRec.AppendEntity(acPoly);
  13. acTrans.AddNewlyCreatedDBObject(acPoly, true);
  14.  

надо получить полилинию как на картинке



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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Yusuf,
Ничего не смог понять. Пока лишь могу посоветовать нарисовать средствами AutoCAD то что тебе нужно и проанализировать при помощи MGDDBG.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Yusuf,
Ничего не смог понять. Пока лишь могу посоветовать нарисовать средствами AutoCAD то что тебе нужно и проанализировать при помощи MGDDBG.

Мне надо по 2 введённым точкам построить полининию в который есть, дуга и прямые линии, эти точки могут быть указаны в любом направлении, прямые линии параллельны вектору введённых точек а дуги на 90 градусов от вектора.
В начале полилинии должна быть дуга с радиусом 5мм и с углом 90, этот угол должен быть 90 градусов к полученному вектору. Я пытался делать так, от 2-й введённой пользователем точки отнимал первую получал вектор, потом от начала вектора отложить 5мм от и чтобы угол был 90 градусов, нужен перпендикуляр, для этого от этой точки провожу перпендикуляр (vector3d.GetPerpendicularVector()) на расстоянии 5мм это будет вторая точка дуги, а первая введенная точка пользователем т.е начало вектора.

Я кажется перпендикуляр к вектору не правильно получаю от определенной точки.
Как вектор получить понял, от 2 точки отнимаем первую, это будет вектор направленный в сторону второй?
Как получить точки от начала вектора на расстоянии 5мм и получить перпендикуляр к этой точке длина перпендикуляра тоже 5 (как на картинке из первого поста)?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Как вектор получить понял, от 2 точки отнимаем первую, это будет вектор направленный в сторону второй?
Да.
Как получить точки от начала вектора на расстоянии 5мм и получить перпендикуляр к этой точке длина перпендикуляра тоже 5 (как на картинке из первого поста)?
Код - C# [Выбрать]
  1. Vector3d v = (p2 - p1).GetNormal();
  2. Point3d p3 = p2 + v * 5.0;
  3. // Возможно вместо Math.PI * 0.5 должно быть -Math.PI * 0.5  - зависит от направления
  4. // Это поворот на 90 градусов по часовой стрелке или против часовой стрелки
  5. Point3d p4 = p3 + (v * 5.0).RotateBy(Math.PI * 0.5, Vector3d.ZAxis);
Код не тестировал, так что проверяй сам.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Yusuf 22-05-2021, 17:23:59

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вообще в данном случае можно еще проще, так как тут у нас равнобедренный прямоугольный треугольник):
Код - C# [Выбрать]
  1. Point3d p3 = p2 + ((p2 - p1).GetNormal()*Math.Sqrt(5*5+5*5)).RotateBy(Math.PI * 0.25, Vector3d.ZAxis);
Код исправил.
« Последнее редактирование: 22-05-2021, 23:21:06 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Вообще в данном случае можно еще проще, так как тут у нас равнобедренный прямоугольный треугольник):
Код - C# [Выбрать]
  1. Point3d p3 = ((p2 - p1).GetNormal()*Math.Sqrt(5*5+5*5)).RotateBy(Math.PI * 0.25, Vector3d.ZAxis);

работает, только не Point3d а Vector3d возвращает. Верхний тоже работает только мне надо было от начало вектора и поэтому p2 поменял на p1 во второй строчке: Point3d p3 = p2 + v * 5.0;
Спасибо, теперь чуть что буду бежать сюда и спрашивать, потому что очень много времени трачу на тривиальные задачи.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо, теперь чуть что буду бежать сюда и спрашивать, потому что очень много времени трачу на тривиальные задачи.
Это правильная мысль. Только старайся сразу формулировать задачу так, чтобы она была абсолютно понятна.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Это правильная мысль. Только старайся сразу формулировать задачу так, чтобы она была абсолютно понятна.
Хорошо Спасибо что Вы есть. Вроде пишу понятно, но получается что только я понимаю потом ))