10

我正在 CTM 上进行一系列平移和旋转,在某些时候我需要将其重置为身份,然后再进一步进行转换。

我找不到任何合适的方法来做到这一点(显然,应该有一个名为 CGContextSetCTM 左右的函数)并且由于效率是关键,我不想使用 CGContextSaveGState/CGContextRestoreGState ...

4

3 回答 3

16

通过CGContextGetCTM获取当前变换矩阵,用CGAffineTransformInvert反转它,然后用CGContextConcatCTM将当前矩阵乘以反转的矩阵(这很重要!)。CTM 现在是身份。

于 2009-02-07T00:57:40.677 回答
3

保存/恢复操作可能是与单位矩阵大小(大小的两倍或三倍)相当的内存区域的单个内存副本。它可能只发生在保存操作中。考虑到这可能并不比 nop FUNCTION 调用慢多少。每个图形运算都在几个乘法运算的范围内,我猜这在每个保存/恢复周期的代码中都会发生不止一次。一个图形操作的时间可能大于单个保存/恢复周期。

于 2011-04-25T14:57:29.027 回答
3

请注意,如果您当前的 CTM 是单数,则使用 CGAffineTransformInvert 反转当前 CTM 不起作用。

显而易见的情况是,如果先前使用矩阵 CGAffineTransformMake(0, 0, 0, 0, 0, 0) 执行 CGContextConcatCTM。

于 2011-06-01T07:57:08.827 回答