想改善这个问题吗?更新问题,使其仅关注editing this post一个问题。
去年关闭。
Improve this question
我正在使用Qt-5.8 / PyQt5开发用于Apple Pencil的绘图应用程序,并试图使铅笔笔触与我看到的其他一些应用程序(即Notability和PDF Expert)一样平滑。我修补了Qt-5.8,以提供对Apple提供的浮点合并和预测的UITouch数据的快速访问,我的应用程序代码快速且响应迅速,但是这些行仍然很不稳定(请参见屏幕截图):
知名度和PDF Expert都产生了在不同水平的动物区维持其清晰度的线条,这向我表明它们可能是矢量化的。
有人对我的画光滑有建议吗?我已经以视网膜分辨率绘画,并使用相同的250Hz Apple Pencil数据。是否有一种数学技术可以平滑一系列点,或其他一些技巧?
最佳答案
注意,应用程序倾向于实际将图形存储和绘制为矢量,这就是为什么它们很平滑的原因。与光栅绘画相比,它还具有一些很酷的功能,例如能够选择和移动文本,更改其颜色和样式,并且还非常有效地进行存储,并且可以放大或缩小而不会降低分辨率。
在某些应用程序中,甚至需要两步过程,在绘制特定字形时会进行初始平滑,而在提起笔并将字形视为完成后会发生另一遍。
另一方面,您的代码看起来非常栅格化。有多种方法可以简化输入点,从非常简单到难以置信的复杂。
在您的情况下,您可以尝试的操作非常简单,并且可以针对您所针对的使用情况很好地工作。
您需要在笔移动时继续处理每个笔划/字形,而不是将每个中间位置添加到笔划控制点,而只需添加偏离当前角度/方向且超过某个阈值的点。从概念上讲,它很像Ramer–Douglas–Peucker algorithm,但是您不将其应用于预先存在的数据点,而是在创建这些点时将其应用,这对于用户体验而言更加有效且更好。
当您将笔放在屏幕上时,将创建第一个数据点。然后开始移动笔。现在,您有了第二个点,因此可以添加它,还可以计算两个点形成的线的角度或笔的行进方向。然后,当您进一步移动笔时,您将得到一个第三点,您将其与第二点进行检查,并且如果角度差不超过阈值,则添加您修改的第三点以将第二点有效地延伸到该位置消除冗余点。因此,您最终只能创建具有足够偏差的点,以形成直线的粗略形状,而跳过所有细微的小差异,这些细微差异会造成抖动的线条。
这只是第一步,这将使您获得简化但多面的线条。如果直接绘制它,它将看起来不像是平滑曲线,而是像一系列线段。第二步是点插值,可能是常规的旧cubic interpolation就可以了。然后,通过在每组3个点之间进行插值来获得每个实际位置,并在每个画笔间距阈值处绘制画笔笔触。插入位置时,还可以在定义当前绘制线段的两个点之间插入笔刷压力,必须将其与每个曲线定义点一起存储。压力插值本身可以像线性一样简单。
关于ios - 用Apple Pencil平滑绘图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42889699/