椭圆几何绑定点

时间:2009-10-29 12:33:21

标签: wpf geometry ellipse

是否有自动方式获取椭圆笔划的所有点,而没有填充点?

2 个答案:

答案 0 :(得分:6)

在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]

答案 1 :(得分:0)

通过使用Reflector我发现EllipseGeometry类中有一个GetPointList()方法,不幸的是它是私有的。也许你可以通过反射调用它,但这听起来像是一个非常糟糕的黑客...我会看到我是否找到另一种方式......