java - 检测 360 度转弯算法

标签 java android algorithm rotation accelerometer

我成功地检测到手机绕轴旋转 0-360 度(滚动),但现在我很难设计一种有效的算法来检测一整圈。我的工作但我认为不是我想要的优雅和有效的算法是:

private boolean detectRoll;
private boolean[] checkpointsR = new boolean[4];
private boolean fullRollTurn;

public void detectingRoll() {
    setDetectRoll(true);
    checkpointsR[0] = true;
    for (int i = 1; i < 4; i++) {
        if (roll > 90 * i && roll < 90 * (i + 1)
            && checkpointsR[i - 1] == true) {
            checkpointsR[i] = true;
        }
    }

    if (areAllTrue(checkpointsR) && roll > 0 && roll < 45) {
        fullRollTurn = true;
        // reset rollCheckpoints
        for (int i = 1; i < 4; i++) {
            checkpointsR[i] = false;
        }
    }
}

public static boolean areAllTrue(boolean[] array) {
    for (boolean b : array)
        if (!b)
            return false;
    return true;
}

public void setDetectRoll(boolean detectRoll) {
    this.detectRoll = detectRoll;
}

非常感谢任何帮助。

最佳答案

好吧,您的代码只检测由增加roll 引起的转弯。在另一个方向,即 roll 下降导致的转弯,

    if (checkpointsR[i - 1] == true) 
    {
        checkpointsR[i] = true; 
    }

永远不会触发。

虽然这很容易修复,但如果您获得的唯一传感器输入是 roll,则固定检查点的方法总是会出现问题。最好的形象化方式是你的检查点是一个圆圈上的小红点,手机的旋转对应于一只 Ant 在圆圈的边缘爬行。假设当 Ant 经过一个点时,它变成绿色,这表示检查点被设置为 true。如果 Ant 在两个检查点 AB 之间开始,它可以通过爬过 B 来“愚弄”它们,一直到 A,然后掉头又朝另一条路走。所有检查点都是绿色的,但 Ant 不会完成一个完整的圆圈。

解决这个问题的方法是改变两件事:首先,给检查点三种状态:unvisitedclockwiseanticlockwise。其次,在检查点之上启动 Ant

这是新规则:

  • 每个点都以unvisited(红点)开始。
  • 如果 Ant 按顺时针方向通过检查点,则将其状态设置为clockwise(一个从该点开始顺时针指向的绿色小箭头)
  • 如果 Ant 逆时针方向通过检查点,将其状态设置为anticlockwise(一个绿色小箭头从该点指向逆时针方向)
  • 如果所有的检查点都是顺时针或者都是逆时针,那么一个回合就完成了。

这可以通过三个检查点来实现,只要第一个检查点在 Ant 的初始位置下方,就可以将其放置在圆圈上的任何位置。为了对称起见,我建议使用 {initial, inital + 120, initial + 240}

( Ant 思想实验使用两个检查点,但是当你有两个检查点时,问题是它们之间有一对具有非唯一检查点的区域,这混淆了 Ant 实际检测哪个检查点当 Ant 从一个区域移动到另一个区域时通过)

关于java - 检测 360 度转弯算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18847164/

相关文章:

algorithm - 更快的算法

algorithm - 具有大量操作的自组织数字序列 - 最佳数据结构

Java - 无需图形的准确字体高度

android - 扩展一个类到 DownloadManager

Android intent-filter pathPattern 数字匹配

Android ScrollView scrollTo() 方法不适用于 TextView?

iphone - 检查 NSMutableArray 是否包含来自另一个数组的值

Java8 Lambda 和异常

Java:一种将 Mime(内容)类型与 CommonsMultipartFile 的文件扩展名相匹配的方法

java - 扫描仪system.in,不读取第1、3、5等输入