Функции аффинных преобразований

Материал из K3-Macro
Макро | Математические функции | Алгебраические и тригонометрические | Работа с матрицами | Аффинные преобразования | Работа с векторами | Геометрические вычисления | Преобразование координат точек и векторов | Работа с битовыми масками

В описанных ниже функциях под термином «матрица» следует понимать одномерный массив из 16 элементов либо двумерный массив размерностью 4х4. Функции: Ohcunit, Otdtran, Otdrot, Otdotxyz, Ohcmult, Otrans, Ominv

Ohcunit

Logical:Ohcunit(double ARRAY <Matr[16]>| double ARRAY <Matr[4,4]>)

Функция устанавливает единичную матрицу и заносит её в массив <Matr>. Функция возвращает:

1 — успешно
0 — ошибка

Otdtran

Logical:Otdtran(double ARRAY <Matr[16]>| double ARRAY <Matr[4,4]>, doudle ARRAY <V[3]>)

Функция добавляет в матрицу <Matr> преобразования сдвига на величину вектора <V>. При этом предыдущее значение матрицы <Matr> умножается на преобразование сдвига. То есть, в матрице <Matr> накапливаются преобразования, последовательно заданные функциями аффинных преобразований. Функция возвращает:

1 — успешно
0 — ошибка

Otdrot

Int:Otdrot(double ARRAY <Matr[16]>| double ARRAY <Matr[4,4]>, INT <Naxes>, DOUBLE <Alpha>)

Функция добавляет преобразование поворота в матрицу <Matr>. При этом предыдущее значение матрицы <Matr> умножается на преобразование поворота. То есть, в матрице <Matr> накапливаются преобразования, последовательно заданные функциями аффинных преобразований. Входные параметры:

<Naxes> — номер оси поворота (1-X, 2-Y, 3-Z). Берется по модулю.
<Alpha> — угол поворота. Если <Naxes> меньше нуля, угол задаётся в радианах, иначе — в градусах.
<Matr> — исходная матрица

Результат заносится в матрицу <Matr>. Функция возвращает:

1 — успешно
0 — ошибка
2 — неверный номер оси

Otdrotxyz

Logical:Otdrotxyz(double ARRAY <Matr[16]>| double ARRAY <Matr[4,4]>, double ARRAY <P[3]>, double ARRAY <A[3]>, double <Alpha>)

Функция добавляет в матрицу <Matr> преобразование поворота на угол <Alpha> в радианах вокруг произвольной оси, задаваемой точкой с координатами (ГСК) в массиве <P> и направлением в пространстве, заданным вектором в массиве <A>. При этом предыдущее значение матрицы <Matr> умножается на преобразование поворота. То есть, в матрице <Matr> накапливаются преобразования, последовательно заданные функциями аффинных преобразований. Функция возвращает:

1 — успешно
0 — ошибка

Ohcmult

Logical:Ohcmult(double ARRAY <A[16]>| double ARRAY <A[4,4]>, double ARRAY <B[16]>| double ARRAY <B[4,4]>, double ARRAY <C[16]>| double ARRAY <C[4,4]>)

Функция осуществляет умножение матрицы <A> на матрицу <B> и заносит результат в матрицу <C>. Функция возвращает:

1 — успешно
0 — ошибка

Otrans

Logical:Otrans(OBJECT <Obj>, double ARRAY <Matr[16]>| double ARRAY <Matr[4,4]>)

Функция преобразует объект <Obj> матрицей <Matr>. Функция возвращает:

1 — успешно
0 — ошибка

Ominv

Logical:Ominv(double ARRAY <A[16]>| double ARRAY <A[4,4]>, double ARRAY <B[16]>| double ARRAY <B[4,4]>)

Функция обращает матрицу <A> и записывает результат в матрицу <B>. Функция возвращает:

1 — успешно
0 — ошибка

Пример

defarr trans[16], in[3], out[3]; // Задаем массивы
NULLOUT=Ohcunit(trans);     // Задаем единичную матрицу преобразований
NULLOUT=Otdrot(trans,2,-90);   // Заносим в эту матрицу поворот относительно оси Y на -90 градусов
out[1]=in[1]*trans[1]+in[2]*trans[2]+in[3]*trans[3]+trans[4];  // Вычисляем координаты после преобразования
out[2]=in[1]*trans[5]+in[2]*trans[6]+in[3]*trans[7]+trans[8];
out[3]=in[1]*trans[9]+in[2]*trans[10]+in[3]*trans[11]+trans[12];

PointTrans

LOGICAL:PointTrans(DOUBLE ARRAY <Matr[16]>| DOUBLE ARRAY <Matr[4,4]>, DOUBLE ARRAY <P[3]>)

Функция выполняет преобразование точки с координатами <P> матрицей <Matr>. Результат помещается в массив <P>. Функция возвращает:

1 — успешно
0 — ошибка

Пример преобразование точки из ПСК в ЛСК объекта. Например, мебельной панели.

 objident prompt "Выберите мебельную панель" partly : obj
 // точка в ПСК
 xu=100
 yu=50
 zu=25
 // получаем координаты этой точки в ГСК
 defarr pg[3];
 PTransCS(2,3,xu,yu,zu,pg[1],pg[2],pg[3])
 // получаем матрицу из ЛСК объекта в ГСК
 defarr matr[16], matri[16];
 if GetGeomatr(obj,matr)==1 {
   // вычисляем матрицу из ГСК в ЛСК объекта
   if Ominv(matr,matri)==1 {
     if PointTrans(matri,pg)==1 {
       putmsg(pg)
     }
   }
 }

VectorTrans

LOGICAL:VectorTrans(DOUBLE ARRAY <Matr[16]>| DOUBLE ARRAY <Matr[4,4]>, DOUBLE ARRAY <V[3]>)

Функция выполняет преобразование вектора с координатами <V> матрицей <Matr>. Результат помещается в массив <V>.

Функция возвращает:

1 — успешно
0 — ошибка

Пример:

defarr matr[16], vect[3],poi[3];
NULLOUT=ohcunit(matr);
vect[1]=10;
vect[2]=20;
vect[3]=30;
poi[1]=100;
poi[2]=200;
poi[3]=300;
NULLOUT=otdtran(matr,vect);
putmsg(matr);
NULLOUT=otdrot(matr,3,90);
putmsg(matr);
NULLOUT=pointtrans(matr,poi);
putmsg(poi);
NULLOUT=vectortrans(matr,vect);
putmsg(vect);
exit;

См. также

Функции работы с матрицами


Макро | Математические функции | Алгебраические и тригонометрические | Работа с матрицами | Аффинные преобразования | Работа с векторами | Геометрические вычисления | Преобразование координат точек и векторов | Работа с битовыми масками