Idraulica

Realizzare il sistema software per la descrizione e la simulazione di un sistema idraulico.
Tutte le classi si trovano nel package idraulica.

Si parta dal progetto Eclipse predefinito.


R1: Elementi e Tubi

Un sistema idraulico è composto da elementi (di vario tipo) connessi tra loro da tubi. Un sistema è rappresentato da un oggetto di classe Sistema che offre i metodo aggiungiElemento() che riceve come parametro un oggetto di classe Elemento e lo aggiunge alla lista interna. Tramite il metodo getElementi() è possibile ottenere un array contenente gli elementi, questo metodo restituisce un array di oggetti Elemento.

R2: Elementi semplici

I tipi di elementi semplici sono: Sorgente, Rubinetto, Scarico che sono rappresentati dalle classi omonime.
Tutti gli elementi hanno un nome che può essere letto tramite il metodo getNome().
È possibile connettere l'uscita di un elemento all'ingresso di un altro tramite il metodo connetti() che riceve come parametro l'elemento al cui ingresso deve essere connesso l'elemento sui cui è invocato: a.connetti(b); connette l'uscita di a all'ingresso di b. Il metodo connetti() invocato su Scarico non ha nessun effetto e stampa un messaggio d'errore.
Dato un elemento è possibile sapere a quale elemento è connesso in uscita tramite il metodo getUscita() che resituisce un oggetto di tipo Elemento.

R3: Elementi complessi

Oltre agli elementi semplici di cui sopra ci sono degli elementi complessi. L'elemento a T rappresentato dalla classe Split permette di suddivide l'input in due flussi in uscita. In tale caso il metodo connetti() riceve un ulteriore parametro intero che indica l'uscita a cui connettere l'elemento. Tale intero ha valore 0 per la prima uscita e 1 per la seconda. Per sapere quali elementi sono connessi in uscita è possibile utilizzare il metodo getUscite() che restituisce un array di elementi.

R4: Simulazione

Dato un sistema corretto, ovvero un albero che ha come radice una sorgente ed in cui ogni percorso termina con uno scarico, è possibile fare un calcolo delle portate e di come vengono ripartite.
È possibile definire la portate per una sorgente con il metodo setPortata() che riceve come parametro un numero floating point che rappresenta i metri cubi al secondo.
Per i rubinetti è possibile impostare la loro apertura tramite il metodo setOpen() che riceve come parametro un boolean. Se un rubinetto è aperto la porta all'ingresso è uguale a quell all'uscita.
Per i raccordi a T la portata in ingresso viene ripartita equamente tra le due uscite.
Il metodo simula() della classe Sistema, effettua i calcoli di portata a partire da ogni sorgente e stampa per ogni elemento connesso a valle le portate in ingresso e in uscita (per lo scarico solo quella in ingresso).

Suggerimento: dato un oggetto, per sapere se è un'istanza di una classe si può usare l'operatore instanceof.
Es.
    if(elemento instanceof Sorgente)