我想创建一个可以用数位板绘制的矢量对象,并将遵循来自笔的压力信息(通过适本地增加/减少线宽)。现在,我知道如何从NSEvent中获取压力信息,但是当然,NSBezierPath不支持变化的线宽。

因此,我试图通过计算曲线两端的垂直线并将它们与同一条曲线连接起来,以生成一条Bezier路径作为我的线的轮廓。它几乎可以在我的小测试项目中针对单个曲线段工作:

https://github.com/uliwitness/WideningBezierPathTest

但这有一个大问题:该线在中间变细到几乎只有2个像素(应该只从32变到8)。有谁知道我将如何调整控制点,以使弯曲部分中的线的两个边缘之间的距离大致相同?

有人有主意吗?有什么建议吗?有用的文章?

最佳答案

多亏其他人的建议,我才设法将一些有用的东西拼凑在一起。我已将更改提交到存储库,但是如果您想查看旧代码,可以回溯一些修订。这是我现在要做的:

  • 我使用bezierPathByFlatteningPath展平了路径。这给了我直线段。
  • 然后,我在每个线段的起点和终点计算垂直线的起点和终点(这些线的长度与此处的线长一样长)。
  • 我创建了一个bezier路径,其中包含一个平行四边形,该平行四边形由两条垂直线以及连接它们的线组成。这样可以使每个段的线宽平滑过渡。
  • 有了线段后,我将绘制路径的末端垂直线以及每个线段的边(而不是线段之间的垂直线)绘制到新的贝塞尔曲线路径中,然后我可以对其进行填充以绘制具有所需笔触的笔划线宽变化。

  • 如果要将其用于打印或在HiDPI下使用,则可能不得不考虑贝塞尔曲线路径的“平坦度”,但是对于1倍屏幕显示来说,它看起来不错。

    关于cocoa - 使用NSBezierPath绘制变化的线宽?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22270360/

    10-13 04:03