ndg*_*ndg 15 c gesture-recognition
我正在寻找一种简单的,以编程方式检测用户是否绘制了圆形的方法.我在C工作,但很高兴从伪代码工作.一些谷歌搜索带来了许多(希望)过于复杂的方法.
我正在跟踪鼠标坐标作为浮点数,并创建了一个矢量数组来跟踪鼠标随时间的移动.基本上我想要检测何时绘制一个圆,然后忽略与该圆无关的所有运动数据.
我基本了解如何实现这一目标:
使用轮询功能跟踪所有移动.每次轮询该功能时,都会存储当前鼠标位置.在这里,我们遍历历史位置数据并做一个粗略的"对齐位置"来比较两个位置.如果新位置距离旧位置足够近,我们会删除旧位置之前的所有历史数据.
虽然这在理论上有效,但在实践中却是一团糟.有没有人有什么建议?如果建议的方法可以检测它是顺时针还是逆时针绘制的加分点.
基于您的跟踪/轮询功能,它将浮动对推送到堆栈上.这必须在定期的时间间隔内完成.
将步骤2的数量除以2,现在你已经得到了季度.
如果步骤1中的线是垂直的,并且线的第一个点位于顶部:如果第一个四分之一位于中心点的左侧,则逆时针绘制圆.如果第一个四分之一位于中心点右侧,则顺时针绘制圆圈.如果该行的第一个点位于底部,则反向(即ccw => cw和cw => ccw)
如果步骤1中的线是水平的并且列表的第一个点位于左侧:如果第一个四分之一位于中心点之上,则逆时针绘制圆圈.如果第一个季度低于中心点,则顺时针绘制圆圈.如果该行的第一个点在右侧,则反向.
在步骤2和4中,如果时间间隔非常低(快速轮询),则可以通过获取几个索引的平均值来进一步调整此算法.例如:数组中有30对,然后您在0,1和28,29处平均对以获得高点.对所有其他点做同样的事情.
我希望这很容易.
你肯定是在正确的轨道恕我直言.基本上,您需要将每个鼠标点与之前的鼠标点进行比较,并计算它们之间的角度(如第一个点位于原点的单位圆所设想的那样).为此您可以使用以下公式:
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次),则为逆时针圈.:)