c - 简单的圆形手势检测

标签 c gesture-recognition

我正在寻找一种简单的程序化方法来检测用户是否绘制了圆形。我在 C 中工作,但很高兴使用伪代码工作。一些谷歌搜索带来了一些(希望如此)过于复杂的方法。

我正在跟踪鼠标坐标作为 float ,并创建了一个 vector 数组来跟踪鼠标随时间的移动。本质上,我希望检测何时绘制了一个圆圈,然后忽略与该圆圈无关的所有运动数据。

我对如何实现这一点有一个基本的想法:

使用轮询功能跟踪所有移动。每次轮询函数时,都会存储当前鼠标位置。在这里,我们循环浏览历史位置数据并粗略地“定位”以比较两个位置。如果新位置与旧位置的距离足够近,我们将删除旧位置之前的所有历史数据。

虽然这在理论上可行,但在实践中却一团糟。有没有人有什么建议?如果建议的方法可以检测它是顺时针还是逆时针绘制,则加分。

最佳答案

基于您的跟踪/轮询功能,它将浮点对推送到堆栈上。这必须在固定的时间间隔内完成。

  1. 对列表中的两个相等条目进行基于阈值的搜索。现在你的堆栈中有两个索引;第一个和第二个相等的条目。将其视为一条线。
  2. 获取指数的绝对差值。然后除以二,得到这个点的坐标。 (线的中心。)
  3. 你有两个点:因此你可以得到圆的半径,方法是将两点之间的距离除以二。
  4. 将第 2 步的数字除以 2,现在您得到了四分之一。

    如果第 1 步的线是垂直的并且线的第一个点在顶部:如果第一个四分之一在中心点的左侧,则圆是逆时针绘制的。如果第一四分之一在中心点的右侧,则圆是顺时针绘制的。如果线的第一个点在底部,则反转(即 ccw => cw 和 cw => ccw)

    如果第 1 步的线是水平的并且列表的第一个点在左边:如果第一个四分之一在中心点上方,则圆是逆时针绘制的。如果第一四分之一低于中心点,则圆是顺时针绘制的。如果线的第一个点在右边,则反转。

  5. 检查它是否是一个圆:遍历所有坐标对并计算到圆心的距离。调整计算距离的允许距离阈值和到中心点的实际距离。

在第 2 步和第 4 步中,如果时间间隔非常短(快速轮询),您可以通过取几个索引的平均值来进一步调整此算法。例如:数组中有 30 对,然后将 0、1 和 28、29 处的对取平均以获得上点。对所有其他点执行相同的操作。

我希望这足够简单。

关于c - 简单的圆形手势检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2393553/

相关文章:

ios - 对话框打开时如何识别模态对话框外的点击手势

html - 使用鼠标在 HTML5 Canvas 上绘图

c - 如何在我的程序中获取 _GLOBAL_OFFSET_TABLE_ 地址?

c - 在 xtaskcreate 中设置完美的 usStackDepth 重要吗?

c - 当我在代码中没有看到错误时,我无法将示例数据加载到文件中

iphone - 我需要释放手势识别器吗?

c - scanf() 将换行符留在缓冲区中

c - 如何在C中获取数组参数的实际大小?

android - 在android中将手势转换为文本的API或方法

ios - 在 UIScrollView 中嵌入 UICollectionView 几乎完美