Bucle XYZ desde el centro

Tengo una matriz tridimensional que quiero completar con valores en C #. Al hacer un bucle de una dimensión a la vez, comenzará en una esquina y trabajará en filas hasta que termine en la esquina opuesta.

Bucle estándar:

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

Quiero repetir los mismos valores, pero comenzar en el centro de la matriz y avanzar lentamente hacia afuera, de modo que si miro la matriz en el espacio 3D mientras se llena, crecerá lentamente como una bola (o un cubo ) desde el medio.

¿Alguna buena idea sobre cómo puedo hacer esto? ¡Las ideas para llenar una forma de cubo y llenar como una esfera (es decir, la distancia más cercana al centro) serían geniales!

preguntado el 27 de agosto de 11 a las 15:08

1 Respuestas

Puede usar algo como BFS
Seudocódigo de estilo C, no 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;
         }
     }
}

Llenará el área por la distancia de Manhettan. Entonces se cubrirá, pero de esquina hacia arriba y hacia abajo.

También puede usar esta solución ingenua (pseudocódigo también):

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

Respondido 27 ago 11, 19:08

¡Gracias por esa respuesta! Codifiqué la primera solución en C # y la probé. Me pregunto qué tan caro es, ya que tenemos que declarar una matriz del mismo tamaño, pero supongo que es necesario. Las dos últimas soluciones también funcionarían, pero probablemente sean demasiado caras para un uso extensivo. ¡Útil, no obstante, si es necesario! Gracias Como te tomaste tu tiempo para ayudarme, pensé en hacerte un gif para que veas el resultado :)!GIF (¿Cómo hago que funcione esta etiqueta de imagen?) - jsmars

Noté que tiene forma de diamante en lugar de un cubo. Estaba planeando un cubo, pero para mi uso actual, un diamante funciona igual de bien. - jsmars

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.