1

ポイントリストを使用して作成されたポリゴンの内部を塗りつぶす「塗りつぶし」を作成したいのですが、その穴を削除できます。

私の古いコード:

Private Sub DrawSomething(ByVal points as List(of Point), _
ByVal myBrush As System.Drawing.Brush, _
ByVal myGraphics As System.Drawing.Graphics)
  myGraphics.FillPolygon(myBrush, points)
End Sub

リスト内の点の輪郭によって作成された多角形を単純に塗りつぶします。

ポリゴンを塗りつぶし、その中の穴を除外するにはどうすればよいですか (内側にあることがわかっているので、テストしました):

Private Sub DrawSomething(ByVal points as List(of Point), _
ByVal holes as List(of List(of Point)), _ 
ByVal myBrush As System.Drawing.Brush, _
ByVal myGraphics As System.Drawing.Graphics)

' fill the contour created by points, excluding the contours created by holes
End Sub

すでに作成されているものを使用できますか? どうにかして元のポリゴンを描いて穴を取り除くことはできますか? 最善のアプローチは何ですか?

私が試したこと - 例:私は次のことをしました:

Private Sub DrawSomething(ByVal points as List(of Point), _
ByVal holes as List(of List(of Point)), _ 
ByVal myBrush As System.Drawing.Brush, _
ByVal myGraphics As System.Drawing.Graphics)

  Dim myGraphicsPath As Drawing2D.GraphicsPath = New Drawing2D.GraphicsPath(Drawing2D.FillMode.Winding)
  myGraphicsPath.AddLines(points)
  Dim myRegion As System.Drawing.Region = New System.Drawing.Region(myGraphicsPath)
  Dim otherGraphicsPath As Drawing2D.GraphicsPath = New Drawing2D.GraphicsPath(Drawing2D.FillMode.Winding)  
  ForEach otherPoints as List(of Point) in holes
    otherGraphicsPath.AddLines(otherPoints)
  Next
  myRegion.Exclude(otherGraphicsPath)
  myGraphics.FillRegion(myBrush, myRegion)

End Sub

これはそれほど悪くはありません...内側のポリゴンを除外しますが、輪郭の間に「空の」帯も描画します。だから、うまくいかないと思います。

ありがとうございました。

編集:画像を追加:ここに画像の説明を入力

輪郭は点 (「点」) のリストとして与えられ、穴はリスト (「穴」) のリストとして与えられます。右側の写真は、私が得た一連の線の大まかな図です (穴と輪郭に共通点はありませんが)。画像を移動すると、線が変化します。

4

1 に答える 1

1

GraphicPath オブジェクトで StartFigure と CloseFigure を使用してみてください。

For Each otherPoints as List(of Point) in holes
  otherGraphicsPath.StartFigure()
  otherGraphicsPath.AddLines(otherPoints)
  otherGraphicsPath.CloseFigure()
Next

それがなければ、すべてのオブジェクトが互いに接続していると思います。

于 2013-02-25T23:34:19.227 に答える