仿射变换或一个漂亮公式的反问题

在本文中,我将讨论一个不寻常的公式,该公式使您可以从一个新角度来研究仿射变换,尤其是与这些变换相关的逆问题。 我将称需要计算逆矩阵的逆问题:通过点查找变换,求解线性方程组,在更改基础时变换坐标等。 我将立即保留一点,即本文不会有任何基本发现,也不会降低算法的复杂性-我将仅展示一个对称且易于记忆的公式,利用该公式可以解决许多意外的运行问题。 对于严格的数学爱好者,这里有一个更正式的演示文稿[1] (面向学生),在这里有一本小问题书[2]

仿射变换通常由矩阵定义 和翻译矢量 并通过公式作用于矢量参数

 mathcalA vecx= hatA vecx+ vect


但是,您可以不用  vect 如果您对参数使用增强矩阵和统一坐标(如OpenGL用户所熟知)。 但是,事实证明,除了这些书写形式之外,您还可以使用特殊矩阵的行列式,该矩阵既包含参数的坐标,又包含确定转换的参数。 事实是,行列式在任何行或列的元素上都具有线性特性,这使它可以用来表示仿射变换。 实际上,在这里,如何表达仿射变换对任意向量的作用  vecx


不要急于惊慌失措-首先,在此处编写一个可在任意维度的空间上作用的变换(这里有很多东西),其次,尽管该公式看起来很麻烦,但只需记住并使用即可。 首先,我将使用框架和颜色突出显示逻辑上相关的元素


所以我们看到仿射变换的作用 \数A 每个向量可以表示为两个行列式的比率,其中向量参数仅输入顶部,而底部仅是一个常数,仅取决于参数。

蓝色突出显示的矢量  vecx 是一个参数,仿射变换所作用的向量 \数A 。 在下文中,下标表示向量的分量。 在组件的上矩阵中  vecx 几乎占据了整个第一列,除了这一列中它们仅占零(顶部)和一个(底部)。 矩阵中的所有其他元素都是参数向量(最后一个数字,它们由上标编号,并放在方括号中,以免与度数混淆)和单位。 在所有仿射变换的集合中,参数区分了我们所需要的。 公式的便利性和美感在于,这些参数的含义非常简单:它们定义了仿射变换,可以转换向量  vecx\,i vecXi 。 因此向量  vecx\,1\点 vecx\,n+1 ,我们将其称为“输入”(在矩阵中被矩形包围)-它们每个都以组件方式编写在其自己的列中,并在其后附加一个单位。 “输出”参数从上方写入(以红色突出显示)  vecX1\点 vecXn+1 ,但现在不是组件化的,而是一个整体。

如果有人对这样的记录感到惊讶,请记住矢量积

$$ display $$ [\ vec {a} \次\ vec {b}] = \ det \ begin {pmatrix} \ vec {e} _1&\ vec {e} _2&\ vec {e} _3 \\ a_1 &a_2&a_3 \\ b_1&b_2&b_3 \\ \结尾{pmatrix},$$显示$$

那里的结构非常相似,第一行以相同的方式被向量占据。 此外,向量的维数没有必要  vecXi vecxi 巧合。 所有行列式都被认为是常规的,并允许使用常规的“技巧”,例如,您可以将另一列添加到任何列。

使用底部矩阵,一切都非常简单-通过删除第一行和第一列从顶部获得。 (1)的缺点是您必须采用行列式,但是,如果将此例行任务转移到计算机,事实证明该人将只需要用其任务中的数字正确填充矩阵即可。 同时,使用一个公式,您可以解决很多常见的实践问题:



平面上的三点仿射变换


在未知的仿射变换的影响下,飞机上的三个点传递到其他三个点。 找到这种仿射变换。
为了明确起见,让我们的切入点


以及转换的结果

找到仿射变换 \数A

实际上,这个问题可以通过不同的方式解决:使用线性方程组,重心坐标...,但我们会走自己的路。 我认为,通过使用的符号,您可以猜出我要得到的是:我们将等式(1)作为维数 n=2 和替代  vecx\,i 作为输入参数,以及  vecX\,i -周末


然后剩下的只是计算行列式


