L'utilisation d'une formule comme celle-là est plutôt astucieuse mais elle a des propriétés indésirables. Premièrement, en se déplaçant d'un côté à l'autre, il se déplace à travers certaines valeurs intermédiaires résultant de la formule qui n'ont pas de signification géométrique. Par exemple, si vous êtes sur le côté -3 et que vous tournez sur le côté -1, il faudra nécessairement passer à -2. Deuxièmement, il peut ne pas être robuste aux données accélérométriques bruyantes, par exemple un vecteur qui est à mi-chemin entre les côtés -3 et -1, mais plus proche de -1 peut donner -2, quand il devrait donner -1.
Une approche alternative consiste à stocker un ensemble de normales de faces pour la figure, puis à prendre le produit scalaire de la lecture de l'accéléromètre avec chacune d'elles. La correspondance la plus proche (celle avec le produit scalaire le plus élevé) est le côté le plus proche.
par exemple:
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;
}
Vous pouvez étendre cela pour un octaèdre et dodécaèdre en utilisant simplement les Normales de surface pour chacun. Aucun capteur supplémentaire ne devrait être nécessaire.
Vous avez besoin d'écrire du code. Voilà comment! –
@JarrodRoberson, ici nous n'avons pas besoin d'un code, nous avons besoin d'une formule mathématique –
Ce n'est pas une question sur le sujet. C'est le point que nous ne sommes pas un service de codage. Lisez comment poser une bonne question. Les mathématiques ne sont pas sur le sujet non plus. –