Dovete realizzare un programma di simulazione del biliardo. Sul tavolo da biliardo si trovano disposte, inizialmente in quiete, alcune palle, ognuna delle quali ha varie caratteristiche (in particolare: colore, diametro, massa). L'insieme delle palle e la loro disposizione iniziale possono essere scelti fra un certo insieme di disposizioni possibili, e l'utente deve eventualmente poter modificare la disposizione, aggiungendo o togliendo palle oppure modificando le caratteristiche delle palle esistenti.
A questo punto, l'utente può imprimere a una delle palle un certo impulso, di cui deve poter essere specificata l'entità e la direzione. Per effetto di questo impulso, la palla inizia a spostarsi sul tavolo, urtandone eventualmente i bordi e urtando altre palle, che a loro volte reagiscono in base alle note leggi fisiche.
Per effetto dell'attrito, dopo un certo tempo tutte le palle ritornano ad uno stato di quiete, in cui l'utente deve poter modificare nuovamente la configurazione e/o imprimere un nuovo impulso a una delle palle. L'attrito deve poter essere modificato a richiesta.
Suggerimento: potete modellare ogni palla come un oggetto thread, che ha come attributi sia le caratteristiche statiche della palla (colore, diametro, massa), sia le sue caratteristiche dinamiche (posizione, quantità di moto). Il metodo run deve agire modificando le caratteristiche dinamiche (in particolare, la posizione sulla base della quantità di moto e dell'attrito).