2013-09-01 50 views
0

我在我的程序中有一個3D對象的模型。我可以沿着我的座標系的軸旋轉它90度。我可以爲每次旋轉選擇軸。我可以應用幾次輪換。我可以將3D主體旋轉90度。我如何迭代所有可能的旋轉?

例如我能做到:

object = create_3d_obj(); 
rotated_ob = rotate_90_degrees(object, X_axis); 
even_more_rob = rotate_90_degrees(rotated_ob, X_axis); 
very_heavily_rob = rotate_90_degrees(even_more_rob, Y_axis); 

然而,(如預期)通過沿着在原始對象相同的軸線結果90度旋轉的4倍。這給我留下了一個有限的旋轉物體組,我可以通過這些90度旋轉達到。

有多少個旋轉物體?我如何迭代這組旋轉對象?

+1

3嵌套'for'循環? – Novak

回答

0

這樣做的問題是,輪換事宜,就可以達到不同的方式相同的狀態,這就是爲什麼嵌套循環不工作(他們給你64分的結果,而你只有24)的順序。出於這個原因,你需要從評估中消除現有的方向,否則你有重複。因此,比較方位是第一項工作,您需要一個定義來代表旋轉操作的方向,使用結果和輸入。

然後,在Python中找到旋轉一個簡單的方法是這樣的一個:

result = {} 
new = {o0} # starting orientation 
while new: 
    cur = new.pop() 
    # add new orientation to results 
    result.add(cur) 
    # determine derived orientations from the current one 
    # that weren't considered before 
    for o in derived_orientations(cur): 
     if not o in result: 
      new.add(o) 

請注意,您還可以使用嵌套的循環,並從結果中過濾重複的,但是這種方法基本上是證明自己的正確性(如果有無數個方向,它將無限循環),而嵌套循環對我來說並不明顯。

0

如前所述,三個for循環可以完成這項工作。

不同於一般的for循環,你需要重新設置每個軸的旋轉狀態,當你退出吧。

for (int drx = 0 ; drx < 4 ; ++ drx) 
{ 
    rotate_90_degrees(object, X_axis); 
    for (int dry = 0 ; dry < 4 ; ++ dry) 
    { 
     rotate_90_degrees(object, Y_axis); 
     for (int drz = 0 ; drz < 4 ; ++ drz) 
     { 
      rotate_90_degrees(object, Z_axis); 
      //do something with this iteration! 
     } 
     rotate_90_degrees(object, Z_axis); 
    } 
    rotate_90_degrees(object, Y_axis); 
} 
rotate_90_degrees(object, X_axis); //if you want the state to be restored to original, add this. 

現在,您只需按照您的要求進行迭代,其第一次迭代從(90,90,90)開始。當然,如果需要,你可以做一些修改來解決這個問題。