简单的圆形手势检测

ndg*_*ndg 15 c gesture-recognition

我正在寻找一种简单的,以编程方式检测用户是否绘制了圆形的方法.我在C工作,但很高兴从伪代码工作.一些谷歌搜索带来了许多(希望)过于复杂的方法.

我正在跟踪鼠标坐标作为浮点数,并创建了一个矢量数组来跟踪鼠标随时间的移动.基本上我想要检测何时绘制一个圆,然后忽略与该圆无关的所有运动数据.

我基本了解如何实现这一目标:

使用轮询功能跟踪所有移动.每次轮询该功能时,都会存储当前鼠标位置.在这里,我们遍历历史位置数据并做一个粗略的"对齐位置"来比较两个位置.如果新位置距离旧位置足够近,我们会删除旧位置之前的所有历史数据.

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

Pin*_*juh 6

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

  1. 对列表中的两个相等条目执行基于阈值的搜索.现在你的堆栈中有两个索引; 第一个和第二个相等的条目.将此视为一条线.
  2. 获得指数的绝对差异.然后除以2得到这个点的坐标.(线的中心.)
  3. 你有两点:因此你可以得到圆的半径,通过得到两点之间的距离除以2.
  4. 将步骤2的数量除以2,现在你已经得到了季度.

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

    如果步骤1中的线是水平的并且列表的第一个点位于左侧:如果第一个四分之一位于中心点之上,则逆时针绘制圆圈.如果第一个季度低于中心点,则顺时针绘制圆圈.如果该行的第一个点在右侧,则反向.

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

在步骤2和4中,如果时间间隔非常低(快速轮询),则可以通过获取几个索引的平均值来进一步调整此算法.例如:数组中有30对,然后您在0,1和28,29处平均对以获得高点.对所有其他点做同样的事情.

我希望这很容易.


Mik*_*ike 5

你肯定是在正确的轨道恕我直言.基本上,您需要将每个鼠标点与之前的鼠标点进行比较,并计算它们之间的角度(如第一个点位于原点的单位圆所设想的那样).为此您可以使用以下公式:

double angle = atan2(y2 - y1, x2 - x1) * 180 / PI;

if (angle < 0)
    angle += 360;
Run Code Online (Sandbox Code Playgroud)

你最终得到的是,对于顺时针运动,角度将以正方向循环,而对于逆时针运动,角度将以负方向循环.您可以使用以下逻辑确定当前角度是大于还是小于前一个角度:

if (angle2 > 270 && angle1 < 90)
{
    angle1 += 360
}
else if (angle1 > 270 && angle2 < 90)
{
    angle2 += 360
}

bool isPositive = (angle2-angle1 > 0);
Run Code Online (Sandbox Code Playgroud)

如果你得到一定数量的向量,所有向量的角度都在增加(isPositive为真,比方说,10次),你可以假设正在绘制顺时针圆; 如果趋势为负(isPositive为假10次),则为逆时针圈.:)