The predicted screen coordinates of the pointer, in pixels.
The predicted value is based on the pointer position reported by the digitizer and the motion of the pointer. This correction can compensate for visual lag due to inherent delays in sensing and processing the pointer location on the digitizer. This is applicable to pointers of type PT_TOUCH. For other pointer types, the predicted value will be the same as the non-predicted value (see ptPixelLocationRaw).
复制代码
如果做一个字迹应用,那天然带触摸的点不能作为最终的字迹的构成,否则会出现毛刺标题。但是根据我的印象,在 Win10 或 Win11 下,字迹预测不是在 WM_Pointer 层做的,也不知道为什么会在这里放如许的字段。印象里面是在 Ink 模块才会做预测
一样平常在触摸框硬件层面会做一次平滑算法,但这只是比较粗略的平滑算法,受限于触摸框的计算芯片的性能,也不会做比较复杂的平滑。在 Windows 10 或 11 的 WISP 模块也会做一次平滑,过滤一些杂点,然后就通过 WM_Pointer 扔给应用
这时间理论上应用收到的点应该就是平滑的了,只不过我错误使用了 ptPixelLocationRaw 字段,此字段是 int 范例的,丢失了精度,导致了写出来的字迹有锯齿
本文是在此基础上进行的优化,编写了一个简单的平滑滤波算法。算法就是当前点的 X 和 Y 分开计算,当前点的 X 取前后各 5 个点的 X 的平均值,然后 Y 也取前后各 5 个点的 Y 的平均值
为了方便我编写这个简单的算法,我从 WM_Pointer 收到的触摸点信息存放到 txt 文件里面,这个文件被我放在 github 上。接下来我的代码将根据这个 output.txt 文件编写算法
算法代码非常简单,代码如下
public static List<double> ApplyMeanFilter(List<double> list, int step)
{
var newList = new List<double>(list.Take(step / 2));
for (int i = step / 2; i < list.Count - step + step / 2; i++)