1

我正在尝试解决以下问题。我对仿射变换了解不多。有人可以帮我回答这个问题:

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

4

4 回答 4

1

仿射变换是 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]
于 2014-10-27T22:56:35.003 回答
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

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

希望有帮助

于 2009-11-18T19:01:32.157 回答
0

当然,您已经阅读了有关该主题的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 页面中 - 我没有仔细看(上面的信息来自古代记忆)。

于 2009-11-18T01:54:51.120 回答
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
于 2009-12-29T10:58:45.010 回答