函数,,,并将输入向量乘以定义为实值的 4x4 数组的转换矩阵。acedDragGen()acedGrVecs()acedNEntSelP()acedXformSS() typedef ads_real ads_matrix[4][4]; 矩阵的前三列指定缩放和旋转。矩阵的第四列是平移向量。ObjectARX 定义了符号来表示此向量的坐标,如下所示:T #define T 3 矩阵可以表示如下: 以下函数初始化单位矩阵。 void ident_init(ads_matrix id) { int i, j; for (i=0; i<=3; i++) for (j=0; j<=3; j++) id[i][j] = 0.0; for (i=0; i<=3; i++) id[i][i] = 1.0; } 传递 thetype 参数的函数将点视为维度为 4 的列向量。点以齐次坐标表示,其中点矢量的第四个元素是通常设置为 1.0 的比例因子。矩阵的最后一行的标称值为 [0,0,0,1];它被传递参数的函数忽略。在这种情况下,以下矩阵乘法是由于对某个点应用变换而产生的:ads_matrixads_matrix 此乘法为我们提供了该点的各个坐标,如下所示: 如这些方程所示,比例因子和矩阵的最后一行不起作用,将被忽略。这称为仿射变换。 注意:要变换向量而不是点,请不要添加平移向量M
3
M
13
M
23
(来自转换矩阵的第四列)。
以下函数实现前面的方程来转换单个点: void xformpt(xform, pt, newpt) ads_matrix xform; ads_point pt, newpt; { int i, j; newpt[X] = newpt[Y] = newpt[Z] = 0.0; for (i=X; i<=Z; i++) { for (j=X; j<=Z; j++) newpt[i] += xform[i][j] * pt[j]; // Add the translation vector. newpt[i] += xform[i][T]; } } 下图总结了一些基本的几何变换。(实际上 anare 中的值,但为了便于阅读并符合数学惯例,它们在此处显示为整数。ads_matrixads_real 与函数不同,函数需要矩阵进行均匀缩放。也就是说,在您传递给的转换矩阵中,缩放向量中的元素acedXformSS()acedDragGen()acedGrVecs()acedNEntSelP()acedXformSS()S X S Y S Z 必须都是平等的;在矩阵表示法中,M 00 = M 11 = M 22 .三维旋转的情况略有不同,如下图所示: 对于均匀旋转,由 [0,0] 和 [2,2] 分隔的 3x3 子矩阵是正交的。也就是说,每行都是一个单位向量,并且垂直于其他行;两行的标量(点)积为零。这些列也是彼此垂直的单位向量。正交矩阵及其转置的乘积等于单位矩阵。两个互补的旋转没有净效应。 复杂的转换可以通过在单个矩阵中组合(或组合)非标识值来完成。 注意:该函数使用 3x3 矩阵来转换 2D 点。该函数使用类似于 4x4 转换矩阵的 4x3 转换矩阵,但它将点视为一行。acedTablet()acedNEntSel()
|
|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-1-8 19:16
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.