FillPolygon с отверстиями

Я хочу создать «заливку», которая заполняет внутреннюю часть многоугольника, созданного с использованием списка точек, но иметь возможность удалять его отверстия.

Мой старый код:

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

Это не так уж плохо... он исключает внутренние полигоны, но также рисует полосу «пустого» между контурами. Итак, я думаю, это не работает.

Спасибо.

Редактировать: Добавление изображения: введите здесь описание изображения

Контур задается в виде списка точек ("точки"), отверстия - в виде списка списков ("дырок"). На картинке справа есть грубый рисунок полос линий, которые я получаю (хотя отверстия и контуры не имеют общих точек) - линии меняются по мере того, как я перемещаю изображение.


person Thalia    schedule 25.02.2013    source источник
comment
Не уверен, что понимаю, где проблема. Разве вы не можете просто снова нарисовать многоугольник без отверстий?   -  person LarsTech    schedule 26.02.2013
comment
Это все, что я хочу. Нарисуйте многоугольник без отверстий. Тот факт, что внутри многоугольника есть дыры, является важной информацией. Так что я не могу просто прикрыть их. Теоретически у меня есть вся информация - просто я не умею правильно рисовать.   -  person Thalia    schedule 26.02.2013


Ответы (1)


Попробуйте использовать StartFigure и CloseFigure для ваших объектов GraphicPath:

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

Без этого, я думаю, все ваши объекты соединяются друг с другом.

person LarsTech    schedule 25.02.2013
comment
Я также попытался создать отдельные регионы для каждой фигуры и исключить их. с тем же эффектом. - person Thalia; 26.02.2013
comment
@Mihaela, иначе я не могу обмануть это. Дважды проверьте значения в вашей коллекции отверстий. - person LarsTech; 26.02.2013
comment
Нашел свой баг - он был в собственно обработке дырок... Спасибо за помощь. - person Thalia; 26.02.2013