【问题标题】:Applying a scale and translate transformation to UIBezierPath对 UIBezierPath 应用缩放和平移转换
【发布时间】:2013-04-22 22:56:22
【问题描述】:

我有一个 UIBezierPath,我想:

  • 移动到 UIView 上的任意坐标
  • 变大或变小

我正在根据预定义坐标列表绘制 UIBezierPath。我实现了这段代码:

CGAffineTransform move = CGAffineTransformMakeTranslation(0, 0);

CGAffineTransform moveAndScale = CGAffineTransformScale(move, 1.0f, 1.0f);
[shape applyTransform:moveAndScale];

我也尝试过缩放然后移动形状,似乎没什么区别。

使用此代码:

[shape moveToPoint:CGPointMake(0, 0)];  

我开始在 (0, 0) 处绘制形状,但这就是发生的情况。我认为这是因为正在从 0、0 到列表中的下一个点绘制一条线。

当我将移动变换设置为 (0, 0) 时,这就是它绘制的位置。在这里,moveToPoint 设置为列表中的第一个坐标对。如您所见,它不在 0, 0 处。

最后,增加 1.0f 将形状完全移出屏幕,无论我告诉形状移动到哪里。

谁能帮我理解为什么形状没有在 0、0 处绘制,以及为什么在我缩放它时它会移出屏幕。

【问题讨论】:

  • 我可能在这个问题上错了,但这段代码 (CGAffineTransformMakeTranslation(0, 0);) 不是说应该沿 x 轴移动 0 个像素,沿 y 轴移动 0 个像素吗? (reference) 它实际上不会将任何东西移动到 origo (0, 0),因为您似乎正在尝试这样做。此外,您似乎也使用了错误的moveToPoint:..
  • 你是对的!考虑到这一点,我改变了数字和它的比例,我现在可以看到它。我如何错误地使用 moveToPoint ?您应该将其发布为答案。

标签: objective-c uibezierpath affinetransform


【解决方案1】:

(根据 OP 在上述评论中的要求)

我可能在这个上错了,但不是这个代码

CGAffineTransformMakeTranslation(0, 0);

只是说应该沿 x 轴移动 0 像素,沿 y 轴移动 0 像素? (reference) 它实际上不会将任何东西移动到 origo (0, 0),因为您似乎正在尝试这样做。

另外,您似乎有点误解了如何正确使用moveToPoint:.. 将其视为移动光标的一种方式,但实际上并未绘制任何内容。这只是一种表达“我想在此时开始绘画”的方式。绘图本身可以通过其他方法进行。如果你想例如画一个边长为 L 的正方形,然后你可以做这样的事情..

// 'shape' is a UIBezierPath
NSInteger L = 100;
CGPoint origin = CGPointMake(50, 50);
[shape moveToPoint:origin]; // Initial point to draw from
[shape addLineToPoint:CGPointMake(origin.x+L, origin.y)]; // Draw from origin to the right
[shape addLineToPoint:CGPointMake(origin.x+L, origin.y+L)]; // Draw a vertical line
[shape addLineToPoint:CGPointMake(origin.x, origin.y+L)]; // Draw bottom line
[shape addLineToPoint:origin]; // Draw vertical line back to origin

请注意,这段代码根本没有经过测试,但它应该让您了解如何使用moveToPoint:addLineToPoint:

【讨论】:

    【解决方案2】:

    您需要注意应用变换的顺序,并且应该考虑将变换连接在一起并一次性应用它们。

    顺序很重要,因为每个变换都会影响路径中的所有 x,y 位置。因此,翻译受比例影响。颠倒顺序,路径将被缩放然后移动。

    此外,坐标系也很重要,尤其是在您进行缩放时。确保在 0,0 附近绘制,然后缩放,然后平移。如果您将点标准化,这是最简单的。归一化纬度/经度值意味着将纬度除以 90,将经度除以 180(这实际上会给您一个范围 -1..1)。执行此操作时,您应首先缩放路径,然后将其平移到视图的中心,然后应用所需的平移。

    【讨论】:

    • 请查看我对该问题所做的修改。他们应该澄清我的要求。
    • 路径中有哪些点以及如何添加它们。这些点可能都应该在 0 和 1 之间进行归一化,以便您可以合理地缩放和定位线。
    • 它们实际上是经度和纬度点,我将其转换为十进制然后按比例缩小以适合 UIView。我通过遍历点数组来添加它们,然后将它们添加到 UIBezierPath 中,如下所示: [shape addLineToPoint:CGPointMake(p.x, p.y)];如何标准化一个点?
    • @Wain,在使用CGAffineTransforms 进行缩放后,如何将其转换到视图的中心?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2017-02-09
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多