Fondamenti di Informatica LB - anno 2002/2003

Esercitazione 03: "Plotter virtuale"


Data: 14 Maggio 2003

Questo documento fa parte del materiale impacchettato nel file es03.jar che si trova sul sito di Fondamenti di Informatica LB


Descrizione dell'esercitazione


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:

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.).

Note

Facoltativo (A)

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

Note


Facoltativo (B) - più semplice

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.