2017-04-25 27 views
-3

我有三個數字:立方體,八面體,十二面體。如何使用加速計確定八面體和十二面體的邊?

裏面,每個圖都有一個加速度計。

數字的兩邊在1和n之間編號。

任務:確定立方體,八面體,十二面體的當前面。

對於立方體,我衍生下式:

側= ROUND((AX *988分之1)+(AY *988分之2)+(AZ *988分之3));

變量「側」將在間隔-3和3得到的值(沒有0),這意味着立方體的1和6

現在我需要做的八面體相同的之間的電流側和十二面體。幫助,我該怎麼做?我是否需要額外的傳感器或加速度計就夠了?

+0

您需要編寫一些代碼。就是那樣! –

+0

@JarrodRoberson,這裏我們不需要代碼,我們需要一個數學公式 –

+5

這不是一個關於主題的問題。這就是我們不是編碼服務的重點。閱讀如何提出一個好問題。數學也不在話題上。 –

回答

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; 
} 

您只需通過使用每個曲面法線爲八面體和十二擴展此。不需要額外的傳感器。

+0

嗯剛剛意識到你的答案和我的一樣...(我會把你的答案刪除,因爲你的速度更快),但只需要添加:如果測得的重力距離9.81 [m/s^2]太遠,是不是站立不動,也不是自由落體,而是加速,而你應該忽略這樣的閱讀(假設你在地球表面上做這個) – Spektre

+0

@samgak,謝謝你的回答。我對法線知之甚少,但我會學習。沒有什麼錯誤,你寫'return closest_side;'在for循環中,它應該在for循環之後:)對於cube而言,它的工作非常出色。十分感謝! –

+0

@Spektre我認爲你應該取消刪除你的答案,因爲它包含不在我的信息。沒關係誰更快 – samgak

相關問題