Мур*_*мов -2 math physics arduino accelerometer stm32
我有三个图形:一个立方体、一个八面体、一个十二面体。
每个人物内部都有一个加速度计。
图形的边编号在 1 到 n 之间。
任务:确定立方体、八面体、十二面体的当前边长。
对于立方体,我推导出公式:
边=圆形((Ax*1/988)+(Ay*2/988)+(Az*3/988));
变量“side”将给出区间 -3 和 3 之间的值(不带 0),这意味着立方体的当前边在 1 到 6 之间。
现在我需要对八面体和十二面体执行相同的操作。求助,我该怎么办?我是否需要额外的传感器或加速度计就足够了?
使用这样的公式非常聪明,但它有一些不良特性。首先,当从一侧移动到另一侧时,由于公式的结果,它会移动一些中间值,这些中间值在几何上没有意义。例如,如果您在 -3 边并旋转到 -1 边,则它必然会移动到 -2。其次,它对于噪声加速度计数据可能不稳健,例如位于 -3 和 -1 边之间的矢量,但接近 -1 时可能会给出 -2,而它应该给出 -1。
另一种方法是存储图形的一系列面部法线,然后将加速度计读数与每个法线进行点积。最接近的匹配(点积最高的匹配)是最接近的一侧。
例如:
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;
}
Run Code Online (Sandbox Code Playgroud)
您只需使用每个面体的表面法线即可将其扩展到八面体和十二面体。不需要额外的传感器。