2013-12-22 33 views
1

我遇到了一些關於角度的問題。我有一個角度A和另一個角度B,我想動畫A最短的方式,以便它達到B.對我來說,第一個困惑是角度從0到180,從0到-180。不確定這是什麼優點。無論如何,我會給出例如:添加或減去一個角度達到一個角度的最短路徑

float a = -35; 
float b = 90; 

每次更新我想要麼加1或減一個1度,直到它到達B,我想確保它去最近的路。

這是我的代碼,這似乎是工作。但它看起來效率不高:

b += 360; 
if (b > a) { 
    if (b - a < 180) { 
     a += 1; 
    } else { 
     a -= 1; 
    } 
} else { 
    if (a - b < 180) { 
     a -= 1; 
    } else { 
     a += 1; 
    } 
} 

有沒有更好/更簡單的方法來做到這一點?

+0

爲什麼你不包含這個必須駐留的循環,所以我們有一個完整的工作示例來玩。 –

+2

使用模運算。並且在循環開始之前計算一次方向,而不是每次迭代。 –

+0

@OliCharlesworth OP使用浮點數,所以模算術不是一個明顯的選項。 –

回答

3

所以你想要從ab的最短路線。

因爲我們正在尋找一個差異讓減:

float d = a-b; 

如果結果的值大於180,然後我們要減去360

if (d > 180) { 
    d -= 360; 
} else if (d<-180) { 
    d += 360; 
} 

現在d是總距離旅行。您可以將其與0進行比較以查看要走哪條路。你也可以做更好的事情,比如更大的d。例如,以使其始終移動的方式10%(注意,這個系列將永遠不會結束,因爲它會通過小金額,所以你需要應付那種情況下不斷接近):

a += d/10; 

您還需要如果您想要流暢的動畫,請考慮幀速率。

如果您將tpf(每幀時間)計算爲一秒的浮點部分。

long frameTook = lastFrame - System.currentTimeMillis(); 
long lastFrame = System.currentTimeMillis(); 
float tpf = frameTook/1000; 

你現在可以做一個恆定的動畫(其中degreesPerFrame是動畫的速度)使用:

float move = degreesPerFrame * tpf; 

檢查我們不打算搬過去的目標,如果我們只是在轉移到它。

if (move > FastMath.abs(d)) { 
    a = b; 
} else { 
    if (d>0) { 
     a+=move; 
    } else { 
     a-=move; 
    } 
}