【问题标题】:Find Scale Value from CGAffineTransform从 CGAffineTransform 中查找比例值
【发布时间】:2011-10-15 05:17:22
【问题描述】:

好的,所以我意识到我可以像这样从图层的 CATransform3D 中找到比例值:

 float scale = [[layer valueForKeyPath: @"transform.scale"] floatValue];

但我一生都无法弄清楚如何从 CGAffineTransform 中找到比例值。比如说我有这个名为“cameraTransform”的 CGAffineTransform:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
CGAffineTransform *cameraTransform =  imagePicker.cameraViewTransform;

现在如何从 cameraTransform 中获取比例值?

【问题讨论】:

    标签: iphone objective-c ios ipad core-graphics


    【解决方案1】:

    我尝试为所有类型的 CGAffineTransforms 给出一个通用的答案,甚至是旋转的。

    假设您的 CGAffineTransform 包含(可选)

    • 旋转
    • 翻译
    • 缩放

    • 没有歪斜

    然后有一个通用公式可以为您提供比例因子:

    CGAffineTransform transform = ...;
    CGFloat scaleFactor = sqrt(fabs(transform.a * transform.d - transform.b * transform.c));
    

    “镜像”或翻转坐标方向将被忽略,这意味着 (x --> -x; y --> y) 将导致 scaleFactor == 1 而不是 -1。

    【讨论】:

    • 帮我省了一次代数书之旅!
    【解决方案2】:

    http://en.wikipedia.org/wiki/Determinant

    “可以对具有实数项的方阵行列式的值给出几何解释:行列式的绝对值给出了在相关线性变换下面积或体积乘以的比例因子,而它的符号表示变换是否保持方向。因此,一个行列式为 -2 的 2 × 2 矩阵,当应用于具有有限面积的平面区域时,会将该区域转换为面积为两倍的区域,同时反转其方向。"

    文章接着给出了 3x3 矩阵和 2x2 矩阵的行列式的公式。 CGAffineTransforms 是 3x3 矩阵,但它们的右列始终为 0 0 1。结果是行列式将等于矩阵的 2x2 左上平方的行列式。因此,您可以使用结构中的值并自己计算比例。

    【讨论】:

    • 这是最酷的方法。感谢行列式!顺便说一句,您将获得全局比例,而不是 x 方向和 y 方向的不同值。我认为您可以使用公式 scale_x = sqrt(a^2+c^2)、scale_y = sqrt(b^2+d^2) where a = transform.a 等获得这些单独的值。
    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2014-11-20
    • 2017-03-20
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多