Vamos, acá va:
// Pointer XY
var pointer_x = 6; // X (1 to 11)
var pointer_y = 6; // Y (1 to 11)
var payload = 9; // Max number. Total rows * 2 + 1 (xy:9876543210123456789)
var max_rows = 11; // Max width & height rows to show
var current_pointer_x = ((payload * 2) + 1); // Current pointer X
var current_pointer_y = ((payload * 2) + 1); // Current pointer Y
var lines = []; // Array
var floor = payload; // Dinamic floor
var clon = []; // Array
// Buffer
for(var a = 1; a <= payload + 1; a++){
var line = []; // Empty line (array)
for(var b = payload; 1 <= b; b--)
line.push((b < floor) ? floor : b); // If number is < to floor: number, else: floor
lines.push(line); // Append line to lines
floor--; // Floor reduction
}
// Horizontal mirror (right)
clon = lines.slice(0); // Clone array
lines = []; // Clear array
for(a in clon){
var final_line = clon[a].slice(0); // Clone line to final line (left half)
final_line.push((a == (clon.length - 1)) ? 0 : clon[a][clon[a].length - 1]); // Center (n or 0)
clon[a].reverse(); // Invert line
for(b in clon[a]) // Append inverted line to final line
final_line.push(clon[a][b]);
lines.push(final_line); // Push final line
}
// Vertical mirror (bottom)
clon = lines.slice(0); // Clone array
clon.pop(); // Remove center line (the pointer)
clon.reverse(); // Invert array
for(a in clon) // Append array inverted into lines array
lines.push(clon[a]);
// Move area [[]]
shift_left = (payload - pointer_x);
shift_top = (payload - pointer_y);
// Cut area
clon = lines.slice(0); // Clone array
lines = []; // Reset array
for(var a = 0; a <= clon.length - 1; a++){
var line = [];
for(var b = 0; b <= clon[a].length - 1; b++){
if(
( a > shift_top) && // Cut top
((a - shift_top) < (max_rows + 1)) && // Cut bottom
( b > shift_left) && // Cut left
((b - shift_left) < (max_rows + 1)) // Cut right
){
line.push(clon[a][b]);
}
}
if(line.length) // Have line?
lines.push(line); // Append line to lines
}
// Print result
str = '';
for(a in lines)
str += lines[a].join(' ') + '\n';
console.log(str);
5 5 5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 3 3 4 5
5 4 3 2 2 2 2 2 3 4 5
5 4 3 2 1 1 1 2 3 4 5
5 4 3 2 1 0 1 2 3 4 5
5 4 3 2 1 1 1 2 3 4 5
5 4 3 2 2 2 2 2 3 4 5
5 4 3 3 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5 5 5
Si cambio las posiciones XY queda así:
var pointer_x = 1; // X (1 to 11)
var pointer_y = 1; // Y (1 to 11)
0 1 2 3 4 5 6 7 8 9
1 1 2 3 4 5 6 7 8 9
2 2 2 3 4 5 6 7 8 9
3 3 3 3 4 5 6 7 8 9
4 4 4 4 4 5 6 7 8 9
5 5 5 5 5 5 6 7 8 9
6 6 6 6 6 6 6 7 8 9
7 7 7 7 7 7 7 7 8 9
8 8 8 8 8 8 8 8 8 9
9 9 9 9 9 9 9 9 9 9
var pointer_x = 7; // X (1 to 11)
var pointer_y = 3; // Y (1 to 11)
6 5 4 3 2 2 2 2 2 3 4
6 5 4 3 2 1 1 1 2 3 4
6 5 4 3 2 1 0 1 2 3 4
6 5 4 3 2 1 1 1 2 3 4
6 5 4 3 2 2 2 2 2 3 4
6 5 4 3 3 3 3 3 3 3 4
6 5 4 4 4 4 4 4 4 4 4
6 5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6 6
7 7 7 7 7 7 7 7 7 7 7
8 8 8 8 8 8 8 8 8 8 8
Ahora la explicación:
Lo que hace es crear un buffer inicial, un cuarto de todo el cuadrado, luego solamente lo clona vertical y luego horizontal tal como lo expliqué en el post anterior. Se crea un cuadrado de 19 columnas y filas, esto quiere decir del 9 al 9 mas un centro = 18 + 1, después de esto se crea una segunda capa imaginaria de 11x11 (del 5 al 5 mas el centro) y recorta los bordes restantes, de esta manera se obtiene el puntero en la posición requerida. Imagina dos capas donde una capa superior es el recuadro y debajo de ella un cuadrado mucho mas grande con un punto al centro, si mueves la capa que está debajo podrás posicionar el punto donde tu quieras con el tamaño del recuadro de encima.
En esta imagen el puntero se localiza en la posición X:8 Y:7
De todas maneras como dijo MAFUS el resultado no siempre será coherente ya que no existe una mitad exacta, para simular una mitad colocando el cero al centro debes agregar una columna adicional por lo cual cuando quieres posicionar el puntero en X:1 Y:1 te faltará un número después del 9 (y no puede ser 10) ya que en el ejemplo que pusiste dices que el ancho total es de 5 a 1, el centro y luego de 1 a 5 por lo cual son 11, asi que si posicionas el cero en la primera columna te quedan 10 para rellenar, del 1 al 9 y luego que?, falta un número. En mi caso lo omití, si pones el puntero en X:1 Y:1 aparece una columna menos y una fila menos, el cuadrado deja de ser de 11x11 para ser de 10x10 (0 al 9). Para solucionar esto el tamaño del cuadrado a mostrar debiera ser de 9 (4 al 1 mas el centro y del 1 al 4), de esta manera si posiciono el cero en la primera columna solo debo rellenar 8 espacios (del 1 al 8). En el script se soluciona cambiando [payload] de 9 a 8 y [max_rows] de 11 a 9. El problema de raiz está en que el número máximo es impar y debiera ser el mayor par que pueda soportar una area de números del 0 al 9, o sea el 8 y no el 9.
0 1 2 3 4 5 6 7 8
1 1 2 3 4 5 6 7 8
2 2 2 3 4 5 6 7 8
3 3 3 3 4 5 6 7 8
4 4 4 4 4 5 6 7 8
5 5 5 5 5 5 6 7 8
6 6 6 6 6 6 6 7 8
7 7 7 7 7 7 7 7 8
8 8 8 8 8 8 8 8 8
Espero que hayas podido comprender bien.
Saludos.