Pregunta

¿Existe una forma automática de obtener todos los puntos de un trazo de elipse, sin los puntos de relleno?

¿Fue útil?

Solución

Al usar Reflector descubrí que hay un método GetPointList () en la clase EllipseGeometry, desafortunadamente es privado. Tal vez puedas invocarlo a través de la reflexión, pero eso suena como un truco muy malo ... Veré si encuentro otra forma ...

Otros consejos

En WPF no hay "Puntos" reales en una geometría, es infinitamente suave. Esto se puede ver ampliando una elipse. Puede ir a un zoom de 1,000,000x y aún puede ver la curvatura y sin puntos.

Dado que las formas WPF no están compuestas de puntos, su pregunta puede ser interrelacionada de varias maneras. Puede estar buscando cualquiera de estos:

  • Una lista de puntos que se aproxima al límite de la elipse (aproximación de polilínea)
  • Un conjunto de píxeles cubiertos por la elipse, incluido el relleno
  • Un conjunto de píxeles cubiertos por el borde de la elipse

Aquí están las soluciones en cada caso:

Si está buscando una aproximación de la elipse como puntos discretos (es decir, una versión de línea punteada que se parece a una elipse), use este código:

  PolyLineSegment segment = 
    ellipse.DefiningGeometry
      .GetFlattenedPathGeometry(1.0, ToleranceType.Absolute)
      .Figures[0].Segments[0] as PolyLineSegment;

  foreach(Point p in segment.Points)
    ...

Si está buscando los píxeles afectados, necesitará RenderTargetBitmap:

  RenderTargetBitmap rtb =
    new RenderTargetBitmap(width, height, 96, 96, PixelFormat.Gray8);
  rtb.Render(ellipse);
  byte[] pixels = new byte[width*height];
  rtb.CopyPixels(pixels, width, 0);

Cualquier valor distinto de cero en píxeles [] está parcialmente cubierto por la elipse. Esto incluirá puntos interiores a la elipse si la elipse tiene un relleno.

Si necesita obtener solo los píxeles a lo largo del borde pero su elipse está llena, o viceversa, puede crear una nueva Forma para pasar a RenderTargetBitmap:

  var newEllipse = new Path
  {
    Data = ellipse.DefiningGeometry,
    Stroke = Brushes.Black,
  };
  RenderTargetBitmap rtb = ...
    [same as before]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top