TransformBy повернуть произвольный вектор в указанное направление

Автор Тема: TransformBy повернуть произвольный вектор в указанное направление  (Прочитано 6095 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 0
Добрый день.
Пытаюсь разобраться с TransformBy, но никак не пойму логику работы. Из примера справки не понять какие коэффииенты подбирать, чтобы вызвать вращение относительно определенной оси на заданный угол. Помогите, пожалуйста, разобраться как он работает? Даже ссылка на алгоритм из векторной геометрии будет хорошей помощью, я к сожалению, похожего не нашел.
Задача у меня такая:
- имеется 2 отрезка, каждый из который определяет вектор из Startpoint в EndPoint.
Мне требуется развернуть первый отрезок так, чтобы он был коллинеарен со вторым, а потом перенести его в StartPoint второго отрезка. Интересует только применение метода TransformBy.

Отмечено как Решение AndONE 30-01-2018, 17:23:50

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
1. В VBA готовых методов работы с векторами и матрицами нет. Так что будут серьезные сложности. То что в ObjectARX и AutoCAD .NET API делается в в десяток строк - в VBA будет занимать вероятно сотни строк.
2. https://ru.wikipedia.org/wiki/Матрица_поворота - там смотри "Матрица поворота вокруг произвольной оси".
Необходимо сначала совместить начала обеих отрезков, затем найти нормаль к плоскости образованной этими отрезками, которая и будет осью поворота и вычислить угол поворота от первого отрезка ко второму -  θ. Ну и тогда уже можно создать матрицу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 0
Господи, как же все просто!! Я пытался делать поворот по 3-м плоскостям XY,YZ,XZ на углы, равные углам проекций на соответствующие плоскости.
А ведь реально надо поворачивать в плоскости, образованной двумя векторами!! Тут вообще без матрицы трансформаций получается можно легко обойтись.
Спасибо огромное!

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

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

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Как то так работается с векторами в VBA =(((
Код - Visual Basic [Выбрать]
  1.         // VBA style
  2.         Dim dP(0 To 2) As Double
  3.         dP(0) = line.EndPoint.X - line.StartPoint.X
  4.         dP(1) = line.EndPoint.Y - line.StartPoint.Y
  5.         dP(2) = line.EndPoint.Z - line.StartPoint.Z
  6.          
  7.         Dim length_dP As Double
  8.         length_dP = (dPX * dPX + dPY * dPY + dPZ * dPZ)^0.5
  9.                        
  10.         Dim L(0 To 2) As Double
  11.         L(0) = 1.5 * (dP(0) / length_dP)
  12.         L(1) = 1.5 * (dP(1) / length_dP)
  13.         L(2) = 1.5 * (dP(2) / length_dP)
  14.                        
  15.         Dim p1(0 To 2) As Double
  16.         Dim p2(0 To 2) As Double
  17.         p1(0) = line.StartPoint.X - L(0)
  18.         p1(1) = line.StartPoint.Y - L(1)
  19.         p1(2) = line.StartPoint.Z - L(2)
  20.          
  21.         p2(0) = line.EndPoint.X + L(0)
  22.         p2(1) = line.EndPoint.Y + L(1)
  23.         p2(2) = line.EndPoint.Z + L(2)
  24.  


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

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 0
Как то так работается с векторами в VBA =(((
Код - Visual Basic [Выбрать]
  1.         // VBA style
  2.         Dim dP(0 To 2) As Double
  3.         dP(0) = line.EndPoint.X - line.StartPoint.X
  4.         dP(1) = line.EndPoint.Y - line.StartPoint.Y
  5.         dP(2) = line.EndPoint.Z - line.StartPoint.Z
  6.          
  7.         Dim length_dP As Double
  8.         length_dP = (dPX * dPX + dPY * dPY + dPZ * dPZ)^0.5
  9.                        
  10.         Dim L(0 To 2) As Double
  11.         L(0) = 1.5 * (dP(0) / length_dP)
  12.         L(1) = 1.5 * (dP(1) / length_dP)
  13.         L(2) = 1.5 * (dP(2) / length_dP)
  14.                        
  15.         Dim p1(0 To 2) As Double
  16.         Dim p2(0 To 2) As Double
  17.         p1(0) = line.StartPoint.X - L(0)
  18.         p1(1) = line.StartPoint.Y - L(1)
  19.         p1(2) = line.StartPoint.Z - L(2)
  20.          
  21.         p2(0) = line.EndPoint.X + L(0)
  22.         p2(1) = line.EndPoint.Y + L(1)
  23.         p2(2) = line.EndPoint.Z + L(2)
  24.  
Ну да, так и получается. 
Не могу понять что за коэффициент у вас 1,5 в L?
dp - разница проекций на оси
lenght - длина вектора, а дальше не понятно)

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
да тут ничего сложного,  на примере удлинения отрезка в обе стороны на 1.5 ед, показано как работать с векторами:
  • сначала заполняю вектор - dP;
  • потом вычисляю его длину - length_dP;
  • потом нормализирую вектор и умножаю на расстояние на которое хочу отодвинуть координаты концов отрезка (1.5), получаю вектор удлинения - L;
  • Прибавляю вновь полученный вектор (L) к координатам отрезка