我想从一些二维点检测何时刷。
这些点是连续不断的,它们来自一个传感器在二维空间,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;
    }
}

10-06 06:07