cocoa - 使用 NSBezierPath 绘制不同的线宽?

标签 cocoa drawing vector-graphics nsbezierpath pen-tablet

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

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

https://github.com/uliwitness/WideningBezierPathTest

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

enter image description here

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

最佳答案

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

  1. 我使用 bezierPathByFlatteningPath 展平路径。这给了我直线段。
  2. 然后,我计算每条线段起点和终点处的垂直线的起点和终点(这些线的长度与此时线尺寸应有的长度相同)。
  3. 我创建了一条包含平行四边形的贝塞尔曲线路径,该平行四边形由两条垂直线以及连接它们的线组成。这使得每个线段的线宽实现平滑过渡。
  4. 一旦我有了这些线段,我就会绘制路径的结束垂直线,加上每个线段的边(但不是线段之间的垂直线)到一个新的贝塞尔路径中,然后我可以填充该路径来绘制笔画所需的线宽变化。

如果您想将其用于打印或在 HiDPI 下使用,您可能需要修改贝塞尔曲线路径的“平坦度”,但对于 1x 屏幕显示来说,它看起来不错。

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

相关文章:

c++ - 如何通过进程名称检查mac进程是否存在

swift - 如何快速获取磁盘上图像的颜色配置文件数据

macos - 当 NSPopupButton 在 cocoa XCode5 中更改其值时的通知

iphone - 实例级计数器的 NSNumber 是否矫枉过正?

python - OpenCV - 绘制线条或矩形时出错

opencv - 如何确定使用openCV绘制的椭圆的中心坐标?

button - 从自定义按钮启动多边形绘制

WPF 路径与图像 png jpg

ios - iOS 中的 PDF 矢量图像。为什么较小的图像会导致锯齿状边缘?

c++ - 使用点积调整 glRotate