PDA

View Full Version : [java]GeneralPath e aree


diadhuit
27-03-2007, 10:51
Ciao!
Nello scorso compito il docente aveva chiesto di disegnare questa stella solamente con un GeneralPath.
http://kixkix84.googlepages.com/stella.jpg
Io ho scritto il codice seguente che disegna solamente l'ellisse, anche se non capisco il perché. Inoltre non mi è chiaro il ruolo del valore booleano in append.

GeneralPath stella = new GeneralPath();
stella.moveTo (-100, 0);
stella.lineTo (-3, -3);
stella.lineTo (0, -100);
stella.lineTo (3, -3);
stella.lineTo (100, 0);
stella.lineTo (3,3);
stella.lineTo (0, 100);
stella.lineTo (-3, 3);
stella.append(new Ellipse2D.Double(-100,-100, 200,200), true);
stella.closePath();

PGI-Bis
27-03-2007, 14:54
GeneralPath può contenere più figure geometriche separate.

moveTo -> punto di partenza
line ...line ...line
close -> fine della prima parte
moveTo -> inizia un'altra parte, separata dalla prima
line...line...line
close -> fine della seconda
eccetera

Il valore boolean che usi in append stabilisce se la figura aggiunta deva essere connessa all'ultimo segmento presente nel GeneralPath oppure no.

La ragione per cui disegna solo l'ellisse dipende dalla figura e dalla norma di riempimento. La norma di riempimento è ciò che determina se una parte della figura è da considerarsi interna o esterna alla figura. Il metodo fill(Shape) colora le parti interne e non colora le parti esterne. Per farla breve, la tua stella è:

GeneralPath stella = new GeneralPath(Path2D.Float.WIND_EVEN_ODD);
stella.moveTo (-100, 0);
stella.lineTo (-3, -3);
stella.lineTo (0, -100);
stella.lineTo (3, -3);
stella.lineTo (100, 0);
stella.lineTo (3,3);
stella.lineTo (0, 100);
stella.lineTo (-3, 3);
stella.closePath();
stella.append(new Ellipse2D.Double(-100,-100, 200,200), false);
stella.append(new Ellipse2D.Double(-104, -104, 208, 208), false);

Le due ellissi fanno sì che, per la norma WIND_EVEN_ODD, la superficie tra loro compresa sia considerata interna alla figura, la superficie tra l'ellissi più interna e la stella sia considerata esterna e, di conseguenza, la superficie compresa nella stella interna.

diadhuit
27-03-2007, 15:14
Grazie mille!
Solo un'ultima cosa...
Mi potresti spiegare meglio la norma WIND_EVEN_ODD, soprattutto per quale motivo si comporta in questo modo? Da cosa si capisce cosa è interno e cosa è esterno?

PGI-Bis
27-03-2007, 15:27
Tracci una linea che interseca la figura a partire da un punto a piacere. Considera quel punto. Se il numero di interesezioni della linea con la figura a partire dal punto verso l'esterno è dispari allora il punto si trova all'interno della figura. Altrimenti è all'esterno.

O una cosa così :D, adesso non ricordo esattamente.