Questo documento fa parte del materiale impacchettato nel file es03.jar
che si trova sul
sito di
Fondamenti di Informatica LB
Lo studio di architettura Eureka affida alla
nostra software house ACME la progettazione e realizzazione di un software di CAD, ovvero di disegno tecnico.
In particolare, ci viene chiesto lo sviluppo di un plotter virtuale in grado di disegnare figure geometriche
quali linee, triangoli, e cerchi.
La nostra software house - ormai da tempo sulla cresta dell'onda - dispone già di una classe Plotter
,
acquistata in un precedente progetto (al solito non abbiamo i sorgenti perchè costavano troppo, disponiamo della classe compilata
build/Plotter.class
e della relativa documentazione in docs/apidocs
).
Tale classe fornisce le funzionalità di base di un semplice plotter virtuale: è caratterizzato da un'area XY compresa fra [-1..1] e [-1..1] e da un 'pennino' virtuale
che è possibile alzare (metodo up
), abbassare (metodo down
), muovere (metodo moveTo
),
e di cui è possibile conoscere la posizione corrente (metodo getPosition
) nell'area XY.
Quando il pennino è abbassato e lo si fa muovere, il pennino lascia una traccia visibile nell'area bidimensionale.
Sono inoltre presenti metodi per settare il colore del pennino (setColor
) e lo spessore del tratto
(setThickness
).
Con la classe Plotter
è fornita anche la classe Point
, utilizzata da alcuni metodi,
che rappresenta un punto nello spazio bidimensionale. Di tale classe abbiamo sia i sorgenti (src/Point.java
),
sia la classe compilata (build/Point.class
) che la documentazione (sempre in docs/apidocs
).
A corredo del materiale, oltre alla documentazione, è fonito il componente software TestPlotter
(sia sorgente
che classe compilata), che dimostra e testa il funzionamento del plotter.
In nostro obiettivo è creare di un nuovo plotter, chiamato ACMEPlotter
, che estenda le
funzionalità della classe Plotter
, con servizi che permettono
di rappresentare linee, poligoni generici e cerchi.
Ovvero dovrà fornire servizi del tipo:
drawLine
, ovvero disegna una linea dati due punti che ne rappresentano gli estremi (ricordiamo che per rappresentare
i punti abbiamo a disposizione la classe Point
). Alla fine del tracciamento il pennino si deve trovare sul
secondo estremo della linea;drawPolygon
, ovvero disegna un poligono generico dato l'array di punti che ne rappresentano l'elenco ordinato
dei vertici. I lati del poligono sono ottenuti congiungendo vertici consecutivi: quindi il lato i-esimo si ottiene congiungendo
i vertici di indice i e i+1; l'ultimo lato si ottiene congiungendo i vertici di indice n-1 (dove n è il numero totale dei
vertici del poligono) e indice 0. Alla fine del tracciamento il pennino si deve trovare sul primo vertice specificato del poligono;drawCircle
, ovvero disegna una circonferenza dato il punto che rappresenta il centro e il raggio. Alla
fine del tracciamento il pennino si deve trovare al centro del circonferenza;L'implementazione di tali servizi si baserà sull'utilizzo dei servizi che già
la classe base mette a disposizione.
Oltre alla classe ACMEPlotter
, si richiede anche lo sviluppo del componente software
TestMyPlotter
che dimostri l'utilizzo della nuova astrazione (e quindi crei un plotter,
disegni qualche figura geometrica, etc.).
java.util.Math
per utilizzare le funzioni trigonometriche;
Plotter
e derivate è necessario chiudere
la finestra creata dal plotter stesso.
La progettazione utilizzata in precedenza porta a sviluppare un nuovo plotter ogni volta
che si introducono nuove figure da disegnare. Ora vogliamo render il sistema più flessibile
e parametrico nei confronti delle figure da disegnare, al fine di sviluppare sistemi CAD
per i quali non sia fissato a priori i tipi di figure da plottare con la definizione
del plotter
L'idea vaga che emerge dal brainstorming dai progettisti della ACME è quella di creare
una famiglia di figure geometriche, tutte caratterizzate da un colore e da uno spessore
di linea e dalla capacità di sapersi disegnare su un normale plotter: ogni figura
specifica (triangolo, poligono, circonferenza, etc.) definirà ella stessa come disegnarsi,
dato un plotter. Il plotter quindi non viene esteso, si mantiene quello originale (Plotter
).
I progettisti hanno abbozzato un caso d'uso in pseudocodifica,
che descrive l'interazione fra un oggetto plotter e oggetti che rappresentano specifiche
figure geometriche:
Plotter P = crea un nuovo Plotter
FiguraGeometrica F = crea un Triangolo, di vertici V0, V1, V2, e colore R G B
figura F, disegnati sul plotter P!
FiguraGeometrica F2 = crea una circonferenza, di centro C, raggio r e colore R G B
figura F2, disegnati sul plotter P!
L'obiettivo del punto facoltativo è progettare e sviluppare la famiglia di figure geometriche
che includa la linea, il poligono e il circonferenza, come astrazioni che specializzano l'astrazione di base 'figura
geometrica'. Al solito sviluppare un componente software di testing per dimostrare l'utilizzo
delle nuove astrazioni, riprendendo quanto fatto per il componente software TestMyPlotter
Vogliamo estender la classe realizzata ACMEPlotter
in modo tale che ogni volta che il pennino virtuale viene abbassato,
alzato, mosso oppure ne viene cambiato il colore o spessore mediante i metodi già visti, il plotter visualizzi in standard
ouput un messaggio che indica l'operazione eseguita. Ovvero: quando viene invocato il metodo up
,
oltre che a svolgere le operazioni proprie del metodo in questione,
si vuole che in standard output venga visualizzato il messaggio: "E' stato alzato il pennino virtuale".
Quando viene viene invocato il metodo moveTo
, si vuole che in standard output venga visualizzato
il messaggio: "E' stato spostato il pennino alla posizione X Y"
e così via, per i metodi down
, setColor
, e setThickness
.
Chiamare ACMEPlotterLog
la nuova classe sviluppata e testarla con un componente software
- del tipo di TestMyPlotter
- di nome TestMyPlotterLog
.