2012-03-20 67 views
3

我想順時針或逆時針旋轉一個對象。幾個整數(從0到7)表示物體正在尋找的方向(例如左,上,上,右,右,...)。向對象的當前方向添加+1將順時針旋轉,減1則逆時針旋轉。確定轉彎的方向?

如果我想讓對象轉向某個方向(=整數),我該如何確定必要的最小匝數?

目前我使用這種思維方式:

int minimumRequiredTurns = min(abs(currentDirection.intvalue - goalDirection.intvalue), 
         8 - abs(currentDirection.intvalue - goalDirection.intvalue)); 

是否有可能做到這一點沒有min聲明?

+0

8個方向代表什麼? '(左,上,右,...)「 - 這意味着只有四個方向。請澄清 – WeaselFox 2012-03-20 14:43:01

+0

不應該是int minimumRequiredTurns = min(abs(currentDirection.intvalue-goalDirection.intvalue),8 - abs(currentDirection.intvalue-goalDirection.intvalue));' – tafa 2012-03-20 14:50:35

+0

你是對的,tafa。狡猾的狐狸,它實際上是左,上,上,挺,右,......)。 – Fatso 2012-03-20 14:54:00

回答

2

我覺得

(1-(abs(abs(currentDirection.intvalue - goalDirection.intvalue)/(n/2)-1)))*(n/2)

應該做的伎倆,其中n可能方向的數量。

爲了讓整隻計算變換這

(n/2)-abs(abs(currentDirection.intvalue - goalDirection.intvalue)-(n/2))

說明:使用帽子函數生成的地圖:

0 -> 0 
1 -> 1 
2 -> 2 
3 -> 3 
4 -> 4 
5 -> 3 
6 -> 2 
7 -> 1 
+0

將其編輯爲符合OP – Azrael3000 2012-03-20 15:18:15

+0

+1的符號大大改進。 – Caleb 2012-03-20 15:19:12

+1

如果任何人有同樣的想法,我不想變慢:) Thx – Azrael3000 2012-03-20 15:20:13

2

如果你真的不喜歡「分鐘」,你可以使用查找表。

int minRequiredTurns[8][8] = { 
    0, 1, 2, 3, 4, 3, 2, 1, 
    1, 0, 1, 2, 3, 4, 3, 2, 
    2, 1, 0, 1, 2, 3, 4, 3, 
    /* and so on... */ 
}; 
+0

這個問題是,如果我添加子方向,表將是無用的。 – Fatso 2012-03-20 14:55:00

+0

@Korion:說實話,目前的解決方案也很好。 – hugomg 2012-03-20 16:19:53

1

首先,力產生積極的影響,那麼力介於0和N/2之間(0和4)

N=8 
diff = (new-old+N)%N; 
turns = diff - (diff>N/2 ? N/2 : 0) 
+2

這足以讓OP運行尖叫成'min'的懷抱:-) – 2012-03-20 14:53:28

+0

這很好,謝謝! – Fatso 2012-03-20 17:08:17

1
int N = 8, turns = abs(current-goal); 
if (turns > N/2) turns = N-turns; 

但我不明白你爲什麼不想分鐘語句...

+0

也許這是一個有點人爲的設計,但是你可以想象必須在一些不支持分支的非常有限的設備上實現這一點,並且你只能使用算術,或者出於性能原因需要避免分支的地方。 – gcbenison 2012-03-21 04:45:52

+0

當然這有效,斯馬林諾夫,但它不完全是我以後。我希望沿着Azrael的回答或gcbenison的回答。算術,儘可能短。 – Fatso 2012-03-21 07:38:56

+1

@Korion我的不好,我不知何故完全通過你的問題的相關部分。 – 2012-03-21 12:28:49

2

幾乎可以肯定,一個更好的設計是將使用向量來表示的方向;將「方向」視爲一對數字(x,y),以便x代表水平方向,y代表垂直方向。

因此(1,0)將代表面向右方; (0,1)將代表朝上; (-1, 0)將面臨左側; (1,1)會朝右上方;等


然後,你可以使用普通的基於矢量的解決問題的方法:拿你面對的方向,你想要的方向去面對,並採取兩個cross-product

 
result = x1y2 - x2y1 

如果結果爲正,逆時針旋轉;如果結果爲負數,則順時針旋轉(由於定義了交叉產品的right-hand rule,因此這樣工作)

請注意,這種方法泛泛地允許任意方向,而不僅僅是水平/垂直/對角線。

1

沒有min,沒有abs,一個表情,沒有劃分:

turns = ((((goalDirection + 8 - currentDirection) % 8) + 4) % 8) - 4 

它是如何工作:最裏面的表達式(goalDirection + 8 - currentDirection)是AShelley給出相同;順時針方向所需的圈數。最外層的表達式將其轉換爲[-4 .. + 3]中的等價值。

+0

令人驚歎!唯一的問題是結果可能是負面的,所以無論如何你需要'abs'。目前我很確定它的工作原理......再次感謝!當我確定它有效時,你會得到最好的回答。 – Fatso 2012-03-21 07:21:01