如何同时使用CGAffineTransform缩放和翻转?

3
我正在尝试使用 CGAffineTransform 转换一个点的数组。缩放功能完美,但是点使用左上角作为 (0,0),而不是左下角。如下所示...

Upside down graph

通常我只需使用 CGAffineTransformMakeScale(1,-1);,但由于我已经执行了缩放,因此无法将其添加到现有变换中。

这是我的当前代码:

- (CGAffineTransform)transformFromValueToScreen
{
    CGRect fromRect = self.valueSpace;
    CGRect viewRect = self.screenSpace;

    CGSize scales = CGSizeMake(viewRect.size.width/fromRect.size.width,
                               viewRect.size.height/fromRect.size.height);

    CGAffineTransform transform = CGAffineTransformMakeScale(scales.width, 
                                                             scales.height);

    return transform;
}
1个回答

7

我假设fromRect.originCGPointZero

您需要一个复合变换,将原点移动到左下角,翻转Y轴并应用所需的缩放。

您可以使用修改变换的函数来创建复合变换,例如:

- (CGAffineTransform)transformFromValueToScreen {
    CGRect fromRect = self.valueSpace;
    CGRect viewRect = self.screenSpace;

    CGSize scales = CGSizeMake(viewRect.size.width/fromRect.size.width,
                               viewRect.size.height/fromRect.size.height);

    CGAffineTransform transform = CGAffineTransformIdentity;

    // Move origin from upper left to lower left.
    transform = CGAffineTransformTranslate(transform, 0, fromRect.size.height);

    // Flip the sign of the Y axis.
    transform = CGAffineTransformScale(transform, 1, -1);

    // Apply value-to-screen scaling.
    transform = CGAffineTransformScale(transform, scales.width, scales.height);

    return transform;
}

如果您认为对代码进行更改可以改善其他人的答案,请发表评论而不是建议编辑。 - Adi Inbar
太好了,谢谢。我在转换的精细顺序方面仍然容易混淆。另外,我能否建议稍作修改:fromRect.bounds.height 应该改为 viewRect.size.height - Benjamin
@soboxstudio 我理解,但我认为是否更改他的答案应该由他决定。 - Adi Inbar
@robmayoff 我已经尝试了两种方式,viewRect看起来是正确的。而使用fromRect会把整个转换放得太高。干杯! - Benjamin
另外作为参考;这是我正在编写的一个图形库。https://github.com/BenjaminBriggs/BBGraphKit - Benjamin
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接