如何判断CGAffineTransform仅含缩放/平移而非斜切/旋转?
高效判断CGAffineTransform是否仅含缩放和平移操作
要判断一个CGAffineTransform是否只包含缩放和平移(无旋转、斜切),直接检查变换矩阵的b和c分量是否都为0即可,这是最高效的方式,无需额外计算。
原理说明
CGAffineTransform的结构由6个参数组成:a, b, c, d, tx, ty,对应的变换矩阵为:
[ a b 0 ] [ c d 0 ] [ tx ty 1 ]
- 当
b = 0且c = 0时,矩阵仅保留了水平缩放(a)、垂直缩放(d)和平移(tx, ty)的效果,完全没有旋转或斜切的分量。 - 只要
b或c不为0,变换就包含了旋转或斜切操作,此时CGRectApplyAffineTransform返回的矩形会和原矩形顶点变换后的外接矩形存在差异。
代码示例
Objective-C
BOOL isOnlyScaleAndTranslate(CGAffineTransform transform) { return (transform.b == 0 && transform.c == 0); }
Swift
func isOnlyScaleAndTranslate(_ transform: CGAffineTransform) -> Bool { return transform.b == 0 && transform.c == 0 }
精度补充(处理浮点数误差)
如果变换是通过计算生成的,可能存在极小的浮点数误差,可引入阈值判断:
// Objective-C BOOL isOnlyScaleAndTranslateWithEpsilon(CGAffineTransform transform) { const CGFloat epsilon = 1e-6; return (fabs(transform.b) < epsilon && fabs(transform.c) < epsilon); }
// Swift func isOnlyScaleAndTranslateWithEpsilon(_ transform: CGAffineTransform) -> Bool { let epsilon: CGFloat = 1e-6 return abs(transform.b) < epsilon && abs(transform.c) < epsilon }
内容的提问来源于stack exchange,提问作者OMGPOP
相关产品推荐
相关产品推荐

