Функции аффинных преобразований
В описанных ниже функциях под термином «матрица» следует понимать одномерный массив из 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;