2017-04-25 29 views
-3

我有三个数字:立方体,八面体,十二面体。如何使用加速计确定八面体和十二面体的边?

里面,每个图都有一个加速度计。

数字的两边在1和n之间编号。

任务:确定立方体,八面体,十二面体的当前面。

对于立方体,我衍生下式:

侧= ROUND((AX *988分之1)+(AY *988分之2)+(AZ *988分之3));

变量“侧”将在间隔-3和3得到的值(没有0),这意味着立方体的1和6

现在我需要做的八面体相同的之间的电流侧和十二面体。帮助,我该怎么做?我是否需要额外的传感器或加速度计就够了?

+0

您需要编写一些代码。就是那样! –

+0

@JarrodRoberson,这里我们不需要代码,我们需要一个数学公式 –

+5

这不是一个关于主题的问题。这就是我们不是编码服务的重点。阅读如何提出一个好问题。数学也不在话题上。 –

回答

4

使用这样的公式很聪明,但它有一些不合需要的属性。首先,当从一侧移动到另一侧时,由于几何上无意义的公式,它将移动通过一些中间值。例如,如果你在-3侧并旋转到-1侧,它将必然在-2之间移动。其次,对于有噪声的加速度计数据,它可能不够健壮,例如,在-3和-1边之间的一部分的向量,但是当它应该给-1时,更接近于-1的向量可以给-2。

另一种方法是为图形存储一个面法线阵列,然后将加速度计读数的点乘与它们中的每一个进行比较。最接近的匹配(最高点产品)是最接近的一侧。

e.g:

float cube_sides[6][3] = { 
    {-1, 0, 0}, 
    {0, -1, 0}, 
    {0, 0, -1}, 
    {1, 0, 0}, 
    {0, 1, 0}, 
    {0, 0, 1}, 
}; 

int closest_cube_side(float Ax, float Ay, float Az) 
{ 
    float largest_dot = 0; 
    int closest_side = -1; // will return -1 in case of a zero A vector 
    for(int side = 0; side < 6; side++) 
    { 
     float dot = (cube_sides[side][0] * Ax) + 
      (cube_sides[side][1] * Ay) + 
      (cube_sides[side][2] * Az); 
     if(dot > largest_dot) 
     { 
      largest_dot = dot; 
      closest_side = side; 
     }    
    } 
    return closest_side; 
} 

您只需通过使用每个曲面法线为八面体和十二扩展此。不需要额外的传感器。

+0

嗯刚刚意识到你的答案和我的一样...(我会把你的答案删除,因为你的速度更快),但只需要添加:如果测得的重力距离9.81 [m/s^2]太远,是不是站立不动,也不是自由落体,而是加速,而你应该忽略这样的阅读(假设你在地球表面上做这个) – Spektre

+0

@samgak,谢谢你的回答。我对法线知之甚少,但我会学习。没有什么错误,你写'return closest_side;'在for循环中,它应该在for循环之后:)对于cube而言,它的工作非常出色。十分感谢! –

+0

@Spektre我认为你应该取消删除你的答案,因为它包含不在我的信息。没关系谁更快 – samgak

相关问题