2010-07-26 21 views
5

J'ai créé une forme personnalisée, essentiellement une collection de quatre objets Arc2D. Lorsque ces arcs sont dessinés, ils forment ce qui pourrait être considéré comme une forme d'étoile arrondie à quatre points, un peu comme un trèfle. Lorsqu'un arc se termine, l'autre commence. Ils forment un carré au centre. Alors imaginez, prenez un carré et dessinez des demi-cercles de chaque côté.Java - Remplissage d'une forme personnalisée

Je peux dessiner cette forme sur un objet Graphics2D, mais lorsque je la remplis, elle ne remplit que les arcs et non le carré central. Remplir ce carré interne est mon problème.

J'ai implémenté la méthode getPathIterator() ci-dessous. J'ai également implémenté les méthodes . Mais cela ne fera que remplir les arcs.

J'ai essayé d'ajouter un Rectangle. Lors du remplissage de la forme, le rectangle/carré sera rempli correctement, mais il dessine aussi le rectangle, ce qui devrait évidemment être attendu, mais certainement pas le résultat souhaité.

Alors, est-ce que quelqu'un a des idées sur la façon de "remplir" une telle forme?

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

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

    return gp.getPathIterator(at); 
} 
+0

Quel est le type de fermeture de vos instances de 'Arc2D'? – trashgod

Répondre

4

Chaque fois que je crée une forme, je crée toujours un objet Path2D.Double. Ensuite, j'utilise moveTo pour arriver à l'emplacement de départ, et une combinaison de lineTo() et curveTo() pour se déplacer dans le chemin. Ensuite, quand j'ai fini, j'appelle closePath(). Il a toujours rempli correctement.

Je n'ai aucune expérience de l'implémentation de getPathIterator, mais je remarque que vous ne faites pas de closePath(). Je ne sais pas si c'est nécessaire ou non, mais j'ai vraiment l'impression que mon approche fonctionnera.

Voici un exemple qui remplit un rectangle arrondi:

 
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

Je vais essayer. J'appelais closePath() mais j'ai trouvé qu'il fermait juste le dernier arc. – abrightwell

+0

Cela résout définitivement le problème de remplissage. Il s'avère un peu difficile d'obtenir exactement la forme que je veux, mais c'est le calcul du problème de la courbe. – abrightwell

+0

Nécessite beaucoup de travail, mais vous donne exactement ce que vous voulez. Merci! –

0

Modifier la règle d'enroulement pour la GeneralPath

gp.setWindingRule(GeneralPath.WIND_NON_ZERO);