仿射变换

时间:2009-11-18 00:44:43

标签: graphics affinetransform

我正在尝试解决以下问题。我对Affine transformations知之甚少。有人可以帮我回答这个问题:

找到表示齐次坐标的2D仿射变换的3x3矩阵(即每个点[x,y]表示为列向量[x,y,1]),它转换正方形[0,0],[ 1,0],[1,1],[0,1]成平行四边形[0,1],[1,1],[2,2],[1,2]。

4 个答案:

答案 0 :(得分:1)

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

有趣的是,我认为答案只需要翻译和剪切(无旋转) 查看源点和目标点,看起来所有的原点在y中都被翻译为+1并且在X中被剪切为1(为了给出平行四边形,可能最好把它画出去看看我的意思)

首先从3 * 3 identity matrix开始,这是

1 0 0
0 1 0
0 0 1

剪切将是
1 1 0
0 1 0
0 0 1

翻译将是
1 0 0
0 1 1
0 0 1

所以把它们放在一起应该是

1 1 0
0 1 1
0 0 1

我通常不使用专业列,所以可能值得仔细检查!

希望有所帮助

答案 1 :(得分:0)

您当然会阅读有关该主题的Wikipedia页面。

大约一段时间以前,我在其中一个先前版本中读过Foley and van Dam(这可能是1983年或1984年),它涵盖了使用增强矩阵和向量处理2D和3D坐标的技术。在问题中描述。然而,从那时起已经过去了足够的时间,我已经忘记了所有的细节(并且不再有书 - 房子的动作太多了)。还有纽曼和斯普劳尔的一本书,我似乎记得。

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也可能具有预先给定的值(它们可能是零)。非零值应用线性(仿射)变换,缩放,剪切和旋转输入形状。

您需要在教科书中查找类似的信息。或者在维基页面中 - 我并没有认真对待它(上面的信息是从古代记忆开始的)。

答案 2 :(得分:0)

我只想指出四点过度约束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

答案 3 :(得分:0)

仿射变换是形式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 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]