閉じた多角形内のビットマップ ピクセルの色を読み取るための最良の方法はどれですか?
閉じた多角形は、ビットマップ ディメンションの System.Drawing.Point のリストとして定義されます。C# と .NET Framework を使用しています。
ありがとう。
私の知る限り、c# はデフォルトでこの機能を提供していません。おそらく最も簡単な方法は、背景が白の 2 番目の画像を作成することです。ここでFillPolygon
、ポリゴンは黒のピクセルで構成されます。次に、2 番目のイメージ全体をスキャンして黒いピクセルを探し、同じ座標で元のイメージから各黒いピクセルを読み取ります。
もちろん、ポリゴンが大きな画像の小さな部分である場合、これは遅くなりますが、ポリゴンが収まる境界を簡単に判断して、その領域のマップのみを作成できます。
もう 1 つの方法は、(-1, 0) から (幅 + 1, 0) までのラインをスキャンし、各ポリゴン ラインとの交点を計算することです。交点の後、次のピクセルはポリゴンの内側にあり、次の交点の後、ピクセルは外側にあります。 . 次に、(-1, 1) から (幅 + 1, 1) などをスキャンします。多角形の点と正確に一致する点と交差する線には特に注意が必要です。
考えられる方法は、Drawing2D.GraphicsPathのインスタンスを作成し、GraphicsPath.AddLines(PointF [])を介してポイントを追加してから、コンストラクターへの引数としてGraphicsPathを使用して領域を作成することです。
次に、 Region.IsVisible(x、y、graphicsobject)を使用して、ポリゴンが収まる最小の長方形に基づいてヒットテストを実行します。
この方法は、2番目のビットマップを作成するよりもいくらか効率的ですが、それほど高速ではない可能性があります。
これはVBですが、簡単に翻訳できます。
Dim path As New GraphicsPath
path.AddLines( YourPointsArray )
path.CloseFigure( )
Dim rgn As New Region( path )
'Find your min/max box based on YourPointsArray here
For y As Integer = min.Y To max.Y
For x as Integer = min.X To max.X
If rgn.IsVisible( x, y, YourGraphicsObject ) Then
'Do what you need to do
End If
Next
Next
これは簡単なサンプルコードですが、アイデアを理解する必要があります。
非常に興味深いトピックです。Kogitsune によって提案されたように長方形を縮小することは、合理的な最初のステップのように聞こえます。しかし、そのためにリージョンは必要ないと思います。すべてのポイントの最大および最小の x 座標と y 座標を単純に見つけると、ポリゴン全体を含む最小の長方形が得られます。次に、効率的なポリゴン塗りつぶしアルゴリズムを使用して、ポリゴン内のすべての水平線を見つけることができます。そして、単純に計算します。これらの色。