Цикл XYZ от центра - PullRequest
       2

Цикл XYZ от центра

1 голос
/ 27 августа 2011

У меня есть трехмерный массив, который я хочу заполнить значениями в C #. Зацикливаясь по одному измерению за раз, оно будет начинаться в одном углу и работать в строках, пока не закончится в противоположном углу.

Стандартный цикл:

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

Я хочу зациклить те же значения, но начать с центра массива и медленно продвигаться наружу, так что если я посмотрю на массив в трехмерном пространстве по мере его заполнения, он будет медленно расти как шар (или куб) с середины.

Есть хорошие идеи о том, как я могу это сделать? Идеи как для заполнения формы куба, так и для заполнения в виде сферы (т. Е. Самое близкое расстояние до середины) было бы здорово!

1 Ответ

1 голос
/ 27 августа 2011

Вы можете использовать что-то вроде 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;
         }
     }
}

Это заполнит область расстоянием Манхеттена. Так будет куб, но сверху вниз и снизу

Также вы можете использовать это наивное решение (также псевдокод):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...