坐标变换
返回的第一个附加参数是 类型的 4x4 转换矩阵。该矩阵称为“模型到世界转换矩阵”。它使应用程序能够将实体的定义数据(以及扩展数据,如果存在)中的点从实体的模型坐标系 (MCS) 转换为世界坐标系 (WCS)。MCS 仅适用于嵌套实体。MCS 的原点是块的插入点,其方向是创建块时生效的 UCS 的方向。acedNEntSelP()ads_matrix 如果所选实体不是嵌套实体,则转换矩阵设置为单位矩阵。变换由以下矩阵乘法表示: ![]() 变换点的各个坐标由方程获得,其中 M 锰 是模型到世界变换矩阵的坐标,是以 MCS 坐标表示的实体定义数据点,是以 WCS 坐标表示的结果实体定义数据点。请参阅转换矩阵。(X,Y,Z)(X',Y',Z') 注意:要变换向量而不是点,请不要添加平移向量[M
03
M
13
M
23
](来自转换矩阵的第四列)。
下面的示例代码定义了一个函数 ,该函数执行上述公式所描述的转换。它采用 和 返回的转换矩阵(可能来自嵌套实体的定义数据),并返回转换后的点。如果 的第三个参数设置为 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() 在以下示例中,调用指定自己的点来选取实体,并且不提示用户。该参数用于指示调用提供自己的点值(也称为 is)。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 返回的 Model to World Transformation Matrix 与 返回的 具有相同的用途,但它是一个 4x3 矩阵(作为四个点的数组传递),它使用点是行而不是列的约定。变换由以下矩阵乘法描述:acedNEntSel()acedNEntSelP() ![]() 推导新坐标的公式如下: ![]() 尽管矩阵格式不同,但公式与类型的公式等效,适应使用所需的唯一更改是将矩阵参数声明为四个点的数组。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() 父主题: |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-3-28 17:07
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.