训练有素的眼睛将很容易检测到打开 30 circ 并在 3+ sqrt3/22 mathsfT

该公式何时适用?

输入和输出向量可以具有不同的维数-该公式适用于作用于任何维数空间的仿射变换。 但是,应该有足够的输入点,并且它们不应“粘在一起”:如果仿射变换从 n 维空间-点必须形成非退化单纯形 n+1 点。 如果不满足此条件,则不可能明确恢复转换(通过任何方法,不仅是此方法)-公式将在分母中以零警告此状态。

为什么要向程序员恢复仿射变换?

通常,您需要在两张图片之间找到一个转换(例如,用于计算相机的位置)。 如果我们在这些图像中有一些可靠的特殊点(功能),或者您只是不想马上开始使用ranzaks来解决支出问题,则可以使用此公式。

另一个例子是纹理化 。 从纹理切出三角形并将其拉到平面或空间中某个地方的三角形是将仿射变换应用于纹理空间中的点并将其转换为模型所居住的空间的典型任务。 通常,我们很容易指出纹理上的哪些点对应于模型三角形的顶点,但是要确定非角点的位置可能需要一些思考。 只要使用相同的公式,只需将数字插入正确的单元格就足够了,这样会很漂亮。

就我个人而言,神经网络给出了标记角的坐标,我们想用位于标记上的虚拟对象“补充现实”。
显然,在移动标记时,对象必须重复其所有移动。 公式(1)在这里非常有用-它将帮助我们将对象移动到标记之后。

还是另一个示例:您需要使用Gizmo工具对舞台上各种对象的旋转进行编程。 为此,我们必须能够围绕平行于坐标轴并穿过对象中心的三个轴旋转所选模型。 图片显示了模型围绕平行于一个轴旋转的情况 Oz

最终,所有这些都归结为围绕任意点旋转的二维问题。 让我们甚至为一些简单的情况解决它,例如,打开 90\约 逆时针旋转 a;b (一般情况下的解决方法相同,我只是不想让正弦和余弦变得凌乱不堪)。 当然,您可以沿着武士的方式乘以三个矩阵(将旋转点平移为零,实际旋转并平移回去),也可以找到旋转前后三个点的坐标并使用公式。 第一点很简单-我们已经知道 a;b 本身。 让我们看一下右边的一点,因为这是真的 a+1;b mapstoa;b+1 。 好吧,下面还有一个,很明显 a;b1 mapstoa+1;b 。 然后一切都很简单




重心坐标


我们根据拉普拉斯规则沿第一行分解较高行列式(1) 。 显然,结果是我们得到了一些向量的加权和  vecXi 。 事实证明,该总和的系数是自变量的重心坐标  vecx 关于给定的单纯形  vecx\,i (有关证明,请参见[1] )。 如果我们只对点的重心坐标感兴趣,则可以用单位Orts作弊并填充第一行-计算行列式后,我们得到一个向量,其分量与重心坐标一致  vecx 。 在图形上,这样的转变 \数B 将点转换为其重心坐标的空间将如下所示


让我们在实践中尝试此“食谱”。 任务:找到相对于给定三角形的点的重心坐标。 让它成为确定性的要点 2,2 mathsfT ,并取一个三角形的顶点


要点很小-取(1)n=2 ,在其中正确放置任务数据并计算行列式


解决方法如下:重心坐标 2,2 mathsfT 关于给定的三角形 0.60.30.1 。 在编程中,重心坐标的计算通常是在检查点是否在单纯形内(然后所有重心坐标都大于零且小于1)以及各种插值的背景下进行的,我们现在将讨论这些插值。

请注意,公式(1)具有令人满意的对偶性:如果我们在第一列中扩展行列式,则将获得仿射函数的标准表示法;如果在第一行上,则将获得输出向量的仿射组合。


多线性插值


因此,我们发现仿射变换对输出矢量的加权系数等于自变量的重心坐标。 将此属性用于多线性插值是很自然的。

颜色插值

例如,让我们计算标准GL-“ hello world”-一个彩色三角形。 当然,OpenGL完全知道如何对颜色进行插值,并且还可以使用重心坐标进行插值,但是今天我们将自己完成。

