Dato che hai detto "colorare, se possibile," Ti fornire una soluzione ad esempio che non fa i colori del tutto nel modo desiderato (lo fa in un modo che ho trovato più facile da codice e più attraente da guardare) ma che gestisce correttamente tutte le numerazioni per le diverse dimensioni delle tabelle.
La funzione seguente presuppone che la tabella esista già; in this demo ho incluso il codice che genera una tabella a qualsiasi dimensione specificata e quindi chiama la funzione seguente per eseguire la numerazione e i colori.
function numberDiagonally(tableId) {
var rows = document.getElementById(tableId).rows,
numRows = rows.length,
numCols = rows[0].cells.length,
sq = numRows + numCols - 1,
d, x, y,
i = 1,
dc,
c = -1,
colors = ["green","yellow","orange","red"];
diagonalLoop:
for (d = 0; d < sq; d++) {
dc = "diagonal" + d;
for (y = d, x = 0; y >= 0; y--, x++) {
if (x === numCols)
continue diagonalLoop;
if (y < numRows)
$(rows[y].cells[x]).html(i++).addClass(dc);
}
}
for (d = 0; d < sq; d++)
$(".diagonal" + d).css("background-color", colors[c=(c+1)%colors.length]);
}
Demo: http://jsfiddle.net/7NZt3/2
L'idea generale mi è venuta è stato quello di immaginare una piazza due volte più grande a seconda di quale delle xey dimensioni è più grande e quindi utilizzare un ciclo per creare diagonali da sinistra bordo di quella casella di delimitazione che si alza e verso destra - cioè, nell'ordine in cui vuoi i numeri. MODIFICA: Perché due volte più grande del lato più lungo? Perché è la prima cosa che mi è venuta in mente quando ho iniziato a codificarlo e ha funzionato (nota che la variabile i
che contiene i numeri che vengono visualizzati non viene incrementata per le celle immaginarie). Ora che ho avuto il tempo di pensare, mi rendo conto che la mia variabile sq
può essere impostata con precisione su un valore inferiore al numero di righe più le colonne: un numero che diventa piuttosto più piccolo per le tabelle non quadrate. Il codice sopra e il violino sono stati aggiornati di conseguenza.
Si noti che i colori di sfondo potevano essere impostati direttamente nel primo ciclo, ma invece ho optato per assegnare classi e impostare i loop per ogni classe in seguito.Sembrava una buona idea in quel momento perché significava che le singole diagonali potevano essere facilmente selezionate in jQuery con un selettore di classe singola.
spiega esattamente come il resto funziona è lasciato come esercizio per il lettore ...
UPDATE - questa versione fa la colorazione più come hai chiesto: http://jsfiddle.net/7NZt3/1/ (a mio parere non come bella, ma a ciascuno di il suo stesso).
Colorare è facile una volta che hai i numeri sul posto hehe :-) –
Nel tuo diagramma, perché è 15 arancione anziché giallo? Inoltre, penso che tu voglia un algoritmo in grado di gestire diverse dimensioni, ma la tabella sarà sempre quadrata? – nnnnnn
Veloce e sporco: http://jsfiddle.net/Seybsen/ZdwV4/ ma potrebbe essere un buon punto di partenza per te. – Seybsen