Pensando e ripensando ad alcuni stimoli da dare alle lezioni di laboratorio per cercare di incentivare lo studio di Java nei primini, sto cercando algoritmi elementari in modo da proporre problemi che sviluppino il ragionamento.
Pensando a questi “dilemmi esistenziali”, questa mattina mi sono chiesto come fare per disegnare cerchi su terminale, magari pulsanti, senza impostare carattere per carattere, la forma del cerchio.
Poi mi è venuto un lampo di genio: quando disegno sul JPanel, non faccio altro che dire a java di prendere ed eseguire metodi di classi che, punto per punto, disegnano la figura. E un cerchio, per essere disegnato punto per punto, non necessita di altro, se non delle informazioni di seno e coseno che lo caratterizzano. Più, ovviamente, un raggio per la dimensione.
Impostando il problema, sono giunto a questo codice:
public class DrawMatrixCircle { public static void main(String[] argv) { int[][] matrix = new int[50][50]; for (int i=0; i<360; i++) { matrix[25-(int)(20*Math.sin(Math.toRadians(i)))][25-(int)(20*Math.cos(Math.toRadians(i)))] = 1; } for (int i=0; i<50; i++) { for (int j=0; j<50; j++) if (matrix[i][j] == 1) print("--"); else print(" "); println(""); } } public static void println(String s) { System.out.println(s); } public static void print(String s) { System.out.print(s); } }
Ovviamente questo codice genera solamente un cerchio al centro di una matrice 50×50 (sarebbe meglio dire 100×50 visto che si utilizzano 2 caratteri di largezza per ogni elemento di bordo).
Per fare delle animazioni si può procedere sfruttando funzioni oscillanti per dare valore al raggio, come ad esempio la funzione coseno (che ha un’oscillazione sinusoidale), o sfruttare un versore massimizzato da un limite, oltre il quale il versore cambia verso e il cerchio passa ad animarsi in modo contrario.
Un’anteprima del codice potrebbe essere simile a questa immagine:

Ecco l’animazione su terminale.
[YT]kD5B6o1EE5Q[/YT]
Drawing animating circle on mac’s terminal