任务:在三角形的顶点处设置颜色,以对三角形内部的颜色进行插值。 为了确定性,让三角形的顶点具有坐标


我们为它们分配颜色:黄色,青色和洋红色


数字三元组是颜色的RGB成分。 取(1)并正确排列输入数据


这是组件 \数Cx;y 指示如何绘制点 xy 就RGB而言。 让我们看看发生了什么。

可以说,我们只是将图片的二维空间仿射变换为色彩的三维空间(RGB)。

法线插值(Phong阴影)

我们可以在插值的向量中赋予各种含义,包括可以是法线向量的含义。 此外,这正是Phong阴影所做的,仅在插值后才需要对向量进行归一化。 下图很好地说明了为什么需要这种插值(摘自Wikipedia commons.wikimedia.org/w/index.php?curid=1556366 )。

我认为不再值得进行计算-所有详细信息都在[2]中进行了讨论,但是我将显示带有结果的图片。

其上的向量不是单一的,并且要在Phong着色中使用,必须首先对其进行归一化,并且为清楚起见,它们会指向非常不同的方向,在实践中很少这样。

寻找飞机 z=zxy 三点


考虑仿射变换应用的另一个不寻常的例子。
给出三点

我们找到通过它们的形式的平面方程 z=zxy 。 我们将在仿射变换的帮助下做到这一点:毕竟,众所周知它们可以在平面中平移平面。 首先,我们设计平面上的所有点 Xy 那很容易。 现在我们将建立仿射变换,将点的投影转换为原始的三维点


以及“拾取”点和整个平面 Xy 如此之多,以至于转型之后它将经历我们感兴趣的点。

像往常一样,我们只需要在矩阵的元素之间分配数字


用通常的格式重写最后一个表达式


并画出发生了什么。



线性变换


尽管仿射变换具有实际的重要性,但通常必须处理线性变换。 当然,线性变换是仿射变换的特例,因此有一个地方  vec0 。 这使我们可以稍微简化公式(毕竟,其中一列几乎仅由零组成,因此可以扩展行列式)


如您所见,公式中缺少最后一个包含单位和一列的行。 此结果与我们的想法完全一致,即指定线性变换,足以表明其对 n 线性独立元素。

三点线性变换

让我们解决问题,看看一切如何进行。 问题:已知在线性变换的作用下


我们发现这种线性变换。

我们采用简化的公式,并将正确的数字放在正确的位置:


做完了!


寻找逆变换


回想一下线性变换矩阵


在其列中包含单位向量的图像:


因此,作为单位矢量的矩阵,我们得到其列。 逆变换(假设它存在)又如何呢? 它所做的一切“反之亦然”:


等一下,因为我们只是在线性变换的影响下找到了三个点的图像-足以恢复变换本身!


在哪里  vece1=1;0;0 mathsfT vece2=0;1;0 mathsfT vece3=0;0;1 mathsfT

我们不会将自己局限于三维空间,而以更一般的形式重写前面的公式

如您所见,我们需要在左边的矩阵中分配一列,其中包含vector参数的组成部分,在顶部-一行具有坐标向量的行,然后这仅是行列式的功能。

逆变换问题

让我们在实践中尝试给定的方法。 任务:将矩阵求逆


我们将(2)用于 n=3


立即清楚的是



一个公式的Cramer规则


自从上学以来,我们面临着形式为


如果矩阵 \帽A 非退化的,则解可以写成


嗯...不是在上一节中我看到了相同的表达式,而是 b 是另一封信? 我们将使用它。

这就是克莱默的法则 。 可以通过在第一行上扩展行列式轻松地验证这一点:计算 xi 只是假设我们用  vecei 和它 矩阵列 \帽A 。 现在,如果您重新排列列 b 而不是远程的,那么我们只得到“插入列”规则 b 到位 然后在列中找到行列式。” 是的,有迹象表明,一切都很好:一个人  pm 我们在沿线扩展时生成,而其他在重排时生成-结果,它们彼此抵消。

查看结果方程式,您会发现它与寻找重心坐标的方程式相似:线性方程组的解是找到一个点的重心坐标  vecb 关于单纯形,其中一个顶点  vec0 ,其余的由矩阵的列定义 \帽A

线性方程组的解

