我正在尝试解决以下问题。我对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]。
答案 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]