我成功地检测到围绕轴的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;
}
任何帮助都会非常感激。
答案 0 :(得分:0)
好吧,您的代码只检测因roll
增加而产生的转弯。在另一个方向,即由roll
下降产生的转弯,
if (checkpointsR[i - 1] == true)
{
checkpointsR[i] = true;
}
永远不会触发。
虽然这很容易解决,但如果您获得的唯一传感器输入是roll
,那么固定检查点总是会出现问题。可视化它的最佳方式是您的检查点是圆上的小红点,并且手机的旋转对应于围绕圆的边缘爬行的蚂蚁。假设当蚂蚁经过一个点时,它变为绿色,这表示检查点被设置为true
。如果蚂蚁在两个检查点A
和B
之间开始,它可以通过B
爬行来“欺骗”它们,一直到A
,然后转身再走另一条路。所有的检查站都是绿色的,但蚂蚁不会完整一圈。
解决此问题的方法是更改两件事:首先,为检查点提供三种状态:unvisited
,clockwise
和anticlockwise
。其次,在检查点上启动蚂蚁。
以下是新规则:
unvisited
(红点)开头。 clockwise
(从该点顺时针指向的绿色小箭头)anticlockwise
(从该点指向逆时针方向的绿色小箭头)clockwise
或全部anticlockwise
,则转弯已完成。这可以通过三个检查点来实现,只要第一个位于蚂蚁的初始位置,就可以放在圆圈上的任何位置。为了对称起见,我建议使用{initial, inital + 120, initial + 240}
。
(蚂蚁思想实验与两个检查点一起工作,但是当你有两个检查点时,问题是有一对区域之间有一个非唯一的检查点,这会混淆检测到哪个检查点实际上是蚂蚁当蚂蚁从一个区域到另一个区域时,它会通过