塗りつぶしポイントなしで、楕円ストロークのすべてのポイントを自動的に取得する方法はありますか?
2 に答える
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]
Reflector を使用すると、残念ながら EllipseGeometry クラスに GetPointList() メソッドがあることがわかりました。これは非公開です。リフレクションを介して呼び出すこともできますが、それは非常に悪いハックのように聞こえます...別の方法を見つけるかどうかを確認します...