我有三个数字:立方体,八面体,十二面体。
在里面,每个人物都有一个加速计。
数字的两边编号在1和n之间。
任务:确定立方体的当前边,八面体,十二面体。
对于立方体,我推导出公式:
side = round((Ax * 1/988)+(Ay * 2/988)+(Az * 3/988));
变量“side”将给出间隔-3和3中的值(不带0),这意味着立方体的当前边在1到6之间。
现在我需要为八面体和十二面体做同样的事情。帮忙,我该怎么做?我需要额外的传感器或加速度计吗?
答案 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;
}
只需使用每个的曲面法线,就可以将其扩展为八面体和十二面体。不需要额外的传感器。