使用NSBezierPath绘制不同的线宽?

时间:2014-03-08 14:09:09

标签: cocoa drawing vector-graphics nsbezierpath pen-tablet

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

所以我试图通过计算曲线末端的垂直线并将它们连接到相同的曲线来生成Bezier路径,该路径是我的线的轮廓。它几乎可以在我的小测试项目中用于单曲线段:

https://github.com/uliwitness/WideningBezierPathTest

但是这有一个很大的问题:线条中间只有2个像素(它应该从32到8)。有谁知道我如何调整控制点,使弯曲部分线的两条边距离大致相同?

enter image description here

有人有想法吗?建议?有用的文章?

1 个答案:

答案 0 :(得分:2)

感谢其他人的建议,我已经设法将一些有用的东西拼凑起来。我已经将更改提交到存储库,但是如果要查看旧代码,可以返回一些修订版。这就是我现在所做的:

  1. 我使用bezierPathByFlatteningPath展平路径。这给了我直线段。
  2. 然后,我计算每个线段开始和结束处的垂直线的起点和终点(这些线与线点大小一样长。)
  3. 我创建了一个贝塞尔曲线路径,其中包含一条平行四边形,由两条垂直线和连接它们的线组成。这样可以为每个线段提供线宽的平滑过渡。
  4. 一旦我有了段,我绘制路径的结束垂直线,加上每个段的边(但不是段之间的垂直线)到一个新的贝塞尔曲线路径,然后我可以填充以绘制冲程所需的线宽变化。
  5. 如果您想使用它进行打印或在HiDPI下使用,您可能不得不使用bezier路径的“平坦度”,但对于1x屏幕显示它看起来很好。