Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CGAffineTransform连接:适当的转换顺序_Ios_Swift_Cgaffinetransform - Fatal编程技术网

Ios CGAffineTransform连接:适当的转换顺序

Ios CGAffineTransform连接:适当的转换顺序,ios,swift,cgaffinetransform,Ios,Swift,Cgaffinetransform,我知道,每当我们想要对一个点同时应用一系列变换时,我们必须指定与我们想要感知的相反方向的序列。如果我想平移(T)然后旋转(R)一个点x,我们需要以串联矩阵RT结束,然后每个点都被转换为(RT)x 文档显示CGAffineTransform作为上述表达式的转置版本工作。i、 e将a点变换为Ax对于a作为任何变换矩阵,它们将a点变换为xB对于B作为a的转置 文档还指出,它向右堆叠变换,以变换矩阵的形式结束,即T1*T2 现在我关心的是什么?如果需要一系列转换,即转换(T)然后旋转(R),我可以调用T

我知道,每当我们想要对一个点同时应用一系列变换时,我们必须指定与我们想要感知的相反方向的序列。如果我想平移(T)然后旋转(R)一个点x,我们需要以串联矩阵RT结束,然后每个点都被转换为(RT)x

文档显示CGAffineTransform作为上述表达式的转置版本工作。i、 e将a点变换为Ax对于a作为任何变换矩阵,它们将a点变换为xB对于B作为a的转置

文档还指出,它向右堆叠变换,以变换矩阵的形式结束,即T1*T2

现在我关心的是什么?如果需要一系列转换,即
转换
T)然后
旋转
R),我可以调用
T.concatenating(R)
,这会导致转换TR,然后将点转换为xTR,似乎必须遵守顺序,但实际上我得到了错误的结果(至少我是这么认为的),我希望图像A得到B

它们似乎正在将点转换为TRx,但这与文档相矛盾,并且当您将转换TR应用于与顺序xTR一致的点时,结果也不匹配


为什么?关于在iOS中如何进行转换,我缺少了一些东西?

如果我没有弄错的话,您的困惑不在于操作顺序,而在于旋转转换。旋转不是围绕对象的中心进行的,而是围绕帧的原点进行的,该原点保持不变。当旋转未居中于帧原点的对象时,它会像时钟指针的末端一样绕轴旋转。要实现图像A,您必须

  • 平移对象,使要旋转对象的点(可能是其中心)位于原点
  • 旋转对象
  • 将其平移到所需位置

  • 很难看出这里的问题是什么,因为你已经回答了。基本上,调用
    连接时必须使用的顺序与链接转换时使用的顺序相反。例如:

    v2.transform = 
         CGAffineTransform(rotationAngle: 45 * .pi/180).translatedBy(x: 100, y: 0)
    
    在此屏幕截图中,
    v2
    是绿色视图,从紫色视图开始:

    如果您想通过
    连接
    ,您会说:

    let r = CGAffineTransform(rotationAngle: 45 * .pi/180)
    let t = CGAffineTransform(translationX:100, y:0)
    v2.transform = t.concatenating(r) // not r.concatenating(t)
    

    谢谢你的回答,变换已经从对象中心开始了,你提到的步骤已经完成了,问题是我想要平移->然后->旋转,所以我得到了图像A,但实际上我得到了图像B,这是旋转->然后->平移的结果。T.串联(R)应该产生一个矩阵TR,该矩阵TR像图像a中那样变换点,但结果是B。(讨论和示例直接来自我的书:)
    let r = CGAffineTransform(rotationAngle: 45 * .pi/180)
    let t = CGAffineTransform(translationX:100, y:0)
    v2.transform = t.concatenating(r) // not r.concatenating(t)