如何处理倒转 Y 轴角度的平移矩阵

发布于 2024-07-14 13:01:46 字数 203 浏览 4 评论 0原文

我的用户案例是一个 iPhone 应用程序,我在其中制作图像的缩放、旋转和平移动画。

因此,我将所有内容连接起来并将其提供给变换属性,但有一个问题:

由于我的图像大小不同,因此正确定位它们是一个问题。 我习惯了倒置 y 轴坐标系,因此我希望图像精确定位在 y 轴 60 像素处。

那么,如何从原来的笛卡尔y轴角度变为倒置y轴角度呢?

My usercase is an iphone application where I do an animation on the scale, rotation and translation of an image.

So, I concat everything and feed it to the transform property, but there is one problem:

Since my images vary in size, it is a problem to position them correctly. I'm used to an inverted y axis coordinate system, so I want my image to positioned exactly at 60 pixels in the y axis.

So, how do I change from the original cartesian y axis to an inverted y axis point of view?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

万水千山粽是情ミ 2024-07-21 13:01:47

对于每个 y 坐标,y = top-y,其中 top 是您正在绘制的边界框顶部的 y 坐标。

For every y ordinate, y = top-y, where top is the y ordinate of the top of the bounding box you are drawing in.

如果没有 2024-07-21 13:01:46

正如 smacl 指出的,最简单的方法是使用 (screenheight - viewheight - y) 而不是视图原点中的 y 将原点移动到屏幕的左下角。

但是,您可以使用 CATransform3D 翻转主视图图层的坐标系。 我这样做是为了可以在 iPhone 应用程序和 Mac 客户端之间共享相同的 Core Animation CALayer 布局代码(iPhone 反转 CALayers 的正常 Quartz 坐标系以匹配 UIView 的坐标系)。 要启用此功能,您所需要做的就是将该行放入

self.layer.sublayerTransform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f);

层托管 UIView 的初始化代码中。 请记住,这将翻转您的 CALayers,因此这些层中的任何 UIKit 文本渲染也可能需要使用类似于以下的代码进行翻转:

CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0f, self.frame.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);

UIFont *theFont = [UIFont fontWithName:@"Helvetica" size:fontSize];
[text drawAtPoint:CGPointZero withFont:theFont];

CGContextRestoreGState(context);

您可以使用 CGAffineTransform 进行类似的反转,但您还需要应用翻译要实现这一点:

CGAffineTransform flipTransform = CGAffineTransformMakeTranslation(0.0f, self.frame.size.height);
flipTransform = CGAffineTransformScale(flipTransform, 1.0f, -1.0f);

您可以使用仿射变换来使用 CGPointApplyAffineTransform() 转换原点坐标。

As smacl points out, the easiest way to do this is to shift your origin to the bottom-left of the screen by using (screenheight - viewheight - y) instead of y in the origins of your views.

However, you can flip the coordinate system of your main view's layers using a CATransform3D. I do this so that I can share the same Core Animation CALayer layout code between my iPhone application and a Mac client (the iPhone inverts the normal Quartz coordinate system for CALayers to match that of the UIViews). All you need to do to enable this is to place the line

self.layer.sublayerTransform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f);

in your initialization code for your layer-hosting UIView. Remember that this will flip your CALayers, so any UIKit text rendering in those layers may also need to be flipped using code similar to the following:

CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0f, self.frame.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);

UIFont *theFont = [UIFont fontWithName:@"Helvetica" size:fontSize];
[text drawAtPoint:CGPointZero withFont:theFont];

CGContextRestoreGState(context);

You can do a similar sort of inversion using a CGAffineTransform, but you will also need to apply a translation to make that work:

CGAffineTransform flipTransform = CGAffineTransformMakeTranslation(0.0f, self.frame.size.height);
flipTransform = CGAffineTransformScale(flipTransform, 1.0f, -1.0f);

You may be able to use the affine transform to convert your origin coordinates using CGPointApplyAffineTransform().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文