2010-05-28 5 views
2

Si j'ai un QuadCurve comme celui-ci (+ = nœud):Java2D: Remplir un polygone arrondi convexe (de QuadCurves)

+   + 
\  ./ 
    +--⁻⁻ 

Et je remplirai en Java 2D le résultat est quelque chose comme ceci: (x = couleur)

+xxxxxxxxx+ 
\xxxxxx./ 
    +--⁻⁻ 

Mais je veux colorer l'autre côté:

+   + 
x\  ./x 
xxx +--⁻⁻xx 
xxxxxxxxxxx 

Ce succe eds en dessinant un rectangle autour de la courbe dans la couleur Je veux colorier l'autre côté et ensuite remplir la courbe avec la couleur de fond.

Mais cela n'est pas suffisant pour remplir un polygone convexe arrondi (basé sur QuadCurves). Dans le cas de quelques coordonnées pour les rectangles (comme expliqué dans l'astuce que j'ai utilisée), chevauchent d'autres parties du polygone. Voici deux images (la zone verte est mon polygone):

alt text http://img204.imageshack.us/img204/7823/convexpolygon.pngalt text http://img708.imageshack.us/img708/3669/convexpolygon2.png

Alors, la question est simple: « Comment puis-je colorer une construction de forme de courbes? »
Mais à la réponse ne sera pas simple je pense ...

Un conseil serait très très apprécié.
Merci d'avance.

Peut-être que je vais faire une prime pour cette question si je ne reçois pas de réponse

Répondre

2

Choisissez un point connu pour être à l'intérieur du Polygone. Connaître la "couleur de la limite" (dans ce cas, le noir)

recurrsiveFill(Pixel p, Color fill, Color bound) { 
    p.setColor(fill); 
    if(p.left.color != bound && p.left.color != fill) 
     recurrsiveFill(p.left , fill, bound); 
    if(p.right.color != bound && p.right.color != fill) 
     recurrsiveFill(p.right, fill, bound); 
    if(p.up.color != boun d&& p.up.color != fill) 
     recurrsiveFill(p.up, fill, bound); 
    if(p.down.color != bound && p.down.color != fill) 
     recurrsiveFill(p.down, fill, bound); 
} 

Vous pouvez l'adapter si nécessaire pour répondre à vos besoins spécifiques.

Cela fonctionne pour tout remplissage pour une forme complètement délimitée. Vous voudrez également incorporer des conditions spéciales (bords de l'image, par exemple).

+0

C'est en effet un moyen possible! Mais j'ai besoin de ça pour un match. Donc, je me demande si c'est assez rapide pour rendre le jeu à 40 images par seconde. –

+0

Assurez-vous que je vais tester cela! –

+1

Eh bien Martijn, sauf si j'ai fait une sorte d'erreur de débutant (ce qui est possible, je ne l'ai pas passé en revue), il devrait être O (n) en termes de nombre de pixels que vous devez colorier, Je pense que tu deviendras meilleur que ça. Il pourrait y avoir plus d'implication si vous faites une gamme de couleurs comme limite. . . . . Une autre chose à garder à l'esprit est pourquoi vous le faites de cette façon, et si peut-être il y a une meilleure façon de faire les choses. Est-il possible de pré-rendre ces courbes et de les charger à partir d'une image enregistrée? Les optimisations comme ça sont les meilleures! – corsiKa

Questions connexes