Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: ThaliaОтветов: 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

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

Спасибо.

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

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

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

drawingpolygongraphics

Ответы

Ответ 1 · рейтинг 1 · LarsTech

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы