如何使用加速度计确定八面体和十二面体的边?

时间:2017-04-25 06:59:41

标签: math arduino accelerometer physics stm32

我有三个数字:立方体,八面体,十二面体。

在里面,每个人物都有一个加速计。

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

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

对于立方体,我推导出公式:

  

side = round((Ax * 1/988)+(Ay * 2/988)+(Az * 3/988));

变量“side”将给出间隔-3和3中的值(不带0),这意味着立方体的当前边在1到6之间。

现在我需要为八面体和十二面体做同样的事情。帮忙,我该怎么做?我需要额外的传感器或加速度计吗?

1 个答案:

答案 0 :(得分: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;
}

只需使用每个的曲面法线,就可以将其扩展为八面体和十二面体。不需要额外的传感器。