0

塗りつぶしポイントなしで、楕円ストロークのすべてのポイントを自動的に取得する方法はありますか?

4

2 に答える 2

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]
于 2009-10-29T23:08:17.353 に答える
0

Reflector を使用すると、残念ながら EllipseGeometry クラスに GetPointList() メソッドがあることがわかりました。これは非公開です。リフレクションを介して呼び出すこともできますが、それは非常に悪いハックのように聞こえます...別の方法を見つけるかどうかを確認します...

于 2009-10-29T15:04:04.097 に答える