C 简单的圆形手势检测
我正在研究一种简单、编程的方法来检测用户是否绘制了圆形。我在C语言中工作,但我很乐意使用伪代码。在谷歌上搜索一下就会发现一些(希望如此)过于复杂的方法 我以浮动的形式跟踪鼠标坐标,并创建了一个向量数组来跟踪鼠标随时间的移动。本质上,我希望检测何时绘制了一个圆,然后显示与该圆无关的所有运动数据 我对如何实现这一目标有一个基本想法: 使用轮询功能跟踪所有移动。每次轮询函数时,都会存储当前鼠标位置。在这里,我们循环浏览历史位置数据,并进行粗略的“位置捕捉”,以比较这两个位置。如果新位置与旧位置的距离足够近,我们将删除旧位置之前的所有历史数据C 简单的圆形手势检测,c,gesture-recognition,C,Gesture Recognition,我正在研究一种简单、编程的方法来检测用户是否绘制了圆形。我在C语言中工作,但我很乐意使用伪代码。在谷歌上搜索一下就会发现一些(希望如此)过于复杂的方法 我以浮动的形式跟踪鼠标坐标,并创建了一个向量数组来跟踪鼠标随时间的移动。本质上,我希望检测何时绘制了一个圆,然后显示与该圆无关的所有运动数据 我对如何实现这一目标有一个基本想法: 使用轮询功能跟踪所有移动。每次轮询函数时,都会存储当前鼠标位置。在这里,我们循环浏览历史位置数据,并进行粗略的“位置捕捉”,以比较这两个位置。如果新位置与旧位置的距离足
虽然这在理论上是可行的,但在实践中却是一团糟。有人有什么建议吗?如果所建议的方法可以检测它是顺时针还是逆时针绘制,则会获得额外的分数。基于跟踪/轮询功能,该功能将浮点对推送到堆栈上。这必须在定期定时间隔内完成
我希望这足够简单。我还没有尝试过,但是读了你的问题后,我想到了这个想法,所以不妨与你分享一下: 我假设圆必须在合理的时间内绘制,给定鼠标的稳定“采样率”,这将留下一个已知大小的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之间的角度