绘制折线中的扭结检测

时间:2010-04-27 20:43:52

标签: mouse trace curve-fitting

用户可以使用非常简单的工具在我的应用程序中绘制草图(在按住LMB的同时移动鼠标)。这会产生一系列mousemove事件,并在每个事件中记录光标位置。得到的折线曲线趋于相当密集,记录点几乎每隔一个像素。我想平滑这个像素化的折线,但我不想平滑预期的扭结。那么我如何找出扭结的位置呢?

图像显示了记录的轨迹(红色像素)和人们理解的“暗示”形状。人们倾向于在角落附近减速,所以这里的噪音通常比直线上的噪音更多。

Polyline tracker http://www.freeimagehosting.net/uploads/c83c6b462a.png

4 个答案:

答案 0 :(得分:1)

您是否考虑过查看数据的时间,而不是尝试从结果数据中执行此操作?如果鼠标停止或显着减慢,则使用自上次“扭结”(鼠标最后一次减速)以来确定行进方向的趋势。如果用户朝新的方向走,你称之为扭结,否则,你忽略当前的减速趋势并开始等待下一个趋势。

答案 1 :(得分:1)

嗯,一种方法是使用真正的曲线拟合算法。生成贝塞尔曲线(使用精确的端点,使用Catmull-Rom或类似的东西),然后优化&递归细分(使用距实际线点的距离作为成本度量)。但是,对于您的用例来说,这可能太复杂了。

答案 2 :(得分:1)

您所描述的内容可能与手势识别技术有关,因此您可以在其上搜索想法。

显而易见的方法是应用曲线拟合,但这样可以平滑所有有趣的细节和扭结。建议的另一种方法是查看速度和加速度,但这可能会变得毛茸茸(方向变化可能非常快或非常缓慢且有意识)

一种相当基本但有效的方法是将样本直接简化为折线。

例如,通过样品(例如)从样品1到样品4,检查所有4个样品是否在1和1之间的直线的合理误差范围内。 4.如果是,则将其延伸到点1..5并重复直到从起点到终点的直线不再提供由这些样本定义的曲线的合理近似值。创建直到上一个采样点的线段,并开始累积新的线段。

当样本彼此距离太近时,您必须小心阈值,因此在对距离彼此不到4-5像素的样本时,您可能需要调整灵敏度。

这将为您提供一组相当准确地遵循原始路径的直线。

如果您需要额外的平滑处理,或者想要创建可缩放的矢量图形,则可以从折线进行曲线拟合。首先,识别扭结(折线中一条线与下一条线之间的角度是尖锐的位置 - 例如,任何超过140度的角度都被视为平滑曲线,任何小于此值的东西都被视为扭结)并在这些不连续处打破折线。然后曲线拟合原始手势的每个子部分以使它们平滑。这将具有平滑光滑的东西和锐化扭结的效果。 (您可以更进一步,插入小的光滑角落圆角而不是这些尖锐的关节,以减少连接的锐度)

蛮力,但它可能只是实现你想要的。

答案 3 :(得分:0)

记录绘制像素的顺序。然后,计算“近”但不“近”的像素之间的斜率。我猜测像素(i)和像素(i + 7)之间的斜率图可能会在曲线中的扭结处显示出容易识别的“跳跃”。