【问题标题】:CGAffineTransform Translation and Rotation produces unrounded transformation resultCGAffineTransform 平移和旋转产生不圆角的变换结果
【发布时间】:2014-03-26 23:25:10
【问题描述】:

对于给定的变换计算,

CGAffineTransform preferredTransform = CGAffineTransformMake(-1, 0, 0, -1, 1920, 1080);
CGAffineTransform transform1 = CGAffineTransformConcat(CGAffineTransformMakeTranslation(-preferredTransform.tx, -preferredTransform.ty), CGAffineTransformMakeRotation(M_PI));
NSLog(@"%@", NSStringFromCGAffineTransform(transform1));

输出将是 [-1, 1.2246467991473532e-16, -1.2246467991473532e-16, -1, 1920.0000000000002, 1079.9999999999998] 但我希望它是 [-1, 0, 0, -1, 1920, 1080]

为什么会出现舍入错误? 我应该以不同的方式应用转换以产生四舍五入的结果吗?

【问题讨论】:

    标签: avfoundation cgaffinetransform affinetransform cgaffinetransformscale


    【解决方案1】:

    在 32 位 iPad 上舍入是正确的,但在 64 位 iPad 上会发生舍入错误。由于 M_PI 的旋转与 -1 的缩放相同,因此可以通过将其更改为:

    CGAffineTransform preferredTransform = CGAffineTransformMake(-1, 0, 0, -1, 1920, 1080);
    CGAffineTransform transform1 = CGAffineTransformConcat(CGAffineTransformMakeTranslation(-preferredTransform.tx, -preferredTransform.ty), **CGAffineTransformMakeScale(-1, -1)**);
    
    NSLog(@"%@", NSStringFromCGAffineTransform(transform1));
    

    【讨论】:

      【解决方案2】:

      指定的舍入误差是由于 64 位架构造成的。如果您在 32 位模拟器上启动,您应该不会看到这些舍入错误。

      【讨论】:

      • 那么,我应该注意不要使用那个 M_PI 代码吗?
      • 恐怕问题不在 M_PI 中。您可以将 M_PI 转换为浮动并查看,该转换仍然存在舍入错误。我想出的解决方案是使用roundf() 函数。它适合这里,因为变换矩阵的值实际上是整数。我不确定我们如何为其他更复杂的转换修复它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 2014-09-09
      • 1970-01-01
      • 2016-12-12
      相关资源
      最近更新 更多