Stima del valore di π, usando classi geometriche

Sappiamo che il numero π è proporzionale al rapporto tra l'area di un cerchio inscritto in un quadrato e l'area del quadrato stesso.
È allora possibile stimare (in modo grossolano) il valore di π generando punti in posizione casuale interni al quadrato, e contando quanti di questi sono contenuti nel cerchio. Se la distribuzione di questi punti è sufficientemente uniforme, allora il rapporto tra il numero di punti nel cerchio e il numero di punti generati fornisce una stima di π /4. All'aumentare del numero di punti generati il valore trovato dovrebbe tendere a π.

Guida

Soluzione

Si raccomanda di leggere la soluzione StimaPiGreco.java solo dopo aver cercato di risolvere il problema autonomamente.

Gestione di oggetti geometrici

Osservare il funzionamento del programma FormeGeometriche.java. Sono utilizzati alcuni metodi static definiti in InputForme.java, che permettono di creare oggeti geometrici inserendone le coordinate da tastiera.

Estensione 1

Aggiungere a FormeGeometriche.java del codice che verifica quali delle figure geometriche inserite contengono il punto p. La classe Rectangle2D.Double possiede sia un metodo public boolean contains(double x, double y), sia un metodo public boolean contains(Point2D p), ereditati dalle sue superclassi (si vedano nella documentazione Java i metodi che vengono inherited from class ...). Lo stesso vale per la classe Ellipse2D.Double, che eredita metodi analoghi dalle proprie superclassi.

Estensione 2

Invece di utilizzare variabili distinte per memorizzare i riferimenti ai Rectangle2D.Double, definire ed allocare un array di due elementi, e sostituire tutte le ripetizioni di codice analogo con dei cicli. Suggerimento

Estensione 3

Una volta risolta l'estensione precedente, aumentare a 4 il numero di rettangoli da inserire, e trovare tutte le coppie di rettangoli che hanno tra loro intersezione non vuota. Utilizzare il metodo intersects (attenzione alla 's' finale) ereditato dalla classe RectangularShape. Ogni volta che si trova una coppia di rettangoli che presenta intersezione non vuota bisogna visualizzare un messaggio del tipo (assumendo che i rettangoli di posto 1 e 3 si intersechino) "Il rettangolo 1 interseca il rettangolo 3", seguito se si vuole dalle coordinate dei due rettangoli.

Per risolvere questo punto è opportuno scrivere un metodo static, e poi richiamarlo, che riceve come parametro l'array di rettangoli, e provvede a stampare i messaggi che segnalano tutte le intersezioni. Il metodo deve confrontare:

preferibilmente scrivendo due cicli annidati, e facendo in modo che funzioni per array di lunghezza qualsiasi.