使用這樣的公式很聰明,但它有一些不合需要的屬性。首先,當從一側移動到另一側時,由於幾何上無意義的公式,它將移動通過一些中間值。例如,如果你在-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;
}
您只需通過使用每個曲面法線爲八面體和十二擴展此。不需要額外的傳感器。
您需要編寫一些代碼。就是那樣! –
@JarrodRoberson,這裏我們不需要代碼,我們需要一個數學公式 –
這不是一個關於主題的問題。這就是我們不是編碼服務的重點。閱讀如何提出一個好問題。數學也不在話題上。 –