@startuml
class ThScatola{
'la scatola deve avere una certa dimesione
-int altezza
-int larghezza
-int lunghezza
'la scatola gestisce la sabbia contenuta in essa e la pallina che si trova sulla sabbia
-Sabbia sabbia
-Pallina pallina

'il metodo permette di visualizzare la sabbia e la pallina dopo ogni aggiornamento dell'inclinazione
+void visualizzazioneScatola()
'il metodo permette di modificare le informazioni della pallina e della sabbia in base all'inclinazione
+void aggiornaInformazioni(int inclinazione)
'il metodo permette di simulare il movimento della pallina e della sabbia in base all'inclinazione
+boolean simulazioneMovimento(int inclinazione)
}

class Sabbia{
'la sabbia occupa un certo volume della scatola
-int volume
'la sabbia ha una certa velocità sull'asse delle x che cambia in base all'inclinazione
-int velX
'la sabbia ha una certa velocità sull'asse delle y che cambia in base all'inclinazione
-int velY

'il metodo permette di aggiornare la velocità sugli assi della sabbia in base all'inclinazione
+void aggiornaSabbia(int inclinazione)
'il metodo permette di visualizzare la sabbia dopo ogni aggiornamento dell'inclinazione
+void visualizzazioneSabbia()
}

class Pallina{
'la pallina occupa una certa posizioneX sulla sabbia che cambia in base alla velocitàX
-int posX
'la pallina occupa una certa posizioneY sulla sabbia che cambia in base alla velocitàY
-int posY
'la pallina ha una certa velocità sull'asse delle x che cambia in base all'inclinazione
-int velX
'la pallina ha una certa velocità sull'asse delle y che cambia in base all'inclinazione
-int velY

'il metodo permette di aggiornare la velocità sugli assi della pallina in base all'inclinazione
+void aggiornaPallina(int inclinazione)
'il metodo permette di visualizzare la pallina dopo ogni aggiornamento dell'inclinazione
+void visualizzazionePallina()
}

class ThSensore{
'l'attributo memorizza il valore dell'inclinazione sull'asseX che permetterà di modificare le informazioni della scatola e quindi di giocare
-int valInclinazioneX
'l'attributo memorizza il valore dell'inclinazione sull'asseY che permetterà di modificare le informazioni della scatola e quindi di giocare
-int valInclinazioneY

'il metodo permette di leggere le informazioni dell'inclinazione nei datiCondivisi
+void leggi()
'il metodo permette di apportare modifiche nelle informazioni legate all'inclinazione nei datiCondivisi
+void scrivi()
}

class DatiCondivisi{
'l'attributo indica un vettore per la gestione della sabbia contenuta nelle scatole
-Sabbia[] sabbie
'l'attributo indica il numero di sabbia che sono in esecuzione
-int running

'l'attributo memorizza il valore dell'inclinazione sull'asseX che permetterà di modificare le informazioni della scatola e quindi di giocare
-int valInclinazioneX
'l'attributo memorizza il valore dell'inclinazione sull'asseY che permetterà di modificare le informazioni della scatola e quindi di giocare
-int valInclinazioneY

'l'attributo indica la quantità di rosso utilizzata per la visualizzazione dei componenti
-float red
'l'attributo indica la quantità di verde utilizzata per la visualizzazione dei componenti
-float green
'l'attributo indica la quantità di blu utilizzata per la visualizzazione dei componenti
-float blue
}

class SwingGui{
'l'attributo serve a gestire la finestra per l'utente
-JFrame frame

'il metodo permette di rendere visibile la finestra
+void show()
}


class NB_ProcessingScatola{
'l'attributo permette la gestione delle variabile condivise ai Thread
-DatiCondivisi datiC
'viene definito un vettore di ThreadScatola
-ThScatola[] scatole
'l'attributo indica il numero di Thread
-int numScatole

'il metodo permette di inizializzare gli attributi, creare l'oggetto contenente i dati condivisi,creare i Thread,creare le finestre 
+static void main()
'il metodo permette di settare la dimensione della finestra
+void settings()
'il metodo gestisce la grafica
+void setup()
'il metodo gestisce l'animazione
+void draw()
}


ThSensore "1" -- "1" ThScatola

ThScatola "0..*" -- "1" Sabbia
ThScatola "0..1" -- "1" Pallina
DatiCondivisi "1" -- "1" ThSensore
DatiCondivisi "1" -- "1" ThScatola

ThScatola "0..*" --* "1" NB_ProcessingScatola
SwingGui "1" --* "1" NB_ProcessingScatola
DatiCondivisi "1" --* "1" NB_ProcessingScatola
@enduml
