Основы графики

Прежде чем рассматривать работу с графическими примитивами, вначале приведём наиболее важные вспомогательные типы данных, которые широко применяются при графических построениях.

Вспомогательные типы данных

Point (точка) — структура, используемая для задания координат точки на плоскости (x,y). Пример использования см. ниже (Пример 1).

Rectangle (прямоугольник) — структура, обычно определяет координаты левого угла (x,y) и размеры прямоугольной области (ширина и высота). Пример использования см. ниже (Пример 2).

Size (размер) — определяет размеры объекта, полями структуры являются ширина и высота объекта. Задать размеры какого-то объекта можно так:

Size t = new Size(40,30);

В оконном приложении можно сразу использовать объекты данных структур. В консольном приложении для использования этих структур требуется подключить необходимую ссылку. Открываем окно диалога Add Reference из пункта меню Project/Add Reference, далее во вкладке GAC находим строку System.Drawing и нажимаем кнопку OK:




Затем в начале текста программы добавляем строку:

using System.Drawing;

Только после этого можно воспользоваться объектами указанных выше типов.

Пример 1. Использование типа Point:

using System;

using System.Drawing;

namespace Test_Point

{

   class Program

   {

      public static void Main(string[] args)

      {

         Console.WriteLine("Тест Point:");

         // Задаём точку p1 с координатами x=50 и y=100

         Point p1 = new Point(50,100);

         // Задаём точку p2 с координатами x=40 и y=80

         Point p2 = new Point(40,80);

         // Изменить (увеличить) координату x на 10, а y на 20 единиц

         p2.Offset(10,20);

         if(p1==p2) // Координаты точек можно сопоставить на равенство (или на неравенство - операция !=)

            Console.WriteLine("Координаты точек равны");

         else

            Console.WriteLine("Координаты точек не совпадают");

         p1.X = 200; // Можно непосредстве задать значение координаты X

         p1.Y = 300;

         Console.WriteLine(p1); // Печать координат точки

         Console.Write("Press any key to continue . . . ");

         Console.ReadKey(true);

      }

   }

}

Результаты работы:

Тест Point:

Координаты точек равны

{X=200,Y=300}

Press any key to continue . . .

Пример 2. Создаём два объекта: прямоугольник и точку, и проверяем, лежит ли точка внутри прямоугольника:

using System;

using System.Drawing;

namespace Test_Rectangle

{

   class Program

   {

      public static void Main(string[] args)

      {

         Console.WriteLine("Тест Rectangle:");

         int x=100, y=100, // Координаты левого верхнего угла

         w=50, h=100;      // ширина и высота

         Rectangle r = new Rectangle(x, y, w, h);

         Console.WriteLine("Прямоугольник: "+r);

         Point p = new Point(120, 150);

         Console.WriteLine("Точка: "+p);

         if(r.Contains(p))

            Console.WriteLine("Точка лежит внутри прямоугольника");

         else

            Console.WriteLine("Точка лежит вне прямоугольника");

         Console.Write("Press any key to continue . . . ");

         Console.ReadKey(true);

      }

   }

}

Результаты работы:

Тест Rectangle:

Прямоугольник: {X=100,Y=100,Width=50,Height=100}

Точка: {X=120,Y=150}

Точка лежит внутри прямоугольника

Press any key to continue . . .

Графические примитивы

Для выполнения простейших графических построений необходимо использовать следующие инструменты: полотно, перья, кисти, шрифты.

1.Полотно — это объект, на который выводится изображение. Данный объект должен иметь тип Graphics. Чаще всего изображение на экран выводится по событию Paint, поэтому создаём обработчик событий MainFormPaint() и в нём обеспечиваем доступ к полотну:

void MainFormPaint(object sender, PaintEventArgs e)

{

   Graphics g = e.Graphics;

}

2.Перья — это объекты типа Pen, которые предназначены для рисования линий (отрезки прямых линий, прямоугольники, дуги, эллипсы и т.д.). Для пера можно задать цвет и толщину линии, например:

а)Создаём перо для рисования линий красного цвета. Толщина линий — 1 пиксель (это действует по-умолчанию, если толщина не задана явно):

