【问题标题】:Unable to understand iOS core graphics coordinate system transformation, need assistance无法理解iOS核心图形坐标系转换,需要帮助
【发布时间】:2012-03-13 14:09:08
【问题描述】:

我正在尝试了解石英 2d 坐标系,目前我正在阅读 Apple 参考指南和旧书“Mac os x 开发人员的石英 2d 图形”。

我理解用户空间和设备空间的概念,设备空间可以有不同的默认坐标系,设备空间坐标不能修改,我们通过修改其坐标系来映射用户空间设备空间来实现期望的结果。


  • 问题的第一部分

Mac os x 开发者书籍的 Quartz 2d graphics 说:

当变换一个坐标系时,你必须有另一个 与之比较的坐标系。该转换提供了一个 从一个坐标系到另一个坐标系的相对映射。当你 在变换后的坐标系中绘制,变换映射 图形回到第一个坐标系。那的出现 固定坐标系中的图形受 转型。

我没有用粗体表示这一点。

Quartz 2D programming guide 说:

Quartz 通过单独的坐标实现设备独立性 system—用户空间—将其映射到输出的坐标系 设备—设备空间—使用当前变换矩阵或 CTM。一种 矩阵是一种用于有效描述集合的数学结构 的相关方程。当前的变换矩阵是 称为仿射变换的特定类型的矩阵,它映射 通过应用平移从一个坐标空间指向另一个坐标空间, 旋转和缩放操作(移动、旋转和 调整坐标系)。

当前的变换矩阵有一个次要目的:它允许 您可以改变对象的绘制方式。例如,画一个盒子 旋转 45 度,你旋转页面的坐标系 (CTM)在您绘制方框之前。 Quartz 绘制到输出设备 使用旋转坐标系。

令人困惑的是“石英使用旋转坐标系绘制到输出设备。”,如果我想绘制一个旋转的对象(图像等)而另一个不旋转,那么会发生什么?我们已经旋转了整个坐标,每一个被绘制的东西都会被旋转?

我正在尝试不同的实验,但无法解决这个问题,我创建了一个图像,我在 photoshop 中绘制两条线复制左下角坐标系,然后添加到我的项目中,通过调用 CGContextRotateCTM(myContext, 45); 来查看坐标的明显表现在drawrect方法中,但它没有对我使用接口生成器将图像放在uiimage中的xib文件中包含的图像做任何事情。

此代码来自石英 2D 编程指南

CGContextRef myContext = UIGraphicsGetCurrentContext();
CGRect contextRect = self.bounds;

CGContextTranslateCTM(myContext, 0, contextRect.size.height);
CGContextRotateCTM(myContext, 45); //my modification
CGContextScaleCTM(myContext, 1, -1);

float w, h;
w = contextRect.size.width;
h = contextRect.size.height;

CGAffineTransform myTextTransform;
CGContextSelectFont (myContext, "Helvetica-Bold", h/10, kCGEncodingMacRoman);
CGContextSetCharacterSpacing (myContext, 10);
CGContextSetTextDrawingMode (myContext, kCGTextFillStroke);

CGContextSetRGBFillColor (myContext, 0, 1, 0, .5);
CGContextSetRGBStrokeColor (myContext, 0, 0, 1, 1);
myTextTransform =  CGAffineTransformMakeRotation(0);
CGContextSetTextMatrix (myContext, myTextTransform);
CGContextShowTextAtPoint (myContext, 0, 50, "Quartz 2D", 9);

但是这段代码修改的是屏幕上绘制的文本而不是我添加的图像?


  • 问题的第二部分

这也来自 Quartz 2D 编程指南:

... 应用将原点转换为左上角的变换 PDF 上下文的角并将 y 坐标缩放 -1。

使用缩放变换来否定 y 坐标会改变一些 石英绘图中的约定。例如,如果您调用 CGContextDrawImage 将图像绘制到上下文中,图像是 当它被绘制到目的地时被变换修改。 ...

我已经在做这个 -1 的事情,但对图像没有影响,这个 -1 的事情我仍然不清楚。

我已多次阅读此文档,尝试在 google 上搜索,但没有有用的教程,也没有最新的书籍,只有 2004、2005、2006 年编写的书籍。任何人都可以帮助或可以参考我有用的资源来学习深入这个。

迫切地等待回复,真的需要帮助。 谢谢。

【问题讨论】:

    标签: ios core-graphics


    【解决方案1】:

    【讨论】:

    • 这正是我想要的,它清除了我的概念。非常感谢。
    【解决方案2】:

    您是否使用 UIImageView 子类并覆盖 drawRect?这不受支持(请参阅文档),这可能是您的图像不受任何转换影响的原因。

    如果你想做很多转换和定制绘图代码,那么你应该使用 UIView 子类并使用 CGContextDrawImage() 手动绘制图像

    任何变换都应用于变换后完成的绘图操作。您将在文档中看到代码示例,其中保存了图形状态、应用了变换、完成了一些绘图,然后恢复了上下文。这就是您如何绘制一些旋转的组件,而另一些则不旋转。

    希望一旦您通过 CG 代码而不是通过图像视图绘制图像,您的问题的第二部分就会变得清晰。

    【讨论】:

    • 我正在使用 uiview 子类,并且在它的 drawrect 中我正在编写所有代码。只是想看到坐标和转换的明显行为,为什么我添加图像绘制两条线,呈现左下角坐标,这是石英 2d 默认值。在 xib 文件中,我将该图像放在 uiimage 中。我用我正在执行所有代码的子类修改这个视图而不是 uiimage,所以整个视图是我创建的 draw2d 类的子类。感谢您的回复。
    • “在 xib 文件中我将图像放入 UIImage”是什么意思?我读到这是您在制作 uiimageview 时提出的问题,因为您无法在 xib 文件中创建 UIImage。我不明白你是如何设置的,你能在你的问题中放一些截图吗?
    • 我拖放了 uiimageview 并且我设置了坐标图像并且没有做任何其他事情,在这样做并编写了转换代码之后我所期望的图像也会旋转并且我将明显地看到坐标现在的位置,所以我可以很容易地理解代码。
    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多