CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

变换矩阵

2023-1-1 00:20| 发布者: admin| 查看: 311| 评论: 0|来自: AutoCAD

函数,,,并将输入向量乘以定义为实值的 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()

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )

GMT+8, 2024-5-19 13:19

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部