2011-08-27 35 views
1

我有一個三維數組,我想用C#中的值填充。通過一次循環一個維度,它將從一個角落開始,並在行中工作直到它在對角完成。從中心循環XYZ

標準循環:

for (int x = 0; x < 10; x++) 
    for (int y = 0; y < 10; y++) 
     for (int z = 0; z < 10; z++) 
     { 
      // fill value 
     } 

我想環路相同的價值觀,但在陣列的中心開始,慢慢地工作,我的方式向外,這樣,如果我看在三維空間中數組它被填滿了,它會從中間慢慢成長爲一個球(或立方體)。

關於如何做到這一點的好主意?既填充立方體形式,又填充爲球體(即與中間距離最近的距離)的想法將非常棒!

回答

1

您可以使用類似BFS
C風格的僞代碼,不C#:

class Point{int x,y,z;}; 

queue<Point> q; 
bool used[100][100][100]; //all false. true when add point to queue 
Point vectors[]={(0,0,1),(0,0,-1),(0,1,0),(0,-1,0),(1,0,0),(-1,0,0)} 
q.push(Point(50,50,50)); //start point 
used[50][50][50]=true; 
while(!q.empty()){ 
    Point cur=q.front(); 
    //use cur; 
    q.pop(); 
    for(i=0;i<6;++i){ 
     if(!used[cur+vectors[i]] && (cur+vectors[i] is in our diapason)){ 
      q.push(cur+vectors[i]); 
      used[cur+vectors[i]]=true; 
     } 
    } 
} 

它將由Manhettan距離填充區域。因此,這將立方體,但角球到頂部和底部

你也可以使用這個天真的解決方案(僞太):

Point points[]; 
for (int x = 0; x < 10; x++) 
    for (int y = 0; y < 10; y++) 
     for (int z = 0; z < 10; z++) 
      { 
       add to point array 
      } 

sort points[] by function r() (if r(a)<r(b) then a before b) 

loop points here 

r(a)=sqrt((a.x-5)^2+(a.y-5)^2+(a.z-5)^2) for ball 
r(a)=max(abs(a.x-5),abs(a.y-5),abs(a.z)-5) for cube 
+0

感謝您的回答!我將第一個解決方案編碼到C#中並進行了測試。我不知道這是多麼昂貴,因爲我們必須聲明一個相同大小的數組,但我想這是需要的。 最後兩種解決方案也可以工作,但對於廣泛使用可能太昂貴。如果需要,仍然有用!謝謝 因爲你花了你的時間來幫助我,我想我會讓你看到結果的GIF :) ![GIF](http://smars.se/misc/box.gif) (How我得到這個圖像標籤的工作?) – jsmars

+0

我注意到,它形成了一個鑽石形狀,而不是一個立方體。我正在計劃一個立方體,但對於我目前的使用情況來說,一顆鑽石也可以工作。 – jsmars