我们解决线性方程组


矩阵形式看起来像这样


我们使用结果公式


答案从何而来 x=1/25y=14/25z=2/5


更改基础时矢量坐标的变换


假设我们选择了一个新的基础(我们切换到另一个坐标系)。 已知向量的新坐标是通过旧线性表示的。 因此,我们可以使用我们的工具更改基础也就不足为奇了。 如何做到这一点,我将举一个例子。

因此,让我们脱离标准基础 \ {\ vec {e} _x,\ vec {e} _y \} 以向量为基础


在旧的基础上,指定了一个向量  vecx=3,4 mathsfT 。 在新的基础上找到此向量的坐标。 在新的坐标系中,新基础的向量将成为orts,并将具有坐标


在下文中,列附近的笔划意味着它们中的坐标是指新的基础。 很容易猜到线性变换可以


还可以根据需要转换向量的坐标。 仅适用于公式


以通常的方式解决问题需要矩阵求逆(但是,它也主要由计算行列式组成)和乘法


我们只是将这些步骤打包为一个公式。

为什么公式对逆问题有效?


公式在求解反问题中的有效性由以下等式解释(证明在[1]中


因此,该公式本身隐藏了逆矩阵并与另一个矩阵相乘。 该表达式是按点查找线性变换问题的标准解决方案。 注意,通过在产品标识中使用第二个矩阵,我们得到的只是逆矩阵。 借助它,解决了线性方程组以及可以简化为线性方程组的问题:找到重心坐标,通过拉格朗日多项式进行插值等。 但是,以两个矩阵的乘积形式表示并不能使我们获得与第一行和第一列的扩展相关的非常“两次看”。


拉格朗日插值及其性质


让我提醒您, 拉格朗日插值法正在寻找通过点的最小多项式 a0;b0a1;b1\点an;bn 。 这并不是程序员实践中的常见任务,但还是让我们看看它。

多项式和线性变换有何关系?

事实是多项式


可以视为显示向量的线性变换 xn;xn1;\点;1T mathbbR 。 所以点插值问题 a0;b0a1;b1\点an;bn 简化为找到这样的线性变换


而且我们能够做到这一点。 将正确的字母替换为正确的单元格并获得公式


[1]中可以找到证明这将是Lagrange多项式(而不是其他人)的证明。 顺便说一下,分母中的表达式是Vandermonde的标识符。 知道了这一点并沿着第一行扩展了分子中的行列式,我们得出了拉格朗日多项式更熟悉的公式。

关于拉格朗日多项式的问题

使用困难吗? 让我们尝试解决问题的力量:找到通过点的拉格朗日多项式 1;23;42;7

将这些点代入公式中


在图表上,所有内容都将如下所示。


拉格朗日多项式的性质

在第一行和第一列中列出了较高的行列式之后,我们从两个不同的角度查看拉格朗日多项式。 在第一种情况下,我们从Wikipedia获得经典公式,在第二种情况下,我们以单项式和的形式编写多项式  alphaixi 在哪里


现在,我们可以相对轻松地证明相当复杂的陈述。 例如,在[2]中,在一行中证明了基本拉格朗日多项式的和等于1,并且拉格朗日多项式内插 a0;an+10\点an;an+1n 零值 1na0 cdot cdots cdotan 。 好吧,不是一个拉格朗日-相似的方法可以通过正弦余弦或其他函数应用于插值。

结论


感谢所有读完本书的人。 在本文中,我们使用一个非标准公式解决了标准问题。 我喜欢它是因为,首先,它表明仿射(线性)变换,重心坐标,插值甚至是Lagrange多项式都密切相关。 毕竟,当以同样的方式编写问题的解决方案时,对它们的亲和力的思考就源于此。 其次,大多数时候,我们只是将输入数据安排在正确的单元格中,而无需进行其他转换。

我们考虑的任务也可以通过非常熟悉的方法来解决。 但是,对于小尺寸的问题或教育任务,该公式可能会有用。 另外,她对我来说似乎很美丽。

参考文献



[ 1] 仿射简单映射初学者指南

[ 2] 仿射映射单纯形的工作簿

Source: https://habr.com/ru/post/zh-CN463349/


All Articles