代码之家  ›  专栏  ›  技术社区  ›  uliwitness

使用NSBezierPath绘制不同的线宽?

  •  6
  • uliwitness  · 技术社区  · 11 年前

    我想创建一个矢量对象,它可以用手写板绘制,并将显示来自笔的压力信息(通过适当增加/减少线宽)。现在我知道如何从NSEvent中获取压力信息,但当然,NSBezierPath不支持不同的线宽。

    所以我试图通过计算曲线末端的垂直线并将它们与同一条曲线连接起来,来生成一条Bezier路径,这就是我的线的轮廓。它几乎适用于我的小测试项目中的单个曲线段:

    https://github.com/uliwitness/WideningBezierPathTest

    但这有一个大问题:直线在中间变薄到只有2个像素(应该只从32到8)。有人知道我如何调整控制点,使曲线部分的两条线的边缘大致保持相同的距离吗?

    enter image description here

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

    1 回复  |  直到 11 年前
        1
  •  2
  •   uliwitness    11 年前

    由于其他人的建议,我设法拼凑出了一些行之有效的东西。我已将更改提交到存储库,但如果您想查看旧代码,可以返回一些修订。我现在做的是:

    1. 我使用bezierPathByFlatteningPath展平路径。这给了我直线段。
    2. 然后,我计算每个线段的起点和终点处的垂直线的起点和端点(这些线的长度与该点处的线大小相同)。
    3. 我创建了一个包含平行四边形的bezier路径,该平行四边形由两条垂直线加上连接它们的线组成。这为每个线段提供了线宽的平滑过渡。
    4. 一旦我有了线段,我就绘制路径的结束垂直线,再加上每个线段的边(但不是线段之间的垂直线)到一个新的bezier路径中,然后我可以填充该路径以绘制具有所需线宽变化的笔划。

    如果您想将其用于打印或在HiDPI下使用,您可能需要处理bezier路径的“平坦度”,但对于1x屏幕显示,它看起来很好。