2017-06-12 87 views
5

假設一個人使用這個指南針,並從90度開始,他們開始順時針或逆時針旋轉。保持完成360度旋轉的最佳方法是什麼?假設它們將從頭到尾只是順時針旋轉或僅逆時針旋轉。指南針 - 完整的360度旋轉的軌跡數

我不斷想出解決方案,如果開始的軸承是例如90度,我會在傳感器數據發生變化時繼續檢查下一個軸承,並且如果它始終沿着一個方向移動,我知道它們正在旋轉。如果他們繼續朝這個方向旋轉並將其恢復到90度,那麼這就是一次旋轉。我的方式似乎非常複雜,效率低下,我很難找到更好的方法。

在這種情況下,我會期待多個完整的旋轉。

我很感激任何幫助。謝謝!

我找到了this相關答案,我正在爲此編寫一個代碼示例。如果有人已經做了類似的事情,請發佈!

@Override 
public void onSensorChanged(SensorEvent event) 
{ 
    switch(event.sensor.getType()) 
    { 
     case Sensor.TYPE_GRAVITY: 
     { 
      mValuesAccelerometer = lowPass(event.values.clone(), mValuesAccelerometer); 
      break; 
     } 
     case Sensor.TYPE_MAGNETIC_FIELD: 
     { 
      mValuesMagneticField = lowPass(event.values.clone(), mValuesMagneticField); 
      break; 
     } 
    } 

    boolean success = SensorManager.getRotationMatrix(
      mMatrixR, 
      mMatrixI, 
      mValuesAccelerometer, 
      mValuesMagneticField); 

    if (success) 
    { 
     SensorManager.getOrientation(mMatrixR, mMatrixValues); 

     float azimuth = toDegrees(mMatrixValues[0]); 
     float pitch = toDegrees(mMatrixValues[1]); 
     float roll = toDegrees(mMatrixValues[2]); 

     if (azimuth < 0.0d) 
     { 
      //The bearing in degrees 
      azimuth += 360.0d; 
     } 
    } 
} 

回答

1

如果你確信他們會在只有1個方向移動,來優化你的代碼,你可以有度,而不是連續監測,如果他們仍然在正確的方向移動檢查站。

這裏有一個粗略的算法中要做到這一點

//You noted 90 degree as starting point 
// checkpoint 1 will be 180 keep it as a boolean 
// now you've reached 180 if the meter gets to 180 before going to next checkpoint 
// which is 270 then make 180 false. it means they turned back. 
// if they make it to 270 then wait for 0 degrees and do the same. 
// if they make it back to 90 like that. You got a rotation and hopefully 
// a bit of complexity is reduced as you're just checking for 4 checkpoints 

我沒有在時刻派上用場的任何代碼。

0

創建3個整數

int rotationCount=0 
int currentDegrees=0 
int previousDegrees=89 

不是一個Java程序員,所以我不知道你是怎麼處理的onSensorChanged事件,但基本上是一個while循環

while (currentDegrees + 90 < 360) 
{ 
    if (currentDegrees + 90 == 0) 
    { 
     if (previousDegrees == 359) 
     { 
      rotationCount = rotationCount + 1 
     } 
    } 
    else if (currentDegrees + 90 == 359) 
    { 
     if (previousDegrees == 0) 
     { 
      rotationCount = rotationCount - 1 
     } 
    } 
    previousDegrees = currentDegrees + 90 
} 

遺憾的語法內進行檢查,這只是如何做的一個例子..

0

這是一個跟蹤問題,讀取溢出。你需要跟蹤最後的讀數,並希望用戶在每次讀數之間不要超過半圈。(因爲奈奎斯特定理)

這裏是基本的僞代碼。

var totalChange = 0; 
var lastAzimuth = -1000; 

function CountTurns(az) 
{ 
    if (az > 180) az -= 360; // do this if your azimuth is always positive i.e. 0-360. 

    if (lastAzimuth == -1000) 
    { 
    lastAzimuth = az; 
    } 

    diff = az - lastAzimuth; 
    if (diff > 180) 
    diff -= 360; 
    if (diff < -180) 
    diff += 360; 

    lastAzimuth = az; 
    totalChange += diff; 
    return totalChange/360; 
} 
0

想象我會說什麼,你一定會很快達到你的目標。 因爲你不需要考慮完整的360度,但你可以拿走一半,並使用標誌差異來獲得你的優勢。

看看這個數字: 360 Rotation

我們有一個分向兩側(左和右)的圓。

左側取負180度。 (西邊)。

右側會取正向180度。 (東邊)。

當前位置將總是0(北),正180(南)。

IF指南針變爲正(含義轉到正確的方向)

然後在每匝添加1。

如果指南針變爲負值(意味着向左方向)。

然後減去-1上的每個轉動

IF羅盤擊中OR是0,那麼它的當前位置(北)。

如果羅盤命中OR是90,那麼它是(東)。

如果指南針擊中或爲180,那麼它的(南)

如果指南針擊中或爲-90,那麼它的(西)。

這會發現,無論何時東山人,計數器都會增加+1直到它達到180,然後它會從正變負,這樣每回合就會減1,直到達到0。將是一個完整的360度旋轉。