我正在尝试解决以下问题。我对仿射变换了解不多。有人可以帮我回答这个问题:
找到一个 3x3 矩阵,表示齐次坐标的 2D 仿射变换(即每个点[x,y]
都表示为一个列向量[x, y, 1]
),它将正方形[0,0],[1,0],[1,1],[0,1]
转换为平行四边形[0,1],[1,1],[2,2],[1,2]
。
我正在尝试解决以下问题。我对仿射变换了解不多。有人可以帮我回答这个问题:
找到一个 3x3 矩阵,表示齐次坐标的 2D 仿射变换(即每个点[x,y]
都表示为一个列向量[x, y, 1]
),它将正方形[0,0],[1,0],[1,1],[0,1]
转换为平行四边形[0,1],[1,1],[2,2],[1,2]
。
仿射变换是 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-vector,左下角的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]
我发现的关于这个问题的事情
1)你需要了解齐次坐标
2)你需要知道行和列专业之间的区别 -在这里阅读
3)你需要知道基本的仿射变换 - 旋转、缩放/剪切和平移以及如何在矩阵中表示它们 -阅读此页面
有趣的是,我认为答案只需要平移和剪切(无需旋转)。
查看源点和目标点,看起来所有目标点都在 y 中平移了 +1,在 X 中被剪切了 1(为了给出平行四边形,最好把它画出来看看我的意思)
所以从一个 3 * 3 的单位矩阵开始,它是
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
我通常不使用列专业所以可能值得仔细检查!
希望有帮助
当然,您已经阅读了有关该主题的Wikipedia页面。
很久以前,我读过Foley 和 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 也可能具有预定值(它们可能为零)。非零值应用线性(仿射)变换、缩放、剪切和旋转输入形状。
你需要在教科书中寻找类似的信息。或者在 Wiki 页面中 - 我没有仔细看(上面的信息来自古代记忆)。
我只是想指出,四点约束了 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