You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:17:03