CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

坐标变换

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

返回的第一个附加参数是类型的 4x4 转换矩阵。此矩阵称为模型到世界转换矩阵。它使应用程序能够将实体的定义数据(和扩展数据,如果存在)中的点从实体的模型坐标系 (MCS) 转换为世界坐标系 (WCS)。MCS 仅适用于嵌套实体。MCS 的原点是块的插入点,其方向是创建块时有效的 UCS 的方向。acedNEntSelP()ads_matrix

如果所选实体不是嵌套实体,则转换矩阵将设置为单位矩阵。变换由以下矩阵乘法表示:

变换点的各个坐标从方程中获得,其中 M 是模型到世界变换矩阵坐标,是以 MCS 坐标表示的实体定义数据点,是用 WCS 坐标表示的结果实体定义数据点。请参阅转换矩阵(X,Y,Z)(X',Y',Z')

注意:要变换向量而不是点,请不要添加平移向量[M 03 M 13 M 23 ](来自转换矩阵的第四列)。

下面的示例代码定义了一个函数,该函数执行上述公式所述的转换。它采用由单个点返回的转换矩阵(可能来自嵌套实体的定义数据),并返回转换后的点。如果第三个参数 to,,设置为 0 (),则转换矩阵的最后一列(平移向量或位移)不会添加到结果中。这使函数能够平移向量和点。mcs2wcs()acedNEntSelP()mcs2wcs()is_ptFALSE

void mcs2wcs(xform, entpt, is_pt, worldpt) 
ads_matrix xform; 
ads_point entpt, worldpt; 
int is_pt; 
{ 
    int i, j; 
    worldpt[X] = worldpt[Y] = worldpt[Z] = 0.0; 
    for (i=X; i<=Z; i++) 
        for (j=X; j<=Z; j++) 
            worldpt[i] += xform[i][j] * entpt[j]; 
    if (is_pt) // If it's a point, add in the displacement 
        for (i=X; i<=Z; i++) 
            worldpt[i] += xform[i][T]; 
} 

以下代码片段显示了如何结合使用,将点值转换为当前 WCS。mcs2wcs()acedNEntSelP()

ads_name usrent, containent; 
ads_point usrpt, defpt, wcspt; 
ads_matrix matrix; 
struct resbuf *containers, *data, *rb, *prevrb; 
status = acedNEntSelP(NULL, usrent, usrpt, FALSE, matrix, 
    &containers); 
if ((status != RTNORM) || (containers == NULL)) 
    return BAD; 
data = acdbEntGet(usrent); 
// Extract a point (defpt) from the data obtained by calling
// acdbEntGet() for the selected kind of entity.
. 
. 
. 
mcs2wcs(matrix, defpt, TRUE, wcspt); 

该函数还允许程序指定拾取点。参数确定是否以交互方式调用。acedNEntSelP()pickflagacedNEntSelP()

在下面的示例中,thecall 指定自己的选取实体点,并且不提示用户。参数是指示调用提供自己的点值(也是,theis)。acedNEntSelP()pickflagTRUEpromptNULL

ads_point ownpoint; 
ownpoint[X] = 2.7; ownpoint[Y] = 1.5; ownpoint[Z] = 0.0; 
status = acedNEntSelP(NULL, usrent, ownpt, TRUE, matrix, 
    &containers); 

提供该功能是为了与现有的 ObjectARX 应用程序兼容。应使用编写新应用程序。acedNEntSel()acedNEntSelP()

调用 to 返回的模型到世界转换矩阵与返回的矩阵具有相同的用途,但它是一个 4x3 矩阵(作为四个点的数组传递),它使用点是行而不是列的约定。转换由以下矩阵乘法描述:acedNEntSel()acedNEntSelP()

推导新坐标的公式如下:

尽管矩阵格式不同,但公式等效于 thetype,并且适应使用所需的唯一更改是将矩阵参数声明为四个点的数组。ads_matrixmcs2wcs()acedNEntSel()

void mcs2wcs(xform, entpt, is_pt, worldpt); 
ads_point xform[4]; // 4x3 version  
ads_point entpt, worldpt; 
int is_pt; 

4x3 矩阵的恒等形式如下:

除了使用不同的矩阵约定外,不允许程序指定拾取点。acedNEntSel()


路过

雷人
1

握手

鲜花

鸡蛋

刚表态过的朋友 (1 人)

最新评论

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

GMT+8, 2024-5-19 14:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部