Graphics 仿射变换

Graphics 仿射变换,graphics,affinetransform,Graphics,Affinetransform,我正在努力解决下面的问题。我对这方面的知识不多。有人能帮我回答这个问题吗 求一个表示齐次坐标二维仿射变换的3x3矩阵(即每个点[x,y]表示为列向量[x,y,1]),该矩阵将正方形[0,0],[1,0],[1,1],[0,1]转换为平行四边形[0,1],[1,1],[2,2]当然,您已经阅读了有关该主题的页面 大约在很久以前,我读过一本之前的版本(这可能是1983年或1984年),其中涵盖了使用问题中描述的增广矩阵和向量操纵二维和三维坐标的技术。然而,从那以后,我已经忘记了所有的细节(也不再有这

我正在努力解决下面的问题。我对这方面的知识不多。有人能帮我回答这个问题吗

求一个表示齐次坐标二维仿射变换的3x3矩阵(即每个点
[x,y]
表示为列向量
[x,y,1]
),该矩阵将正方形
[0,0],[1,0],[1,1],[0,1]
转换为平行四边形
[0,1],[1,1],[2,2]

当然,您已经阅读了有关该主题的页面

大约在很久以前,我读过一本之前的版本(这可能是1983年或1984年),其中涵盖了使用问题中描述的增广矩阵和向量操纵二维和三维坐标的技术。然而,从那以后,我已经忘记了所有的细节(也不再有这本书——太多的搬家了)。我似乎还记得纽曼和斯普鲁写的一本书

A = [ a  b  c ]    B = [ 0  1  1  0 ]   C = [ 0  1  2  1 ]
    [ d  e  f ]        [ 0  0  1  1 ]       [ 1  1  2  2 ]
    [ g  h  1 ]        [ 1  1  1  1 ]       [ 1  1  1  1 ]
B列代表正方形的角;C列表示平行四边形的角;矩阵方程A x B=C必须求解。IIRC,矩阵A在右下角有一个1;值c、f、g和h也可能有预先指定的值(它们可能是零)。非零值应用线性(仿射)变换、缩放、剪切和旋转输入形状


你需要在教科书中寻找类似的信息。或者在Wiki页面中-我没有仔细看(上面的信息是从古代记忆中提取的)。

我发现了关于这个问题的一些事情
1) 您需要了解
2) 您需要知道行和列主键之间的区别-
3) 您需要了解基本仿射变换-旋转、缩放/剪切和平移,以及如何在矩阵中表示它们-

有趣的是,我认为答案只需要平移和剪切(无旋转)。
看看源点和目标点,看起来所有的目标点都在y方向上平移+1,然后在X方向上剪切1(为了得到平行四边形,最好把它画出来看看我的意思)

所以从一个3*3开始

100
0110
01

剪切力将
110
0110
01

翻译将是
100
01
01

所以,把所有这些放在一起应该是

110
01
01

我通常不使用column major,因此可能值得仔细检查


希望这能有所帮助,我只是想指出,四个点对2D仿射变换有过度约束。在Jonathan Leffler的评论中,您可以从需要反转非方矩阵的事实中看出这一点。所以,要么选择三个点,要么建立一个最小二乘系统。过约束最小二乘解可通过以下矩阵求解

A = [ a  b  c ]    B = [ 0  1  1  0 ]   C = [ 0  1  2  1 ]
    [ d  e  f ]        [ 0  0  1  1 ]       [ 1  1  2  2 ]
    [ g  h  1 ]        [ 1  1  1  1 ]       [ 1  1  1  1 ]
所以,用正规方程组求解得到

A B = C
(A B)^T = B^T A^T = C^T
B B^T A^T = B C^T
A^T = (B B^T)^-1 B C^T
撤消该转置会使

A =  ((B B^T)^-1 B C^T)^T

仿射变换是形式x的变换⟼ Ax+b,其中x和b是向量,A是方阵。几何上,仿射变换将平行四边形映射为平行四边形,并沿直线保持相对距离

要解决这样的问题,我们首先要注意,对于原点,我们有0⟼ A0+b=b。因为问题告诉我们[0,0]⟼ [0,1],我们知道b=[0,1]

接下来,我们回顾一下线性代数,将矩阵与标准基向量[0,1]和[1,0]相乘,即可分别提取矩阵的第一列和第二列:

[a b] [1] = [a],  [a b] [0] = [b].
[c d] [0]   [c]   [c d] [1]   [d]
我们得到[1,0]⟼ [1,1]和[0,1]⟼ [1,2]. 由此我们得到

[1,1] = A[1,0] + b = [a,c] + [0,1] ⟹ [a,c] = [1,0],
[1,2] = A[0,1] + b = [b,d] + [0,1] ⟹ [b,d] = [1,1].
这给了我们仿射变换

Ax + b = [1 1] x + [0].
         [0 1]     [1]
齐次坐标是一种技巧,它让我们将仿射变换写成矩阵,只需一个额外的坐标总是设置为1。矩阵公式为

[A b] [x] = [Ax+b].
[0 1] [1]   [   1]
这里A实际上是一个2×2矩阵,而b和x是2向量,左下角的0实际上是[0]。总的来说,我们处理的是3×3矩阵和3向量

所以我们的解决方案是

[1 1 0]
[0 1 1],
[0 0 1]
为了更好地测量,我们检查它是否在最后一点正常工作:

[1 1 0] [1]   [2]
[0 1 1] [1] = [2].
[0 0 1] [1]   [1]

这不是家庭作业。。。。我正在准备面试,这是一个示例问题。仿射变换总是将平行四边形(包括正方形)变换为其他平行四边形。因为我们被告知生成的四边形实际上是一个平行四边形,这意味着它实际上可以通过仿射变换来执行,并且问题没有过度约束。但是如果问题被陈述错误,并且你可以使用最小二乘法找到最佳近似值,那么你应该当场得到工作!取决于使用的是列向量还是行向量,g和h都是零,或者c和f都是零。虽然这在数学上是正确的,但解决它最终会得到一个由6个剩余变量中的6个方程组成的系统,这比你在面试中想要解决的要复杂得多。