В WPF нет актуальных «точек» в геометрии - это бесконечно гладко. Это можно увидеть, увеличив масштаб эллипса. Вы можете увеличить зум до 1 000 000 раз, но при этом вы сможете увидеть кривизну и отсутствие точек.
Поскольку фигуры WPF не состоят из точек, ваш вопрос может быть пересмотрен несколькими способами. Вы можете искать любой из них:
- Список точек, аппроксимирующих границу эллипса (приближение ломаной линии)
- Набор пикселей, покрытых эллипсом, включая заливку
- Набор пикселей, покрытых краем эллипса
Вот решения для каждого случая:
Если вы ищете аппроксимацию эллипса в виде дискретных точек (например, пунктирная линия, которая выглядит как эллипс), используйте этот код:
PolyLineSegment segment =
ellipse.DefiningGeometry
.GetFlattenedPathGeometry(1.0, ToleranceType.Absolute)
.Figures[0].Segments[0] as PolyLineSegment;
foreach(Point p in segment.Points)
...
Если вы ищете затронутые пиксели, вам нужно будет 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);
Любое ненулевое значение в пикселях [] частично перекрывается эллипсом. Это будет включать в себя точки внутри эллипса, если эллипс заполнен.
Если вам нужно получить только пиксели вдоль края, но ваш эллипс заполнен, или наоборот, вы можете создать новый Shape для передачи в RenderTargetBitmap:
var newEllipse = new Path
{
Data = ellipse.DefiningGeometry,
Stroke = Brushes.Black,
};
RenderTargetBitmap rtb = ...
[same as before]