C 简单的圆形手势检测

C 简单的圆形手势检测,c,gesture-recognition,C,Gesture Recognition,我正在研究一种简单、编程的方法来检测用户是否绘制了圆形。我在C语言中工作,但我很乐意使用伪代码。在谷歌上搜索一下就会发现一些(希望如此)过于复杂的方法 我以浮动的形式跟踪鼠标坐标,并创建了一个向量数组来跟踪鼠标随时间的移动。本质上,我希望检测何时绘制了一个圆,然后显示与该圆无关的所有运动数据 我对如何实现这一目标有一个基本想法: 使用轮询功能跟踪所有移动。每次轮询函数时,都会存储当前鼠标位置。在这里,我们循环浏览历史位置数据,并进行粗略的“位置捕捉”,以比较这两个位置。如果新位置与旧位置的距离足

我正在研究一种简单、编程的方法来检测用户是否绘制了圆形。我在C语言中工作,但我很乐意使用伪代码。在谷歌上搜索一下就会发现一些(希望如此)过于复杂的方法

我以浮动的形式跟踪鼠标坐标,并创建了一个向量数组来跟踪鼠标随时间的移动。本质上,我希望检测何时绘制了一个圆,然后显示与该圆无关的所有运动数据

我对如何实现这一目标有一个基本想法:

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


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

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

  • 对列表中的两个相等项执行基于阈值的搜索。现在堆栈中有两个索引;第一个和第二个条目相等。把这当作一条线。
  • 得到指数的绝对差值。然后除以二,得到这个点的坐标。(线的中心。)
  • 你有两个点:因此你可以通过两点之间的距离除以二得到圆的半径
  • 将步骤2的数量除以2,现在就得到了四分之一

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

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

  • 检查它是否是圆:迭代所有坐标对并计算到中心点的距离。调整从计算距离和到中心点的实际距离的允许距离阈值
  • 在第2步和第4步中,如果时间间隔很低(快速轮询),可以通过取几个索引的平均值来进一步调整该算法。例如:数组中有30对,然后在0、1和28、29处求对的平均值,得到上限点。对所有其他点执行相同的操作


    我希望这足够简单。

    我还没有尝试过,但是读了你的问题后,我想到了这个想法,所以不妨与你分享一下:

    我假设圆必须在合理的时间内绘制,给定鼠标的稳定“采样率”,这将留下一个已知大小的2D向量(点)数组。将它们全部相加,除以2D向量的计数,得到阵列中“中心”点的估计值。然后形成从该中心点到阵列中各点的向量,并进行点积(通过向量长度标准化),确保点积的符号在一系列点上保持相同,这意味着这些点都沿同一方向移动,正号表示逆时针移动,负号表示逆时针移动。如果累计角度超过2π,则绘制圆周运动


    祝你好运。

    你肯定走对了方向。基本上,您需要将每个鼠标点与前一个鼠标点进行比较,并计算它们之间的角度(如在单位圆上所设想的,其中第一个点位于原点)。为此,您可以使用以下公式:

    double angle = atan2(y2 - y1, x2 - x1) * 180 / PI;
    
    if (angle < 0)
        angle += 360;
    
    double angle=atan2(y2-y1,x2-x1)*180/PI;
    如果(角度<0)
    角度+=360;
    
    你最终得到的结果是,对于顺时针运动,角度将以正方向循环,而对于逆时针运动,角度将以负方向循环。您可以通过以下逻辑判断当前角度是否大于或小于前一个角度:

    if (angle2 > 270 && angle1 < 90)
    {
        angle1 += 360
    }
    else if (angle1 > 270 && angle2 < 90)
    {
        angle2 += 360
    }
    
    bool isPositive = (angle2-angle1 > 0);
    
    if(角度2>270和角度1<90)
    {
    角度1+=360
    }
    否则如果(角度1>270和角度2<90)
    {
    角度2+=360
    }
    bool isPositive=(angle2-angle1>0);
    

    如果你得到一定数量的向量,所有的角度都在增加(isPositive是真的,比如说10倍),你可以假设画了一个顺时针的圆;如果趋势为负(isPositive为假10次),则为逆时针循环。:)

    1-选择任意3个点

    2-如果点共线+/-“某些缓冲区”,则它不是圆

    3-使用Wikipedia上描述的方法查找三角形的外接圆,以查找候选圆的中点和半径

    三角形的外心可以通过画任意两个来构造 三条垂直平分线中的一条。对于三个非共线点, 这两条线不能平行,外心就是点 他们穿过的地方。平分线上的任何一点都与直线等距 它平分的两个点,从这一点开始,在 两条平分线与所有三个三角形顶点的距离相等。这个 圆周半径是从它到三个顶点中任意一个顶点的距离

    4-检查到其余点的距离。如果这些点在“候选圆半径”+/-“某些缓冲余量”范围内,则该点为圆

    5-为了确定方向,只需计算t之间的角度