Pen p1 = new Pen(Color.Red);

б)Теперь создадим перо для рисования линий зелёным цветом толщиной 5 пикселей:

Pen p2 = new Pen (Color.Green, 5);

3.Кисти — это объекты, предназначенные для построения закрашенных геометрических фигур, например: прямоугольников, эллипсов.

а)Закрашивать можно сплошным цветом — используем кисть типа SolidBrush, например, сделаем кисть для заливки голубым цветом:

Brush b1 = new SolidBrush(Color.Blue);

б)Есть вариант — закрашивать область кистью HatchBrush, которая представляет собой какой-либо узор, например, например пересекающиеся вертикальные и горизонтальные линии зелёного цвета на красном фоне:

HatchBrush b3 = new HatchBrush(HatchStyle.Cross, Color.Green, Color.Red);

в)Кроме того, доступна кисть типа TextureBrush, с помощью которой можно для заливки использовать любой рисунок, например, закрасим прямоугольник изображениями рисунка из файла rr.bmp:

Bitmap bitmap = new Bitmap("rr.bmp");

Brush b2 = new TextureBrush(bitmap);

4.Шрифты — объекты, используемые для вывода на экран различных символом и текстов. В шрифтах можно задавать высоту, тип и т.д. Пример:

// Определяем гарнитуру штифта:

FontFamily fontFamily = new FontFamily("Times New Roman");

// Конкретные характеристика шрифта:

Font font = new Font(fontFamily, 24, FontStyle.Italic | FontStyle.Bold, GraphicsUnit.Point);

// Вывод текста

g.DrawString("Слово", font, b1, 105, 200);


Пример 3. Ниже приводится полная тестовая программа со всеми упомянутыми примерами:

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Windows.Forms;

namespace Test_Ris0

{

   public partial class MainForm : Form

   {

      public MainForm()

      {

         InitializeComponent();

      }

      void MainFormPaint(object sender, PaintEventArgs e)

      {

         Graphics g = e.Graphics;

         Pen p1 = new Pen(Color.Red);

         Pen p2 = new Pen (Color.Green, 5);

         g.DrawLine(p1, 10,10,100,50);

         g.DrawLine(p2,20,20,50,70);

         Brush b1 = new SolidBrush(Color.Blue);

         g.FillEllipse(b1,100,100,50,50);

         Bitmap bitmap = new Bitmap("rr.bmp");

         Brush b2 = new TextureBrush(bitmap);

         g.FillRectangle(b2,20,120,80,80);

         HatchBrush b3 = new          HatchBrush(HatchStyle.Cross,Color.Green,Color.Red);

         g.FillEllipse(b3,150,150,50,50);

         Font f1 = new Font(FontFamily.GenericMonospace, 20, FontStyle.Italic | FontStyle.Bold, GraphicsUnit.Point);

         g.DrawString("Tekst",f1,b1,15,200);

         FontFamily fontFamily = new FontFamily("Times New Roman");

         Font font = new Font(fontFamily, 24, FontStyle.Italic | FontStyle.Bold, GraphicsUnit.Point);

         g.DrawString("Слово",font,b1,105,200);

      }

   }

}


На рисунке приведён результат работы данной программы:




Методы для построения графических примитивов

Все методы можно условно поделить на группы:

линии, закрашенные контуры и тексты.

Методы для построения линий и незакрашенных контуров начинаются со слова Draw, закрашенные контуры — со слова Fill.

Перечислим наиболее употребительные методы построения графических примитивов:

DrawArc() — дуга;

DrawEllipse() — эллипс

DrawLine() — прямая линия

DrawLines() — набор линий;

DrawPie() — сектор

DrawPolygon() — замкнутый многоугольник

DrawRectangle() — прямоугольник

DrawString() — вывод текста

FillEllipse() — закрашенный эллипс

FillPie() — закрашенный сектор

FillPolygon() — закрашенный многоугольник

FillRectangle() — закрашенный прямоугольник

Пример 4. Приведём пример использования приведённых выше методов:

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Windows.Forms;

namespace Test_Ris1

{

   public partial class MainForm : Form

   {

      public MainForm()

      {

         InitializeComponent();

      }


      void MainFormPaint(object sender, PaintEventArgs e)

      {

         Graphics g = e.Graphics;

         Pen p = new Pen(Color.BlueViolet);

         // Дуга

         g.DrawArc(p, 10, 10, 50, 50, 0, 90);

         // Эллипс

         g.DrawEllipse(p, 60, 60, 50, 100);

         // Прямая линия

         g.DrawLine(p, 40, 40, 100, 70);

         // Треугольник

         Point [] x = new Point[4];

         x[0].X = 100; x[0].Y = 20;

         x[1].X = 120; x[1].Y = 120;

         x[2].X = 250; x[2].Y = 50;

         x[3].X = 100; x[3].Y = 20;

         g.DrawLines(p, x);

         // Сектор

         g.DrawPie(p, 150, 50, 70, 70, 90, 90);

         // Замкнутый многоугольник (треугольник)

         Pen p1 = new Pen(Color.Red);

         Point []x1=new Point[3];

         x1[0].X = 200; x1[0].Y=20;

         x1[1].X = 220; x1[1].Y=120;

         x1[2].X = 350; x1[2].Y=50;

         g.DrawPolygon(p1, x1);

         // Прямоугольник

         g.DrawRectangle(p1, 50, 200, 100,40);

         // Вывод текста

         Font font = new Font(FontFamily.GenericSansSerif, 20, FontStyle.Italic, GraphicsUnit.Pixel);

         g.DrawString("Текст", font, Brushes.Brown, 150, 140);

         // Закрашенный эллипс (в данном случае - круг)

         g.FillEllipse(Brushes.Blue, 30, 250, 100, 100);

         // Закрашенный сектор

         g.FillPie(Brushes.Aqua, 150, 250, 100, 100, 120, 60);

         // Закрашенный многоугольник (треугольник)

         Point []x2=new Point[3];

         x2[0].X = 200; x2[0].Y=220;

         x2[1].X = 220; x2[1].Y=320;

         x2[2].X = 350; x2[2].Y=250;

         g.FillPolygon(Brushes.BurlyWood, x2);

         // Закрашенный прямоугольник

         g.FillRectangle(Brushes.DarkOliveGreen, 300, 300, 100, 70);

      }

   }

}



Результат работы программы показан на рисунке ниже:




В ряде случаев требуется разместить текст определённым образом относительно какого-то объекта. Например, вывести текст внутри прямоугольника или эллипса. Для этого необходимо знать размера текста, т.е. его ширину и высоту, которые можно получить с помощью метода MeasureString().

Пример 5. Вывод слова «Эллипс» внутри эллипса:

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Windows.Forms;

namespace Test_Ris2

{

   public partial class MainForm : Form

   {

      public MainForm()

      {

         InitializeComponent();

      }


      void MainFormPaint(object sender, PaintEventArgs e)

      {

         Graphics g = e.Graphics;

         string s = "Эллипс";

         Brush b1 = new SolidBrush(Color.Red);

         int x=50, y= 50, w=150, h= 50;

         // Рисуем эллипс

         g.DrawEllipse(new Pen(Color.Red, 2), x, y, w, h);

         // Задаём шрифт

         FontFamily fontFamily = new FontFamily("Times New Roman");

         Font font = new Font(fontFamily, 24, FontStyle.Italic | FontStyle.Bold, GraphicsUnit.Point);

         // Определяем ширину и высоту строки s, которая будет выводится шрифтом font.

         // Единицы измерения определяются параметром шрифта GraphicsUnit.Point (здесь в пикселях)

         SizeF size = g.MeasureString(s,font);

         // Вычисляем координаты верхнего угла прямоугольной области,

         // в которую будет выводится текст

         int x1=(int)(w-size.Width)/2 + x;

         int y1=(int)(h-size.Height)/2 + y;

         // Вывод текста по середине эллипса

         g.DrawString(s, font, b1, x1, y1);

      }

   }

}



Результат работы приведён на следующем рисунке:











Назад
На верх
Вперёд
Hosted by uCoz