2010-07-26 24 views
5

He creado una forma personalizada, esencialmente es una colección de cuatro objetos Arc2D.Java - Rellenar una forma personalizada

Cuando se dibujan estos arcos forman lo que podría considerarse una forma de estrella de cuatro puntos redondeados, algo así como un trébol. Donde un arco termina, el otro comienza. Ellos forman un cuadrado en el centro. Así que imagínense, tomando un cuadrado y dibujando semicírculos en cada lado.

Puedo dibujar esta forma en un objeto Graphics2D, pero cuando la llene, solo llenará los arcos y no el cuadrado central. Llenar este cuadrado interno es mi problema.

He implementado el método getPathIterator(), a continuación. También implementé los métodos . Pero todavía solo llenará los arcos.

Traté de agregar un Rectangle. Al rellenar la forma, el rectángulo/cuadrado se rellenaría correctamente, sin embargo, también dibujaría el rectángulo, lo que obviamente debería esperarse, pero definitivamente no es el resultado deseado.

Entonces, ¿alguien tiene alguna idea sobre cómo "llenar" tal forma?

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

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

    return gp.getPathIterator(at); 
} 
+0

¿Cuál es el tipo de cierre de sus instancias 'Arc2D'? – trashgod

Respuesta

4

Siempre que creo una forma, siempre creo un objeto Path2D.Double. Luego, uso moveTo para llegar a la ubicación de inicio, y una combinación de lineTo() y curveTo() para moverme por la ruta. Luego, cuando termine, llamo a closePath(). Siempre ha llenado correctamente.

No tengo ninguna experiencia con la implementación de getPathIterator, pero me doy cuenta de que no se hace closePath(). No sé si eso es necesario o no, pero tengo ganas de que mi enfoque funcione.

Aquí es un ejemplo que viene a llenar un rectángulo redondeado:

 
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

Voy a darle una oportunidad. Estaba llamando a closePath() pero descubrí que acaba de cerrar el último arco. – abrightwell

+0

Esto definitivamente resuelve el problema de relleno. Está resultando un poco difícil obtener exactamente la forma que quiero, pero ese es el cálculo del problema de la curva. – abrightwell

+0

Requiere mucho trabajo, pero le da exactamente lo que quiere. ¡Gracias! –

0

cambiar la regla de arrollamiento para el GeneralPath

gp.setWindingRule(GeneralPath.WIND_NON_ZERO); 
Cuestiones relacionadas