2010-07-26 8 views
5

Ho creato una forma personalizzata, essenzialmente si tratta di una raccolta di quattro oggetti Arc2D.Java - Riempimento di una forma personalizzata

Quando questi archi vengono disegnati formano ciò che potrebbe essere considerato una forma a stella arrotondata a quattro punte, un po 'come un trifoglio. Dove finisce un arco, inizia l'altro. Formano un quadrato al centro. Quindi immagina, prendendo un quadrato e disegnando semicerchi su ogni lato.

Posso disegnare questa forma su un oggetto Graphics2D, ma quando lo riempio, riempirà solo gli archi e non il quadrato centrale. Riempire questo quadrato interno è un mio problema.

Ho implementato il metodo getPathIterator(), di seguito. Ho implementato anche i metodi . Ma riempirà solo gli archi.

Ho provato ad aggiungere un Rectangle. Quando si riempie la forma, il rettangolo/quadrato sarà riempito correttamente, tuttavia disegna anche il rettangolo, che ovviamente dovrebbe essere previsto, ma sicuramente non il risultato desiderato.

Quindi, qualcuno ha qualche idea su come "riempire" una tale forma?

public PathIterator getPathIterator(AffineTransform at) { 
    GeneralPath gp = new GeneralPath 

    for (Arc2D arcs : this.arcs) { 
     gp.append(arc, false); 
    } 

    return gp.getPathIterator(at); 
} 
+0

Qual è il tipo di chiusura delle vostre istanze 'Arc2D'? – trashgod

risposta

4

Ogni volta che creo una forma, creo sempre un oggetto Path2D.Double. Quindi, utilizzo moveTo per raggiungere la posizione di partenza e una combinazione di lineTo() e curveTo() per spostarmi nel percorso. Quindi, quando ho finito, chiamo closePath(). Ha sempre riempito correttamente.

Non ho alcuna esperienza con l'implementazione di getPathIterator, ma noto che non si esegue un closePath(). Non so se è necessario o meno, ma ho l'impressione che il mio approccio funzionerà.

Ecco un esempio che riempie un rettangolo arrotondato:

 
double width = 300; 
double height = 400; 
Path2D.Double path = new Path2D.Double(); 
path.moveTo(0.0, 8.0); 
path.curveTo(0.0, 0.0, 8.0, 0.0, 8.0, 0.0); 
path.lineTo(width - 8.0, 0.0); 
path.curveTo(width, 0.0, width, 8.0, width, 8.0); 
path.lineTo(width, height - 8.0); 
path.curveTo(width, height, width - 8.0, height, width - 8.0, height); 
path.lineTo(8.0, height); 
path.curveTo(0.0, .height, 0.0, height - 8.0, 0, height - 8.0); 
path.closePath(); 
g2.fill(path); 
+0

Ho intenzione di fare un tentativo. Stavo chiamando closePath() ma ho scoperto che ha appena chiuso l'ultimo arco. – abrightwell

+0

Questo risolve definitivamente il problema di riempimento. Si sta dimostrando un po 'difficile ottenere esattamente la forma che voglio, ma questo è il calcolo del problema della curva. – abrightwell

+0

Richiede molto lavoro, ma ti dà esattamente quello che vuoi. Grazie! –

0

cambiare la regola di avvolgimento per la GeneralPath

gp.setWindingRule(GeneralPath.WIND_NON_ZERO); 
Problemi correlati