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

ADN Club => VBA => Тема начата: AndONE от 30-01-2018, 16:03:31

Название: TransformBy повернуть произвольный вектор в указанное направление
Отправлено: AndONE от 30-01-2018, 16:03:31
Добрый день.
Пытаюсь разобраться с TransformBy, но никак не пойму логику работы. Из примера справки не понять какие коэффииенты подбирать, чтобы вызвать вращение относительно определенной оси на заданный угол. Помогите, пожалуйста, разобраться как он работает? Даже ссылка на алгоритм из векторной геометрии будет хорошей помощью, я к сожалению, похожего не нашел.
Задача у меня такая:
- имеется 2 отрезка, каждый из который определяет вектор из Startpoint в EndPoint.
Мне требуется развернуть первый отрезок так, чтобы он был коллинеарен со вторым, а потом перенести его в StartPoint второго отрезка. Интересует только применение метода TransformBy.
Название: Re: TransformBy повернуть произвольный вектор в указанное направление
Отправлено: Александр Ривилис от 30-01-2018, 16:18:16
1. В VBA готовых методов работы с векторами и матрицами нет. Так что будут серьезные сложности. То что в ObjectARX и AutoCAD .NET API делается в в десяток строк - в VBA будет занимать вероятно сотни строк.
2. https://ru.wikipedia.org/wiki/Матрица_поворота (https://ru.wikipedia.org/wiki/Матрица_поворота) - там смотри "Матрица поворота вокруг произвольной оси".
Необходимо сначала совместить начала обеих отрезков, затем найти нормаль к плоскости образованной этими отрезками, которая и будет осью поворота и вычислить угол поворота от первого отрезка ко второму -  θ. Ну и тогда уже можно создать матрицу.
Название: Re: TransformBy повернуть произвольный вектор в указанное направление
Отправлено: AndONE от 30-01-2018, 16:23:40
Господи, как же все просто!! Я пытался делать поворот по 3-м плоскостям XY,YZ,XZ на углы, равные углам проекций на соответствующие плоскости.
А ведь реально надо поворачивать в плоскости, образованной двумя векторами!! Тут вообще без матрицы трансформаций получается можно легко обойтись.
Спасибо огромное!
Название: Re: TransformBy повернуть произвольный вектор в указанное направление
Отправлено: Александр Ривилис от 30-01-2018, 16:27:37
Тут вообще без матрицы трансформаций получается можно легко обойтись.
Для отрезков да. А вот если нужно поворачивать какие-то сложные примитивы, то без матрицы трансформации не обойтись.
Название: Re: TransformBy повернуть произвольный вектор в указанное направление
Отправлено: Владимир Шу от 30-01-2018, 16:32:54
Как то так работается с векторами в 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.  

Название: Re: TransformBy повернуть произвольный вектор в указанное направление
Отправлено: AndONE от 30-01-2018, 16:45:33
Как то так работается с векторами в 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 - длина вектора, а дальше не понятно)
Название: Re: TransformBy повернуть произвольный вектор в указанное направление
Отправлено: Владимир Шу от 30-01-2018, 17:04:09
да тут ничего сложного,  на примере удлинения отрезка в обе стороны на 1.5 ед, показано как работать с векторами: