Semplici applicazioni grafiche in Java



Documenti analoghi
In Java esistono tre tipi di programmi

Capitolo 3. Realizzare classi. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

Introduzione a Classi e Oggetti

I Canvas. import java.awt.*; import javax.swing.*; public class Graf{ public Graf () { JFrame f = new JFrame("Finestra"); // crea frame invisibile

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Java Applet. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Grafico della parabola

Programmazione Java: Interfacce grafiche (GUI)

GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C

APPLICAZIONI & APPLET

Le basi della grafica in Java. Prof. Francesco Accarino IIS Altiero Spinelli via Leopardi 132 Sesto san Giovanni

Tutorial di HTML basato su HTML 4.0 e CSS 2

Programmazione Orientata agli Oggetti in Linguaggio Java

Concetto di Funzione e Procedura METODI in Java

Java: Compilatore e Interprete

Struttura di un programma Java

La struttura dati ad albero binario

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

GESTIONE DEI PROCESSI

Guida all uso di Java Diagrammi ER

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Scaletta. Estensioni UML per il Web. Applicazioni web - 2. Applicazioni web. WAE: Web Application Extension for UML. «Client page»

Algoritmi di Ricerca. Esempi di programmi Java

TECNOLOGIE APPLICAZIONI WEB Linguaggio Java: Le Applet

Programmazione a Oggetti Lezione 10. Ereditarieta

Applicazioni grafiche

Programmazione ad oggetti

MANUALE D USO DELLA PIATTAFORMA ITCMS

Capitolo 4 Pianificazione e Sviluppo di Web Part

GEOGEBRA I OGGETTI GEOMETRICI

E possibile modificare la lingua dei testi dell interfaccia utente, se in inglese o in italiano, dal menu [Tools

HTML 6. I frame. Sintassi di base. I frame e DOCTYPE FRAME. ...head... <FRAMESET lista_attributi> <FRAME SRC= URL lista_attributi>

4. Un ambiente di sviluppo per Java

Programmazione Java: Variabili membro, Metodi La parola chiave final

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

per immagini guida avanzata Uso delle tabelle e dei grafici Pivot Geometra Luigi Amato Guida Avanzata per immagini excel

!"#$%&&'()#*%+%+!"#$"',,'()#*%+ -")%*&'&'+'$.)+-$$%&&) !"#$%&&'(%)'*+%",#-%"#.'%&'#/0)-+#12"+3,)4+56#7+#.')8'9

L interfaccia grafica in Java

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Utilizzo Software Bob-Cad Lavorazione pezzi in 3D

Corso sul linguaggio Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Testo Esercizio. Un modello è ragionevole quando contiene queste tre caratteristiche.

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Eclipse. Avviare un progetto e compilare un semplice programma

Le variabili. Olga Scotti

Esercizio 1. Nella Tabella A sono riportati i tempi di percorrenza, in minuti, di un tratto autostradale da parte di 40 autoveicoli.

Personalizza. Page 1 of 33

Inizializzazione, Assegnamento e Distruzione di Classi

Livelli di astrazione

Introduzione alla programmazione Java. Dott. Ing. M. Banci, PhD

I file di dati. Unità didattica D1 1

UML Diagrammi delle classi. UML Diagramma classi 1

Gestione dell interattività: gli eventi

Introduzione al package grafico Swing

User Tools: DataBase Manager

Ottava Esercitazione. introduzione ai thread java mutua esclusione

lo PERSONALIZZARE LA FINESTRA DI WORD 2000

Come costruire una distribuzione di frequenze per caratteri quantitativi continui

GERARCHIE RICORSIVE - SQL SERVER 2008

Esercizi della lezione 5 di Java

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

La codifica delle immagini

Configurare TPTP in Eclipse e testare un applicazione

Java: la libreria delle classi

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Definire gli attributi dei blocchi

Corso di Programmazione ad Oggetti

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

UTILIZZO DEI CSS. categoria e lente possiamo aggregare le istruzioni inserite ed avere infondo alla colonna stessa un anteprima.

Che cos'è un modulo? pulsanti di opzione caselle di controllo caselle di riepilogo

Guida informatica per l associazione #IDEA

Uso di base delle funzioni in Microsoft Excel

Come costruire una presentazione. PowerPoint 1. ! PowerPoint permette la realizzazione di presentazioni video ipertestuali, animate e multimediali

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Test di unità con JUnit4

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

EXCEL PER WINDOWS95. sfruttare le potenzialità di calcolo dei personal computer. Essi si basano su un area di lavoro, detta foglio di lavoro,

Introduzione a ROOT. 1. Informazioni generali

Appunti di Informatica 1

Classi astratte. Master in Web Technology e Security luglio - settembre Interfacce

Esempio di esecuzione di una pagina JSP: Il client chiede la pagina: sdfonline.unimc.it/info/modulo.jsp;

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Eclipse - Nozioni Base

Gruppi di Thread. Java threads (3) Gruppi di thread e Timer. Operating Systems. Operating Systems. Java threads 3. Java threads 3

Multithreading in Java. Fondamenti di Sistemi Informativi

Transcript:

Semplici applicazioni grafiche in Java

Applicazione grafica Visualizza informazioni all interno di una finestra dotata di barra di titolo e cornice (frame) La Java Virtual Machine esegue ogni frame su una thread separata la gestione del frame e delle operazioni che genera è affidata ad una thread Thread = flusso di esecuzione, processo, visione dinamica di un programma sequenziale

Finestre: classe javax.swing.jframe import javax.swing.*; JFrame frame = new JFrame(); frame.setsize(300, 400); frame.settitle( "An Empty Frame"); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setvisible(true);

File EmptyFrameViewer.java 01: import javax.swing.*; 02: 03: public class EmptyFrameViewer 04: { 05: public static void main(string[] args) 06: { 07: JFrame frame = new JFrame(); 08: 09: final int FRAME_WIDTH = 300; 10: final int FRAME_HEIGHT = 400; 11: 12: frame.setsize(frame_width, FRAME_HEIGHT); 13: frame.settitle("an Empty Frame"); 14: frame.setdefaultcloseoperation(jframe.exit_on_close); 15: 16: frame.setvisible(true); 17: } 18: }

Disegnare figure per visualizzare qualcosa all interno di un frame occorre definire un oggetto di tipo JComponent e aggiungerlo al frame si deve estendere la classe JComponent (pacchetto javax.swing) public class RectangleComponent extends JComponent { public void paintcomponent(graphics g) { // Recover Graphics2D Graphics2D g2 = (Graphics2D) g;... } }

Metodo paintcomponent Invocato automaticamente ogni volta che una componente necessita di essere ridisegnata quando una finestra viene resa visibile la prima volta quando una finestra viene ridimensionata quando una finestra diviene nuovamente visibile dopo essere stata nascosta (setvisible(false)) Le istruzioni di disegno sono inserite in questo metodo

Disegnare forme Graphics ci consente di manipolare lo stato grafico (ad es. colore). Classe astratta. Graphics2D: astratta, estende Graphics, ha metodi per tracciare forme grafiche Cast a Graphics2D del parametro Graphics serve per usare metodo draw Graphics e Graphics2D sono in java.awt

Esempio: disegnare rettangoli in un frame

Classi del programma RectangleComponent: riscrive metodo paintcomponent per tracciare rettangoli nella maniera voluta RectangleViewer: contiene il metodomain che costruisce un frame aggiunge una componente al frame e rende il frame visibile

File RectangleComponent.java 01: import java.awt.graphics; import java.awt.graphics2d; 02: import java.awt.rectangle; import javax.swing.jcomponent; 03: 04: // A component that draws two rectangles. 05: public class RectangleComponent extends JComponent{ 06: public void paintcomponent(graphics g){ 07: 08: // Recover Graphics2D 09: Graphics2D g2 = (Graphics2D) g; 10: 11: // Construct a rectangle and draw it 12: Rectangle box = new Rectangle(5, 10, 20, 30); 13: g2.draw(box); 14: 15: // Move rectangle 15 units to the right and 25 units down 16: box.translate(15, 25); 17: 18: // Draw moved rectangle 19: g2.draw(box); 20: } 21: }

File RectangleViewer.java 01: import javax.swing.jframe; 02: 03: public class RectangleViewer 04: { 05: public static void main(string[] args) 06: { 07: JFrame frame = new JFrame(); 08: 09: final int FRAME_WIDTH = 300; 10: final int FRAME_HEIGHT = 400; 12: frame.setsize(frame_width, FRAME_HEIGHT); 13: frame.settitle("two rectangles"); 14: frame.setdefaultcloseoperation(jframe.exit_on_close); 15: 16: RectangleComponent component =newrectanglecomponent(); 17: frame.add(component); 18: 19: frame.setvisible(true); 20: } 21: }

Ricapitoliamo i passi 1. Istanzia un frame e settare parametri (ampiezza, altezza, titolo, etc) JFrame frame = new JFrame(); frame.setsize(frame_width, FRAME_HEIGHT); frame.settitle("two rectangles"); frame.setdefaultcloseoperation(jframe.exit_on_close); 2. Istanzia una componente: RectangleComponent component = new RectangleComponent(); 3. Aggiungi la componente al frame frame.add(component); 4. Rendi il frame visibile frame.setvisible(true)

Applet Le applet sono programmi che vengono eseguiti in un web browser (analogo di JComponent) Per implementare una applet: import javax.swing.japplet; public class MyApplet extends JApplet { public void paint(graphics g) { // Recover Graphics2D Graphics2D g2 = (Graphics2D) g; // Drawing instructions go here... } }

Applet Rispetto alle componenti: 1. Si estende JApplet invece di JComponent 2. Il codice per tracciare il disegno viene messo nel metodo paint anzicché paintcomponent Per eseguire una applet, si deve scrivere un file HTML con un tag applet

File RectangleApplet.java 01: import java.awt.graphics; 02: import java.awt.graphics2d; 03: import java.awt.rectangle; 04: import javax.swing.japplet; 05: 06: /** 07: An applet that draws two rectangles. 08: */ 09: public class RectangleApplet extends JApplet 10: { 11: public void paint(graphics g) 12: { 13: // Prepare for extended graphics 14: Graphics2D g2 = (Graphics2D) g;

File RectangleApplet.java 15: 16: // Construct a rectangle and draw it 17: Rectangle box = new Rectangle(5, 10, 20, 30); 18: g2.draw(box); 19: 20: // Move rectangle 15 units to the right and 25 units // down 21: box.translate(15, 25); 22: 23: // Draw moved rectangle 24: g2.draw(box); 25: } 26: } 27:

Applet Un file HTML può avere applet multiple si aggiunge un tag applet per ogni applet Si possono visualizzare le applet con un applet viewer o con un browser con Java abilitato appletviewer RectangleApplet.html File RectangleApplet.html: <applet code="rectangleapplet.class" width="300" height="400" > </applet>

Output con appletviewer

Applet con browser File RAppletExplained.html: <html> <head> <title>two rectangles</title> </head> <body> <p>here is my <i>first applet</i>:</p> <applet code="rectangleapplet.class" width="300" height="400"> </applet> </body> </html>

Forme grafiche Le classi Rectangle, Ellipse2D.Double, e Line2D.Double descrivono forme grafiche Classi.Float esprimono coordinate in float Queste classi.double e.float sono classi interne (static) di Ellipse2D e Line2D fare attenzione con l istruzione import: import java.awt.geom.ellipse2d; // no.double Una forma deve essere istanziata e tracciata Ellipse2D.Double ellipse = new Ellipse2D.Double(x, y, width, height); g2.draw(ellipse);

Classi interne static (nested top-level class) Sono definite come membri della classe (fuori dai metodi) e si usa lo specificatore static Rispetto alle classi interne non static non devono essere istanziate necessariamente in un oggetto della classe ospitante Possono essere istanziate in altre classi indipendentemente dalla classe in cui sono definite (da questo punto di vista sono classi a tutti gli effetti) Sono un modo conveniente per raggruppare classi tra di loro collegate senza creare un nuovo package Es.: Ellipse2D.Double e Ellipse2D.Float

Significato dei parametri di Ellipse

Istanziare oggetti Line2D Passiamo coordinate estremi: Line2D.Double segment = new Line2D.Double(x1, y1, x2, y2); oppure gli estremi stessi: Point2D.Double from = new Point2D.Double(x1, y1); Point2D.Double to = new Point2D.Double(x2, y2); Line2D.Double segment = new Line2D.Double(from, to);

Tracciare oggetti di tipo String g2.drawstring("message", 50, 100); Coordinate punto base (entrambe int oppure float)

Colori Colori standard Color.BLUE, Color.RED, Color.PINK, etc. (costanti) Altri colori si possono ottenere combinando rosso, verde e blu dando per ognuno dei valori compresi tra 0.0F e 1.0F Ad es.: Color magenta = newcolor(1.0f, 0.0F, 1.0F); Stabilire i colori in un contesto grafico g2.setcolor(magenta); Color è usato quando si tracciano e riempiono forme grafiche g2.fill(rectangle); // riempe con il colore corrente

Disegnare figure complesse Consiglio: definire una classe per ogni forma class Car {... public void disegna(graphics2d g2) { // Drawing instructions... } } Per figure complesse determinare le coordinate con disegni su foglio quadrettato

Disegno auto

Applicazione grafica Disegna due auto: una nell angolo in alto a sinistra l altra nell angolo in basso a destra Calcola la posizione in basso a destra nel metodo paintcomponent: int x = getwidth() - 60; int y = getheight() - 30; Car car2 = new Car(x, y); getwidth e getheight sono invocate sull oggetto che esegue paintcomponent se la taglia della finestra è modificata, paintcomponent è invocata nuovamente e la posizione delle auto è ricalcolata

Output desiderato

File CarComponent.java 01: import java.awt.graphics; 02: import java.awt.graphics2d; 03: import javax.swing.jcomponent; 04: 05: // This component draws two car shapes. 06: public class CarComponent extends JComponent 07: { 08: public void paintcomponent(graphics g) 09: { 10: Graphics2D g2 = (Graphics2D) g; 11: Car car1 = new Car(0, 0); 12: 13: intx = getwidth() - Car.WIDTH; 14: inty = getheight() - Car.HEIGHT; 15: 16: Car car2 =newcar(x, y); 17: 18: car1.disegna(g2); 19: car2.disegna(g2); 20: } 21: }

File Car.java 01: import java.awt.graphics2d; 02: import java.awt.rectangle; 03: import java.awt.geom.ellipse2d; 04: import java.awt.geom.line2d; 05: import java.awt.geom.point2d; 06: 07: /** 08: A car shape that can be positioned anywhere on the screen. 09: */ 10: public class Car 11: { 12: /** 13: Constructs a car with a given top left corner 14: @param x the x coordinate of the top left corner 15: @param y the y coordinate of the top left corner 16: */

File Car.java 17: public Car(int x, int y) 18: { 19: xleft = x; 20: ytop = y; 21: } 22: 23: /** 24: Draws the car. 25: @param g2 the graphics context 26: */ 27: public void disegna(graphics2d g2) 28: { 29: Rectangle body 30: = new Rectangle(xLeft, ytop + 10, 60, 10); 31: Ellipse2D.Double fronttire 32: = new Ellipse2D.Double(xLeft + 10, ytop + 20, 10, 10); 33: Ellipse2D.Double reartire

File Car.java 34: = new Ellipse2D.Double(xLeft + 40, ytop + 20, 10, 10); 35: 36: // The bottom of the front windshield 37: Point2D.Double r1 38: = new Point2D.Double(xLeft + 10, ytop + 10); 39: // The front of the roof 40: Point2D.Double r2 41: = new Point2D.Double(xLeft + 20, ytop); 42: // The rear of the roof 43: Point2D.Double r3 44: = new Point2D.Double(xLeft + 40, ytop); 45: // The bottom of the rear windshield 46: Point2D.Double r4 47: = new Point2D.Double(xLeft + 50, ytop + 10); 48: 49: Line2D.Double frontwindshield 50: = new Line2D.Double(r1, r2);

File Car.java 51: Line2D.Double rooftop 52: = new Line2D.Double(r2, r3); 53: Line2D.Double rearwindshield 54: = new Line2D.Double(r3, r4); 55: 56: g2.draw(body); 57: g2.draw(fronttire); 58: g2.draw(reartire); 59: g2.draw(frontwindshield); 60: g2.draw(rooftop); 61: g2.draw(rearwindshield); 62: } 63: 64: public static int WIDTH = 60; 65: public static int HEIGHT = 30; 66: private int xleft; 67: private int ytop; 68: }

File CarViewer.java 01: import javax.swing.jframe; 02: 03: public class CarViewer 04: { 05: public static void main(string[] args) 06: { 07: JFrame frame = new JFrame(); 08: 09: final int FRAME_WIDTH = 300; 10: final int FRAME_HEIGHT = 400; 11: 12: frame.setsize(frame_width, FRAME_HEIGHT); 13: frame.settitle("two cars"); 14: frame.setdefaultcloseoperation(jframe.exit_on_close); 15: 16: CarComponent component = new CarComponent(); 17: frame.add(component); 18: 19: frame.setvisible(true); 20: } 21:}

Disegnare forme grafiche Rectangle leftrectangle = new Rectangle(100, 100, 30, 60); Rectangle rightrectangle = new Rectangle(160, 100, 30, 60); Line2D.Double topline = new Line2D.Double(130, 100, 160, 100); Line2D.Double bottomline = new Line2D.Double(130, 160, 160, 160);

Ricevere testo in input Un applicazione grafica può ricevere testo in input classe JOptionPane Il metodo showinputdialog visualizza un prompt e attende l input dall utente restituisce la stringa digitata dall utente String input = JOptionPane.showInputDialog("Enter x"); double x = Double.parseDouble(input);

Esercizio Si vuole generare un quadrato del colore specificato dall utente al centro del frame

File ColorViewer.java 01: import java.awt.color; 02: import javax.swing.jframe; 03: import javax.swing.joptionpane; 04: 05: public class ColorViewer 06: { 07: public static void main(string[] args) 08: { 09: JFrame frame = new JFrame(); 10: 11: final int FRAME_WIDTH = 300; 12: final int FRAME_HEIGHT = 400; 13: 14: frame.setsize(frame_width, FRAME_HEIGHT); 15: frame.setdefaultcloseoperation(jframe.exit_on_close); 16: 17: String input; 18:

File ColorViewer.java 19: // Ask the user for red, green, blue values 20: 21: input = JOptionPane.showInputDialog("red:"); 22: double red = Double.parseDouble(input); 23: 24: input = JOptionPane.showInputDialog("green:"); 25: double green = Double.parseDouble(input); 26: 27: input = JOptionPane.showInputDialog("blue:"); 28: double blue = Double.parseDouble(input); 29: 30: Color fillcolor = new Color( 31: (float) red, (float) green, (float) blue); 32: ColoredSquareComponent component 33: = new ColoredSquareComponent(fillColor); 34: frame.add(component); 35: 36: frame.setvisible(true); 37: } 38: }

File ColoredSquareComponent.java 01: import java.awt.color; 02: import java.awt.graphics; 03: import java.awt.graphics2d; 04: import java.awt.rectangle; 05: import javax.swing.jcomponent; 06: 07: /** 08: A component that shows a colored square. 09: */ 10: public class ColoredSquareComponent extends JComponent 11: { 12: /** 13: Constructs a component that shows a colored square. 14: @param acolor the fill color for the square 15: */ 16: public ColoredSquareComponent(Color acolor)

File ColoredSquareComponent.java 17: { 18: fillcolor = acolor; 19: } 20: 21: public void paintcomponent(graphics g) 22: { 23: Graphics2D g2 = (Graphics2D) g; 24: 25: // Select color into graphics context 26: 27: g2.setcolor(fillcolor); 28: 29: // Construct and fill a square whose center is 30: // the center of the window 31:

File ColoredSquareComponent.java 32: final int SQUARE_LENGTH = 100; 33: 34: Rectangle square = new Rectangle( 35: (getwidth() - SQUARE_LENGTH) / 2, 36: (getheight() - SQUARE_LENGTH) / 2, 37: SQUARE_LENGTH, 38: SQUARE_LENGTH); 39: 40: g2.fill(square); 41: } 42: 43: private Color fillcolor; 44: }

Informazione visuale e numerica Calcola l intersezione tra un cerchio e una linea verticale Il cerchio ha raggio r = 100 e centro (a, b) = (100, 100) La linea ha un valore costante x

Informazione visuale e numerica Calcola i punti di intersezione: Equazione di un cerchio di raggio r e centro (a, b) Se x è nota, possiamo calcolare y:

Informazione visuale e numerica Si può calcolare facilmente in Java: double root = Math.sqrt(r * r - (x - a) * (x - a)); double y1 = b + root; double y2 = b - root; Traccia il cerchio, la linea e i punti di intersezione calcolati I risultati visuali e numerici dovrebbero essere consistenti

Intersezione di una linea e un cerchio

File IntersectionViewer.java 01: import javax.swing.jframe; 02: import javax.swing.joptionpane; 03: 04: public class IntersectionViewer 05: { 06: public static void main(string[] args) 07: { 08: JFrame frame = new JFrame(); 09: 10: final int FRAME_WIDTH = 300; 11: final int FRAME_HEIGHT = 400; 12: 13: frame.setsize(frame_width, FRAME_HEIGHT); 14: frame.setdefaultcloseoperation(jframe.exit_on_close); 15:

File IntersectionViewer.java 16: String input = JOptionPane.showInputDialog("Enter x"); 17: double x = Double.parseDouble(input); 18: IntersectionComponent component 19: = new IntersectionComponent(x); 20: frame.add(component); 21: 22: frame.setvisible(true); 23: } 24: }

File IntersectionComponent.java 01: import java.awt.graphics; 02: import java.awt.graphics2d; 03: import java.awt.geom.ellipse2d; 04: import java.awt.geom.line2d; 05: import javax.swing.jcomponent; 06: 07: /** 08: A component that computes and draws the intersection points 09: of a circle and a line. 10: */ 11: public class IntersectionComponent extends JComponent 12: { 13: /** 14: Constructs the component from a given x-value for the line 15: @param anx the x-value for the line (between 0 and 200) 16: */

File IntersectionComponent.java 17: public IntersectionComponent(double anx) 18: { 19: x = anx; 20: } 21: 22: public void paintcomponent(graphics g) 23: { 24: Graphics2D g2 = (Graphics2D) g; 25: 26: // Draw the circle 27: 28: final double RADIUS = 100; 29: 30: Ellipse2D.Double circle 31: = new Ellipse2D.Double(0, 0, 2 * RADIUS, 2 * RADIUS); 32: g2.draw(circle); 33: 34: // Draw the vertical line 35:

File IntersectionComponent.java 36: Line2D.Double line 37: = new Line2D.Double(x, 0, x, 2 * RADIUS); 38: g2.draw(line); 39: 40: // Compute the intersection points 41: double a = RADIUS; 42: double b = RADIUS; 43: 44: double root = Math.sqrt(RADIUS * RADIUS - (x a) * (x-a)); 45: double y1 = b + root; 46: double y2 = b - root; 47: 48: // Draw the intersection points 49: LabeledPoint p1 = new LabeledPoint(x, y1); 50: LabeledPoint p2 = new LabeledPoint(x, y2); 51: 52: p1.disegna(g2); 53: p2.disegna(g2); 54: } 55: 56: private double x; 57: }

File LabeledPoint.java 01: import java.awt.graphics2d; 02: import java.awt.geom.ellipse2d; 03: 04: /** 05: A point with a label showing the point's coordinates. 06: */ 07: public class LabeledPoint 08: { 09: /** 10: Construct a labeled point. 11: @param anx the x coordinate 12: @param ay the y coordinate 13: */ 14: public LabeledPoint(double anx, double ay) 15: { 16: x = anx; 17: y = ay; 18: }

File LabeledPoint.java 19: 20: /** 21: Draws the point as a small circle with a coordinate label. 22: @param g2 the graphics context 23: */ 24: public void disegna(graphics2d g2) 25: { 26: // Draw a small circle centered around (x, y) 27: 28: Ellipse2D.Double circle = new Ellipse2D.Double( 29: x - SMALL_CIRCLE_RADIUS, 30: y - SMALL_CIRCLE_RADIUS, 31: 2 * SMALL_CIRCLE_RADIUS, 32: 2 * SMALL_CIRCLE_RADIUS); 33: 34: g2.draw(circle); 35: 36: // Draw the label

File LabeledPoint.java 37: 38: String label = "(" + x + "," + y + ")"; 39: 40: g2.drawstring(label, (float) x, (float) y); 41: } 42: 43: private static final double SMALL_CIRCLE_RADIUS = 2; 44: 45: private double x; 46: private double y; 47: }