在 metapost 中定义投影变换

在 metapost 中定义投影变换

Metapost 包含二维平面的仿射变换,在齐次坐标系中,即$(x,y)$在二维平面中的标识下$(x,y,1)$,表示矩阵由下式给出

$$
T=\begin{pmatrix}
T_{xx}&T_{xy}&T_x\\
T_{yx}&T_{yy}&T_y\\
0     &0     &1
\end{pmatrix}
$$

现在,我的问题是,我们如何通过将其分量指定为仿射变换来定义射影变换?

transform T;
xxpart T=a11; xypart T=a12; xpart T=a13;
yxpart T=a21; yypart T=a22; ypart T=a23;
zxpart T=a31; zypart T=a32; zpart T=a33;

并将其用作仿射变换:

z0=(1,2); 
z1=z0 transformed T;
show z1;

射影数学的背景数学可以在以下网址找到本网站,由此我们可以知道

  • 3x3 矩阵 $A$表示射影矩阵当且仅当$\det A\neq0$
  • 要通过对 进行射影变换来获取 的坐标z1(如示例中所示),我们只需要进行如下矩阵乘法Tz0
A(part(z0),part(z0),1)^t

其中A=(a_{ij})是 的表示矩阵T,然后将上述结果的前两个分量除以最后一个分量,注意上述结果又是一个 1x3 列矩阵(为X=(x1,x2,x3)简单起见,表示为),即

xpart(z1)=x1/x3; 
ypart(z1)=x2/x3;

因此,我想定义一个函数/变换,其作用几乎与仿射变换相同,但它更为通用,使得仿射矩阵中的最后一行可以是任意的。

答案1

简短的回答是“不可以”。至少不是像你描述的那样。

要定义您所描述的投影变换,您需要一个可以容纳所有九个组件的数据结构,但内置transform数据类型只有六个组件。这意味着 MP 将理论 3x3 矩阵的“最后一行”固定为,0, 0, 1并且不提供更改它或存储值的机制。因此,您建议的内容在核心语言中不可用。

但是 MP 具有很强的可扩展性,因此您可以编写一组宏来存储和处理三维向量、3x3 变换和平面投影。

如果你想看到一个相当完整的已经做到这一点的集合,那么你可以从響鳴看看你是否能写出更好的东西。

相关内容