Связанные точки геометрии эллипса - PullRequest
0 голосов
/ 29 октября 2009

Существует ли автоматический способ получения всех точек хода эллипса без точек заполнения?

Ответы [ 2 ]

6 голосов
/ 30 октября 2009

В 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]
0 голосов
/ 29 октября 2009

Используя Reflector, я обнаружил, что в классе EllipseGeometry есть метод GetPointList (), к сожалению, он закрытый. Может быть, вы можете вызвать это через рефлексию, но это звучит как очень плохой хак ... Я посмотрю, найду ли я другой способ ...

...