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

Cocoa 如何在CGPath或NSBezierPath上添加randon透明点,cocoa,quartz-graphics,cgpath,nsbezierpath,Cocoa,Quartz Graphics,Cgpath,Nsbezierpath,想知道如何在CGPath或NSBezierPath上添加透明点或线。 下面是关于这个问题的更多细节。 我有一条实线,宽度=30(使用NSBezierPath或CGPath绘制),现在我想在其上绘制透明点或透明线(厚度=2或小于30的东西)。您可以枚举NSBezierPath或CGPath的元素,并为每个元素做一些事情 对于NSBezierPath,使用元素计数,元素索引:关联点:,以及循环。elementAtIndex:associatedPoints:需要一个最多三个NSPoints的C数组

想知道如何在
CGPath
NSBezierPath
上添加透明点或线。 下面是关于这个问题的更多细节。
我有一条实线,宽度=30(使用
NSBezierPath
CGPath
绘制),现在我想在其上绘制透明点或透明线(厚度=2或小于30的东西)。

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

对于NSBezierPath,使用
元素计数
元素索引:关联点:
,以及
循环。
elementAtIndex:associatedPoints:
需要一个最多三个
NSPoint
s的C数组

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

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

  • moveto
    lineto
    带有一个点

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

  • (立方体)
    曲线to
    使用所有三个点

    lineto
    一样,源点是隐式的,只是最后一个当前点。阵列中的最后一个点是目标定位点;另外两个点是控制点

  • 核心图形具有二次
    曲线to
    元素,只有两点

    立方
    曲线to
    有两个控制点和一个锚定点;二次型只有一个控制点和一个锚定点

    NSBezierPath没有二次
    曲线to
    元素。NSBezierPath中的所有
    曲线都是立方的

  • A
    closepath
    没有点。它返回到最后一次移动到的点

无论哪种方式,对于每个元素,绘制所需的锚定点指示器。例如,您可以在目标点绘制一个蓝色圆圈,而不为
闭合路径
绘制任何内容(因为您在遇到匹配的
移动到
时已经绘制了该圆圈)。对于
curveto
元素,您可能还希望为两个控制点中的每一个绘制指示器。

使用
-BezierPathByFlatingPath

将接收器的副本展平后,计算其长度

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

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


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

感谢您提供有关CGPath和NSBezierPath的详细信息。我已经使用点阵列绘制了一条实体路径。现在我想在这条实线上画一些透明的虚线、圆点或小线。我的目标是创建一条看起来像画笔的实线。我已经看到了CGContextSetBlendingMode()。但这对我不起作用。谢谢。@Omkar:我的答案是你在做什么,而不是简单地画道路。你需要列举路径的元素,并为每个元素画出你想要的虚线、点、小线或其他指示器。我的要求不仅仅是画虚线或点。我希望在实线上绘制透明线或点,绘制透明点的输出应使区域透明(通常在实线(不透明)上绘制透明线会使您获得实线本身,但我希望使区域透明)。我认为这个问题必须用其中一种混合模式来解决,但我不知道混合模式如何处理透明表面。我读过混合模式,但在所有的例子中,他们都考虑了不透明的表面/图像。@Omkar:你可以使用“目标输出混合模式”使曾经的实体透明。