【问题标题】:Affine transformation仿射变换
【发布时间】:2010-12-17 16:43:23
【问题描述】:

我正在尝试解决以下问题。我对Affine transformations 了解不多。谁能帮我回答这个问题:

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

【问题讨论】:

  • 这不是家庭作业....我正在准备面试,这是一个示例问题。

标签: graphics affinetransform


【解决方案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

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

希望对你有帮助

【讨论】:

    【解决方案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]
    

    【讨论】:

      【解决方案3】:

      当然,您已经阅读了有关该主题的 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 也可能具有预定值(它们可能为零)。非零值应用线性(仿射)变换、缩放、剪切和旋转输入形状。

      您需要在教科书中查找类似信息。或者在 Wiki 页面中 - 我没有仔细看(上面的信息来自古代记忆)。

      【讨论】:

      • 根据您使用的是列向量还是行向量,g 和 h 都为零,或者 c 和 f 都为零。虽然这在数学上是正确的,但解决它最终会在剩下的 6 个变量中为你提供一个由 6 个方程组成的系统,这比你想在面试中解决的要复杂得多。
      【解决方案4】:

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

      【讨论】:

      • 仿射变换总是将平行四边形(包括正方形)变换成其他平行四边形。因为我们被告知生成的四边形实际上是一个平行四边形,这意味着它实际上可以通过仿射变换来执行,并且问题没有过度约束。
      • 但是如果问题被错误地陈述并且您可以使用最小二乘法找到最佳近似值,那么您应该当场得到这份工作!
      猜你喜欢
      • 2013-07-04
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多