RELAZIONE 3
ANCARANI SILVIA
OBIETTIVI: - uso ereditarietà
- uso astrazioni
- uso classi astratte
DESCRIZIONE DEL PROBLEMA
I PARTE:
Creare un tipo di dato astratto che fornisca servizi per disegnare triangoli, rettangoli e
cerchi.
Si dispone già dell’astrazione Simple DrawPad di cui è fornita la documentazione e
tutti i metodi che utilizza (escluso il file sorgente).
Creare quindi un componente SW che testi il funzionamento della astrazione
realizzata.
II PARTE:
Data la classe astratta Shape, derivare nuove classi concrete relative alle figure che si
vogliono avere (triangoli, rettangoli, cerchi…), ognuna che specifiche come
disegnarsi.
ANALISI
I PARTE: DrawPad
La classe SimpleDrawPad è un’astrazione in grado di realizzare punti e linee e di
definirne i colori e lo spessore delle linee usate.
Essendo il mio scopo quello di costruire un’entità ADT in grado di fornire figure
geometriche, mi servo proprio delle classe SimpleDrawPad e dei suoi metodi: infatti,
se si combinano in modo opportuno linee e punti, si ottengono delle vere e proprie
figure.
Chiamerò il dato astratto DrawPad (classe base) e ciò significa che eredita dalla base
tutti i metodi ed i dati; può inoltre inserire nuovi metodi e dati per realizzare le sue
funzioni in modo ottimale.
E’ importante specificare che la classe derivata DrawPad utilizza ma non modifica in
nessun caso i metodi e dati della classe base SimpleDrawPad.
Analizziamo ora come creare le figure geometriche desiderate.
Prima di tutto specifico che nella finestra di visualizzazione grafica l’origine degli
assi cartesiani è in altro a sinistra e l’asse delle ordinate è discendente.
Per realizzare un triangolo basterà quindi passare le coordinate (x,y) relative ai 3
vertici ed unirle con le linee in modo opportuno.
Se ho un triangolo rettangolo basterà passare le coordinate di 2 vertici, in quanto il 3°
risulterà dalla combinazione delle coordinate dei primi due.
Per realizzare un quadrato passerò le coordinate (x,y) dei 2 vertici opposti ed unire i 4
vertici che si ottengono.
Importante è la realizzazione del cerchio che utilizza una funzione di passaggio da
coordinate polari a cartesiane.
Occorre infatti passare le coordinate del centro (x,y) e la lunghezza del raggio ra
desiderata. Otteniamo che l’ascissa del cerchio sarà Xc= x + ra*sin(a) e l’ordinata
sarà Yc= y + ra*cos(a), dove a è l’angolo di riferimento in un cerchio trigonometrico.
Per potere utilizzare queste coordinate in modo da ottenere un cerchio, basterà
invocare un metodo base “Math”.
In ogni figura è anche possibile specificare il colore e lo spessore delle linee tracciate
invocando i metodi della classe base SimpleDrawPad.
Per quanto riguarda il componente SW che deve verificare il funzionamento di
DrawPad, costruisco un oggetto (di tipo DrawPad) e gli faccio disegnare le figure che
ho sviluppato. (vedi files Esempio.java, Esempioa.java ed EsempioB.java)
II PARTE:
La classe Shape rappresenta un tipo di dato astratto (figura) che si può realizzare con
un SimpleDrawPad.
Da Shape voglio derivare delle figure con proprie caratteristiche: colore e spessore
della riga. Per ciò che riguarda le coordinate per disegnare le varie forme
geometriche, sono le stesse specificate in DrawPad.
Per quanto riguarda il settaggio del colore, utilizzo 3 dati che indicano la percentuale
dei 3 colori base: rosso, verde e blu.
Ogni figura estende quindi il concetto di Shape.
Anche qui utilizzo un componente SW per verificare come funzionano i nuovi oggetti
creati e lo chiamo Esempio2.
PROGETTO
I PARTE:
Per creare delle figure utlizzo la classe pubblica DrawPad che è una sottoclasse di
SimpleDrawPad che è stata fornita in un package tool. Dentro la DrawPad ho usato i
metodi della classe base per disegnare triangoli, cerchi, rettangoli e forme
geometriche in genere assegnando le opportune variabili.
Avrò quindi le relative classi:
- public void drawBox,
- public void drawTriangle,
- public void drawCircle
con le relative variabili (coordinate dei vertici).
Verifico poi il funzionamento creando il componente SW “Esempio” dove l’oggetto
“pad” di tipo DrawPad viene creato ed usato per disegnare un triangolo, un rettangolo
(quadrato) ed un cerchio invocando i metodi della classe DrawPad.
II PARTE:
Anche in questo caso occorre entrare nel package tool.
Definisco poi una classe per ogni figura geometrica che voglio realizzare.
Esse saranno tutte un’estensione di Shape ed avrò quindi:
- public class Box extends Shape
- public class Triangle extends Shape
- public class Circle extends Shape
IMPLEMENTAZIONE: DrawPad.java
Codice e documentazione relativi alla classe DrawPad.
Prima di tutto è necessario specificare all’inizio del codice “import tools.*” in modo
che vengano importate tutte le classi necessarie.
Ora posso creare la classe DrawPad con lo stesso costruttore della classe base
SimpleDrawPad.
Tutti i metodi che uso per disegnare le figure utilizzano quelli della classe
SimpleDrawPad, quali “drawLine” per disegnare linee e “drawPoint” per i punti.
Stessa cosa per assegnare i colori e lo spessore delle linee.
Nel metodo usato per disegnare il cerchio, uso un ciclo di for del tipo:
for (int a=0; a<360; a++) {
Xc= x + ra*Math.sin(a);
Yc= y +ra*Math.cos(a);
E poi gli applico un metodo della SimpleDrawPad che è:
drawPoint ((int)Xc, (int)Yc).
Specificando che Xc e Yc ora sono degli interi mentre prima erano dei double.
(ecco chiarito l’utilizzo della parenteri intorno ad “int”).
Creo poi un componente SW di tipo DrawPad e lo chiamo “pad” (Esempio.java,
EsempioA.java, EsempioB.java
II PARTE:
Anche in questo caso occorre specificare all’inizio del codice “import tools.*” in
modo che vengano importate tutte le classi necessarie.
In secondo luogo occore dichiarare delle variabili temporanee che mi servono per
appoggiare i parametri che utilizzo per le figure.
Utilizzo quindi i metodi della classe Shape:
- pad.show() per visualizzare il pad;
- pad.setCurrentThickness (getThickness()) per settare lo spessore
della riga;
- pad.setCurrentColor (getColorRedComponent(),
getColorGreenComponent(), getColorBlueComponent()) per settare
il colore.
Anche qui utilizzo il metodo di SimpleDrawPad per disegnare le linee
(pad.drawLine) e i punti (pad.drawPoint).
Creo quindi un oggetto di tipo SimpleDrawPad e lo chiamo “pad” (vedi Esempio2).
CASI D’USO
I PARTE:
Codice e documentazione relativi a:
- Esempio.java
- EsempioA.java
- EsempioB.java
II PARTE:
Codice e documentazione relativi a Esempio2.java
NOZIONI ACQUISITE
I PARTE:
Con questo progetto ho imparato le tecniche e l’uso dell’ereditarietà tra classi: infatti
la classe DrawPad deriva dalla classe base SimpleDrawPad. La sottoclasse estende
quella già esistente importando i dati ed i metodi della classe base ma non i
costruttori. Essa inoltre può aggiungere nuovi dati e metodi ma non modificare quelli
già esistenti.
Ho anche utilizzato l’astrazione, per eredità, per creare il DrawPad da
SimpleDrawPad.
II PARTE:
Con questo progetto ho acquisito il concetto di “classi astratte” ed ho imparato ad
implementarne i metodi, per esempio ho utilizzato la parola “super” per invocare un
costruttore della classe base Shape.