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