【问题标题】:How to add randon transparent dots over CGPath or NSBezierPath如何在 CGPath 或 NSBezierPath 上添加随机透明点
【发布时间】:2013-01-24 12:55:26
【问题描述】:

想知道如何在CGPathNSBezierPath 上添加透明点或线。 以下是有关该问题的更多详细信息。 我有一条实线,说 width = 30(使用 NSBezierPathCGPath 绘制),现在我想在其上绘制透明点或透明线(厚度 = 2 或小于 30 的东西)。

【问题讨论】:

    标签: cocoa quartz-graphics cgpath nsbezierpath


    【解决方案1】:

    您可以枚举 NSBezierPath 或 CGPath 的元素,并为每个元素做一些事情。

    对于 NSBezierPath,使用 elementCountelementAtIndex:associatedPoints:for 循环。 elementAtIndex:associatedPoints: 需要一个最多包含三个 NSPoints 的 C 数组。

    对于 CGPath,使用 CGPathApply。这需要一个指向您编写的 C 函数的指针。该函数的两个参数之一是一个结构,它包含由elementAtIndex:associatedPoints: 返回的相同信息,除了它将为您创建点数组。

    它们之间的元素类型大多相同:

    • movetolineto 携带一分。

      您可能想知道为什么lineto 没有两个点。与元素关联的点是目标点——lineto 中的 to——即紧随其后的新当前点。另一点,你来自的那一点,是隐含的。如果你想使用它,你只需要记住最后一个当前点。

    • A(立方)curveto 使用所有三个点。

      lineto 一样,源点是隐含的,只是最后一个当前点。数组中的最后一个点是目标锚点;另外两个点是控制点。

    • Core Graphics 有二次 curveto 元素,它们只有两个点。

      一个立方curveto 有两个控制点和一个锚点;二次方只有一个控制点和一个锚点。

      NSBezierPath 没有二次 curveto 元素。 NSBezierPath 中的所有 curveto 元素都是立方的。

    • closepath 没有积分。它返回到最后一个moveto 的位置。

    无论哪种方式,为每个元素绘制您想要的任何锚点指示符。例如,您可以在目标点绘制一个蓝色圆圈,而不为 closepath 绘制任何东西(因为您在遇到匹配的 moveto 时已经绘制了它)。对于curveto 元素,您可能还想为两个控制点中的每一个绘制一个指示器。

    【讨论】:

    • 感谢您提供有关 CGPath 和 NSBezierPath 的详细信息。我已经使用点数组绘制了一条可靠的路径。现在我想在这条实线上绘制透明的虚线或点或小线。我的目标是创建一条看起来像画笔的实线。我见过 CGContextSetBlendingMode()。但这对我不起作用。谢谢。
    • @Omkar:我的答案是针对您正在做的事情,而不是简单地绘制路径。您将需要枚举路径的元素并为每个元素绘制所需的任何短划线、点、小线或其他指示符。
    • 我的要求不仅仅是画虚线或点。我想在实线上绘制透明线或点,绘制透明点的输出应该使区域透明(通常在实线(不透明)线上绘制透明线会给你实线本身,但我想让区域透明)。我认为这个问题必须用其中一种混合模式来解决,但我不知道混合模式如何与透明表面一起工作。我阅读了混合模式,但在所有示例中,他们都考虑了不透明的表面/图像。
    • @Omkar:你可以使用destination-out混合模式使曾经是固体的东西变得透明。
    【解决方案2】:

    使用-bezierPathByFlatteningPath

    一旦你把接收器的副本弄平,计算它的长度。

    然后,遍历展平的副本,这基本上是一个点数组。跟踪连续点之间的距离,以便您可以看到您在曲线上的确切位置。

    例如,如果您想绘制一个对象的多个副本,您必须找到该对象将驻留在展平副本的哪个段上。找到该段后,在该段的两端之间进行线性插值以找到确切的位置。

    如果这是您想要实现的目标,我可以稍微详细说明一下并发布我编写的用于实现此目的的类别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多