我想从一些二维点检测何时刷。
这些点是连续不断的,它们来自一个传感器在二维空间,x和y。
这有什么算法吗?
我试过这样的东西
float totalDistance = 0f;
float totalTime = 0f;
for (int i = points.size - 1; i > 0; i--) {
SwipePoint point1 = points.get(i); // last point added
SwipePoint point2 = points.get(i - 1); // second last point
totalDistance += point1.distance(point2);
if (totalDistance > MIN_SWIPE_DISTANCE
&& totalTime > MIN_SWIPE_TIME) {
// we have a swipe
listener.onSwipe(SwipeType.DOWM, 1f);
points.clear();
return;
}
}
在这里我检查线条的长度是否大于一个常数,并且时间相同,但是没有显示任何东西。
这有什么算法吗?
谢谢。
最佳答案
您的算法似乎无法识别刷卡,其中一个问题是:
totalDistance += point1.distance(point2);
它计算的是手指移动的总长度,即使手指在任何轨迹上移动足够长的时间,也会触发“刷卡”。
你应该做的是记录第一个点的x和y坐标,当你遇到一个离起点足够远的点时,你可以触发一次刷卡。
算法中的第二个问题是,您应该检查刷卡时间是否小于最大刷卡时间。而且,您的代码中似乎没有更新totaltime。
代码应如下所示(仅检查垂直滑动):
SwipePoint startPoint = points.get(points.size - 1);
for (int i = points.size - 2; i > 0; i--) {
SwipePoint point = points.get(i); // last point added
int yDiff = Math.abs(startPoint.getY() - point.getY());
long totalTime = startPoint.getTime() - point.getTime();
if yDiff > MIN_SWIPE_DISTANCE
&& totalTime < MIN_SWIPE_TIME) {
// we have a swipe
listener.onSwipe(SwipeType.DOWM, 1f);
points.clear();
return;
}
}