用Apple Pencil平滑绘图

时间:2017-03-19 17:25:32

标签: ios qt uikit

我正在使用Qt-5.8 / PyQt5开发Apple Pencil的绘图应用程序,并且我试图让铅笔笔触像我看到的其他一些应用程序一样流畅,即Notability和PDF Expert。我修补了Qt-5.8,以便快速访问Apple提供的浮点合并和预测的UITouch数据,我的应用程序代码快速响应,但线条仍然紧张(见截图):

My Current Code enter image description here

Notability和PDF Expert都会生成在不同级别的zoon中保持清晰度的线条,这表明它们可以被矢量化。

有人建议平滑我的画吗?我已经在视网膜分辨率下绘画并使用相同的250Hz Apple Pencil数据。是否有一种数学技术可以平滑一系列点,或者其他一些技巧?

2 个答案:

答案 0 :(得分:3)

注意拍摄应用程序往往会将图形存储和绘制为矢量,这就是它们流畅的原因。它还具有几个很酷的功能,例如能够选择和移动文本,改变其颜色和样式,它也非常有效的存储,并且可以放大或缩小而不会损失分辨率,与光栅绘画相比。

在某些应用程序中,甚至还有两个步骤,在绘制特定字形时会发生初始平滑,而在提起笔并且字形被视为已完成后会发生另一个传递。

另一方面,您的代码看起来非常光栅。有许多方法可以简化输入点,从非常简单到非常复杂。

在你的情况下你可以尝试的是相当简单的,并且应该适用于你的目标用途。

您需要在笔移动时继续处理每个笔划/字形,而不是将每个中间位置添加到笔划控制点,您只需添加偏离当前角度/方向超过特定阈值的点。它在概念上与Ramer–Douglas–Peucker algorithm非常相似,但您不会将其应用于预先存在的数据点,而是在创建点时使用它,这对于用户体验更有效,更好。

将笔放在屏幕上时,会创建第一个数据点。然后你开始移动笔。你现在有第二个点,所以你添加它,但也计算两个点形成的线的角度,或笔的方向。然后,当你进一步移动笔时,你有第三个点,你检查第二个点,如果角度差不高于阈值,而是添加你修改的第三个点,以有效地将第二个点扩展到那个位置消除冗余点。因此,您最终只能创建具有足够偏差的点以形成线条的粗糙形状,并跳过所有创建您的紧张线条的微小差异。

这只是第一步,这将为您留下简化但刻面的线条。如果直接绘制它,它看起来不像一条平滑的曲线,而是像一系列线段。第二步是点插值,可能常规的旧cubic interpolation会很好。然后通过在每组3个点之间插值来获得每个实际位置,并在每个画笔间距阈值处绘制画笔笔划。插值位置时,还可以在定义当前绘制的线段的两个点之间插入刷子压力,您必须将其与每个曲线定义点一起存储。压力插值本身可以像线性一样简单。

答案 1 :(得分:1)

在对输入实施平滑/优化过滤器之前,请确保您正在调用适当的API以获取可用的最佳数据。

如果您从touch.location(in: view)请求数据,则样本将离散化(四舍五入到像素网格)。

如果您从touch.preciseLocation(in: view)请求数据,则样本将不会四舍五入。它们将包括像素之间的小数间距,这对于手头的任务至关重要。

touch.location(in: view) touch.preciseLocation(in: view)