如何在CGPath或NSBezierPath上添加randon透明点

时间:2013-02-08 17:23:17

标签: cocoa quartz-graphics cgpath nsbezierpath

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

2 个答案:

答案 0 :(得分:0)

您可以枚举NSBezierPath或CGPath的元素,并为每个元素执行某些操作。

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

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

元素类型在它们之间大致相同:

  • movetolineto有一点。

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

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

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

  • 核心图形具有二次curveto元素,只有两个点。

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

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

  • closepath没有积分。它返回到最后moveto
  • 的点

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

答案 1 :(得分:0)

使用-bezierPathByFlatteningPath

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

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

例如,如果要绘制对象的多个副本,则必须找到对象将驻留在展平副本的哪个部分。找到该段后,在该段的两端之间进行线性插值,以找到确切的点。

Distribute objects on a NSBezierPath

如果这是你想要实现的目标,我可以稍微详细说明并发布我写的类别。