2011-02-16 37 views
5

quiero llamar la siguiente polígono rojo: enter image description hereWPF: cómo dibujar este polígono?

El problema es si uso somethign así:

Polygon poly = new Polygon(); 
poly.StrokeThickness = 2; 
poly.Stroke = Brushes.Black; 
PointCollection points = new PointCollection(); 

for (int i = 0; i < this.NumberOfMetrics; i++) 
{ 
    points.Add(new Point(MAX_VALUE - this.Metrics[n, i] * Math.Cos(DegreeToRadian(i * (360/(this.NumberOfMetrics)))), MAX_Y_GUI - this.Metrics[n, i] * Math.Sin(DegreeToRadian(i * (360/(this.NumberOfMetrics)))))); 
}  
poly.Points = points; 

Entonces el polígono siempre está "llena" y en el ejemplo anterior, el rojo y el polígono verde está dibujado.

Ya he intentado agregar los 4 puntos "internos" a PointCollection, pero no se dibuja nada. Entonces, ¿cómo puedo lograr eso?

Probé la solución propuesta por David:

for (int n = 0; n < this.NumberOfRevisions; n++) 
      { 
       Path path = new Path(); 

       CombinedGeometry geometry = new CombinedGeometry(); 
       geometry.GeometryCombineMode = GeometryCombineMode.Union; 

       Polygon poly = new Polygon(); 
       PointCollection points = new PointCollection(); 

       for (int i = 0; i < this.NumberOfMetrics; i++) 
       { 
        points.Add(new Point(MAX_VALUE - this.Metrics[n, i] * Math.Cos(DegreeToRadian(i * (360/(this.NumberOfMetrics)))), MAX_Y_GUI - this.Metrics[n, i] * Math.Sin(DegreeToRadian(i * (360/(this.NumberOfMetrics)))))); 
       } 

       poly.Points = points; 

       geometry.Geometry1 = poly.RenderedGeometry; 


       geometry.Geometry2 = poly.RenderedGeometry; 


       path.Data = geometry; 

       polygons.Add(poly); 

       paths.Add(path); 
      } 

Esto es sólo una prueba pero thougth así que debería obtener el mismo resultado que antes, pero no se dibuja nada. ¿Hay algún problema con mi código?

+0

¿Ha intentado dibujar primero el polígono rojo y luego dibujar el polígono verde? Además, ¿dónde cambias el color para que uno sea rojo y el otro verde? – dthorpe

+0

Creo que un pequeño contexto en cuanto a lo que esta información puede ayudar. – vcsjones

+0

@dthorpe sí Hice esto y luego funciona, ya que el segundo polígono está encima del primero. Pero uno de los colores es transparente, ya no funciona. –

Respuesta

5

Si usted quiere tener 2 formas independientes, con la posibilidad de la verde a ser transparente como ha afirmado en su comentario, la mejor manera de hacerlo es utilizar una geometría combinada:

http://msdn.microsoft.com/en-en/library/ms653071%28v=VS.85%29.aspx

con la ayuda de esto, primero puede crear la geometría verde, luego la roja al restar el verde (o una copia) del rojo para crear el agujero.

Así que, básicamente:

  1. forma rojo, verde NORMAL forma
  2. encima de él, Llanura forma verde
  3. Restar o copia de la misma a partir de la forma roja >> agujero en forma de color rojo

de esta manera obtienes el efecto que deseas

más fácil de hacer en Xaml, un poco más complicado en C# pero sti ll factible

Editar: establezca la geometría combinada, según datos de un camino:

Path myPath = new Path(); 
CombinedGeometry myCombinedGeometry = new CombinedGeometry() 

// here you set the combinedGeometry's geometries to create the shape you want 

myPath.Data = myCombinedGeometry; 

myGrid.Children.Add(myPath); 

dicho sea de paso, el camino será el lugar en el que se establece el atributo Relleno/Reborde para los colores, no las geometrías interiores . (Ver los ejemplos en XAML en el enlace de arriba, básicamente, sólo tiene que traducir el código en C#)

Edit2:

no se olvide de fijar un relleno de la Ruta:

for (int n = 0; n < this.NumberOfRevisions; n++) 
{ 
    CombinedGeometry geometry = new CombinedGeometry() { GeometryCombineMode = GeometryCombineMode.Union }; 

    PointCollection points = new PointCollection(); 

    for (int i = 0; i < this.NumberOfMetrics; i++) 
    { 
     points.Add(new Point(MAX_VALUE - this.Metrics[n, i] * Math.Cos(DegreeToRadian(i * (360/(this.NumberOfMetrics)))), MAX_Y_GUI - this.Metrics[n, i] * Math.Sin(DegreeToRadian(i * (360/(this.NumberOfMetrics)))))); 
    } 

    Polygon poly = new Polygon(); 
    poly.Points = points; 

    geometry.Geometry1 = poly.RenderedGeometry; 
    geometry.Geometry2 = poly.RenderedGeometry; 

    polygons.Add(poly); 

    paths.Add(path = new Path() { Data = geometry, Fill = Brushes.Red, Stroke = Brushes.Transparent }); 
} 
+0

Muchas gracias, ya pensé en esta solución, pero tengo un problema ...¿Cómo puedo agregar este objeto Geometry a mi UIElement (por ejemplo, una grilla) porque Grid.Children.Add (Geometry) no está permitido? – RoflcoptrException

+1

tiene que crear un objeto Path y establecer la geometría como datos de la ruta, vea mi Editar – David

+0

Gracias, lo intenté, pero de alguna manera todavía tengo problemas. Por lo tanto, edité mi pregunta. – RoflcoptrException

Cuestiones relacionadas