Поделиться через


Замкнутые и незамкнутые кривые в GDI+

Обновлен: Ноябрь 2007

На приведенном ниже рисунке изображены две кривые: открытая и замкнутая.

Замкнутые и незамкнутые кривые

Управляемый интерфейс для кривых

У замкнутых кривых есть внутренняя область, которую можно залить с использованием кисти. Класс Graphics интерфейса GDI+ содержит следующие методы для заливки замкнутых фигур и кривых: FillRectangle (прямые линии), FillEllipse (прямоугольники), FillPie (эллипсы), FillPolygon (многоугольники), FillClosedCurve (дуги), FillPath (фундаментальные сплайны) и FillRegion (сплайны Безье). При вызове одного из этих методов необходимо передавать им в качестве аргумента тип кисти (SolidBrush, HatchBrush, TextureBrush, LinearGradientBrush или PathGradientBrush).

Метод FillPie является дополнением к методу DrawArc. Метод DrawArc служит для рисования части контура эллипса, а метод FillPie — для заливки части внутренней области эллипса. В приведенном ниже примере демонстрируется рисование дуги и заливка соответствующей части внутренней области эллипса.

myGraphics.FillPie(mySolidBrush, 0, 0, 140, 70, 0, 120)
myGraphics.DrawArc(myPen, 0, 0, 140, 70, 0, 120)

myGraphics.FillPie(mySolidBrush, 0, 0, 140, 70, 0, 120);
myGraphics.DrawArc(myPen, 0, 0, 140, 70, 0, 120);

На приведенном ниже рисунке изображена полученная дуга и залитый сектор.

Замкнутые и незамкнутые кривые

Метод FillClosedCurve является дополнением к методу DrawClosedCurve. Оба метода автоматически замыкают кривую путем соединения конечной и начальной точки. В приведенном ниже примере демонстрируется рисование кривой через точки с координатами (0, 0), (60, 20) и (40, 50). Затем кривая автоматически замыкается путем соединения точки с координатами (40, 50) с начальной точкой с координатами (0, 0), а внутренняя область закрашивается сплошным цветом.

Dim myPointArray As Point() = _
   {New Point(0, 0), New Point(60, 20), New Point(40, 50)}
myGraphics.DrawClosedCurve(myPen, myPointArray)
myGraphics.FillClosedCurve(mySolidBrush, myPointArray)

     Point[] myPointArray =
{ new Point(0, 0), new Point(60, 20), new Point(40, 50) };
     myGraphics.DrawClosedCurve(myPen, myPointArray);
     myGraphics.FillClosedCurve(mySolidBrush, myPointArray);

Метод FillPath заливает внутренние области различных частей контура. Если часть контура не образует замкнутую кривую, метод FillPath автоматически замыкает эту часть контура перед началом заливки. В приведенном ниже примере демонстрируются рисование и заливка контура, состоящего из дуги, фундаментального сплайна, строки и сектора.

Dim mySolidBrush As New SolidBrush(Color.Aqua)
Dim myGraphicsPath As New GraphicsPath()

Dim myPointArray As Point() = { _
   New Point(15, 20), _
   New Point(20, 40), _
   New Point(50, 30)}

Dim myFontFamily As New FontFamily("Times New Roman")
Dim myPointF As New PointF(50, 20)
Dim myStringFormat As New StringFormat()

myGraphicsPath.AddArc(0, 0, 30, 20, -90, 180)
myGraphicsPath.AddCurve(myPointArray)
myGraphicsPath.AddString("a string in a path", myFontFamily, _
   0, 24, myPointF, myStringFormat)
myGraphicsPath.AddPie(230, 10, 40, 40, 40, 110)

myGraphics.FillPath(mySolidBrush, myGraphicsPath)
myGraphics.DrawPath(myPen, myGraphicsPath)

     SolidBrush mySolidBrush = new SolidBrush(Color.Aqua);
     GraphicsPath myGraphicsPath = new GraphicsPath();

     Point[] myPointArray = {
new Point(15, 20), 
new Point(20, 40), 
new Point(50, 30)};

     FontFamily myFontFamily = new FontFamily("Times New Roman");
     PointF myPointF = new PointF(50, 20);
     StringFormat myStringFormat = new StringFormat();

     myGraphicsPath.AddArc(0, 0, 30, 20, -90, 180);
     myGraphicsPath.AddCurve(myPointArray);
     myGraphicsPath.AddString("a string in a path", myFontFamily,
        0, 24, myPointF, myStringFormat);
     myGraphicsPath.AddPie(230, 10, 40, 40, 40, 110);

     myGraphics.FillPath(mySolidBrush, myGraphicsPath);
     myGraphics.DrawPath(myPen, myGraphicsPath);

На приведенном ниже рисунке изображен контур, залитый с использованием сплошного цвета, и вариант такого контура без заливки. Обратите внимание, что метод DrawPath отображает текст строки в виде контуров символов, но не закрашивает эти контуры. Внутренние области знаков строки закрашиваются методом FillPath.

Строка в пути

См. также

Задачи

Практическое руководство. Создание объектов Graphics для рисования

Ссылки

System.Drawing.Drawing2D.GraphicsPath

System.Drawing.Pen

System.Drawing.Point

Другие ресурсы

Прямые и кривые линии и фигуры

Построение и рисование контуров