0

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

4

2 回答 2

0

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

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

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

它们之间的元素类型基本相同:

  • Amovetolineto携带一分。

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

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

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

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

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

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

  • Aclosepath没有积分。它返回到最后一个点moveto

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

于 2013-02-10T01:31:55.783 回答
0

使用-bezierPathByFlatteningPath.

一旦你已经扁平化了接收器的副本,计算它的长度。

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

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

在 NSBezierPath 上分布对象

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

于 2013-03-13T14:52:22.757 回答