【问题标题】:Detect 360 degrees turn algorithm检测 360 度转弯算法
【发布时间】:2013-09-17 10:17:19
【问题描述】:

我成功地检测到手机绕轴旋转 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;
}

任何帮助将不胜感激。

【问题讨论】:

  • 此代码具有恒定的时间复杂度 (O(1)),因为无论发生什么情况,您都只会遍历 4 个检查点,所以除非您进行了一些分析告诉您这是一个瓶颈,否则我认为收益优化这一点可以忽略不计。
  • 感谢您的回复。我正在寻找任何新的建议,而不是优化我的算法,因为我知道它不是应该的。
  • 如果它工作正常,但您不想优化,您想要什么? “建议”范围很广,很可能会被关闭。
  • 问题说它在全 360 度转弯时还没有效果。不过,期望是为什么你不能把更小的转弯加起来?

标签: java android algorithm rotation accelerometer


【解决方案1】:

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

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

永远不会触发。

虽然这很容易修复,但如果您获得的唯一传感器输入是 roll,则固定检查点方法总是会出现问题。可视化它的最佳方式是,您的检查点是圆圈上的小红点,手机的旋转对应于在圆圈边缘爬行的蚂蚁。假设当蚂蚁经过一个点时,它变成绿色,这表示检查点设置为true。如果蚂蚁从AB 两个检查点之间开始,它可以通过爬过B,一直绕到A,然后转身再次向另一个方向前进,从而“愚弄”它们。所有的检查点都将是绿色的,但蚂蚁不会完成一个完整的循环。

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

以下是新规则:

  • 每个点都以unvisited(红点)开头。
  • 如果蚂蚁顺时针方向通过检查点,则将其状态设置为clockwise(从该点顺时针指向的绿色小箭头)
  • 如果蚂蚁以逆时针方向通过检查点,则将其状态设置为anticlockwise(从该点逆时针方向指向的绿色小箭头)
  • 如果所有检查点都为clockwise 或全部为anticlockwise,则表示完成转弯。

这可以通过三个检查点来实现,只要第一个检查点位于蚂蚁的初始位置下方,就可以将其放置在圆圈上的任何位置。我推荐{initial, inital + 120, initial + 240},但为了对称。

(蚂蚁思想实验与两个检查点一起工作,但是当您有两个检查点时,问题是它们之间有一对带有非唯一检查点的区域,这会混淆对蚂蚁实际检查点的检测当蚂蚁从一个区域到另一个区域时通过)

【讨论】:

  • 你能帮我解决这个question吗?
猜你喜欢
  • 2016-06-06
  • 2014-09-10
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多