Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Использование графических примитивов



Как нам уже известно, с помощью одних только линий можно рисовать фигуры любой сложности, будь это плоская кривая или какая-либо геометрическая фигура. С другой стороны, если требуется нарисовать достаточно много простых фигур, например, эллипсов или многоугольников, уже известный нам способ будет несколько неуместен. В GDI+ имеется достаточно обширный набор функций, предназначенных для рисования простых геометрических фигур - графических примитивов. Все они являются методами класса Graphics. Некоторые из них указаны в таблице.

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

· Рисование прямоугольников.

Следующий код создаёт перо, определяет положение нескольких прямоугольников на экране, выводит изображение на экран.

void draw_rects()

{ //создание объекта graphics

System::Drawing::Graphics ^g=my_form::CreateGraphics();

//создание нового пера заданной толщины

Pen^ draw_Pen = gcnew Pen(Color::Black,3.0f);

/* Положение прямоугольника на экране определяется координатами левого верхнего и правого нижнего углов (точки (x,y) и (x+width,y+height) соответственно). Координаты задаются числами с плавающей точкой.*/

float x = 0.0;

float y = 0.0;

float width = 200.0;

float height = 200.0;

// Вывод прямоугольника на экран.

g->DrawRectangle(draw_Pen, x, y, width, height);

/* Координаты углов прямоугольника могут быть целочисленными.*/

int x1 = 5;

int y1 = 5;

int x2 = 250;

int y2 = 250;

// Вывод прямоугольника на экран.

draw_Pen->Color=Color::Red;

g->DrawRectangle(draw_Pen, x1, y1, x2, y2);

/*Ещё один способ - использование структуры Rectangle, предоставляющей прямоугольник для рисования. Структура Rectangle содержит набор из четырех целых чисел, определяющих положение и размеры прямоугольника.*/

Rectangle rect = Rectangle(30,20,150,140);

// Вывод прямоугольника на экран.

draw_Pen->Color=Color::Green;

g->DrawRectangle(draw_Pen, rect);

/*Можно рисовать несколько прямоугольников одновременно. Для этого зададим массив из прямоугольников, определяемых с помощью структуры Rectangle или RectangleF, и воспользуемся функцией DrawRectangles. Структура RectangleF отличается лишь тем, что содержит набор не целых чисел, а чисел с плавающей точкой.*/

array<Rectangle>^ rects = {Rectangle(0,0,100,200),Rectangle(100,200,250,50),\

Rectangle(300,0,50,100)};

// Одновременный вывод трёх прямоугольников.

draw_Pen->Color=Color::Blue;

g->DrawRectangles(draw_Pen, rects);

//освобождение созданного объекта graphics и пера

delete draw_Pen;

delete g;

}

· Рисование многоугольников и ломаных.

void draw_poligons()

{

System::Drawing::Graphics ^g=my_form::CreateGraphics();

Pen^ draw_Pen = gcnew Pen(Color::Blue,3.0f);

/* Многоугольник определяется набором координат вершин, заданных с помощью массива структур Point или PointF, которые представляют собой упорядоченую пару чисел - координаты точки на двумерной плоскости (два целых числа или два числа с плавающей точкой соответственно). Каждая пара следующих друг за другом точек определяет сторону многоугольника. Если координаты первой и последней точек массива не совпадают, они образуют ещё одну сторону многоугольника.*/

Point point1 = Point(50,50);

Point point2 = Point(100,25);

Point point3 = Point(200,5);

Point point4 = Point(250,50);

Point point5 = Point(300,100);

Point point6 = Point(350,200);

Point point7 = Point(250,250);

array<Point>^ control_points = {point1,point2,point3,point4,point5,point6,point7};

// Вывод многоугольника на экран.

g->DrawPolygon(draw_Pen, control_points);

/* Если порядок точек не соответствует обходу контура фигуры, результатом будет замкнутая самопересекающаяся ломаная, в данном случае - два смежных через вершину треугольника.*/

control_points ->Resize(control_points,4);

control_points ->SetValue(Point(50,50),0);

control_points ->SetValue(Point(10,10),1);

control_points ->SetValue(Point(50,10),2);

control_points ->SetValue(Point(10,50),3);

// Вывод многоугольника на экран.

draw_Pen->Color=Color::Red;

g->DrawPolygon(draw_Pen, control_points);

/*Ломаная также задаётся набором точек, определяющих координаты её вершин. Первая пара точек в массиве задаёт первое звено ломаной, каждая последующая точка - конец звена ломаной, началом для которого служит конечная точка предыдущего сегмента линии.*/

array<PointF>^ points = {PointF(10.0,10.0),PointF(10.0,100.0),\

PointF(200.0,50.0),PointF(250.0,300.0)};

// Рисование ломаной.

draw_Pen->Color=Color::Green;

g->DrawLines(draw_Pen, points);

//освобождение созданного объекта graphics и пера

delete draw_Pen;

delete g;

}

· Рисование эллипсов, дуг, секторов.

void draw_ellipses()

{

System::Drawing::Graphics ^g=my_form::CreateGraphics();

Pen^ draw_Pen = gcnew Pen(Color::Coral,3.0f);

/*Положение эллипса на экране определяется ограничивающим прямоугольником, у которого заданы координаты левого верхнего угла, высота и ширина. Координаты могут быть целыми или числами с плавающей точкой. Для определения ограничивающего прямоугольника может использоваться структура Rectangle.*/

float x = 40.0;

float y = 50.0;

float width = 100.0;

float height = 200.0;

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

g->DrawEllipse(draw_Pen, x, y, width, height);

//Использование структуры Rectangle (RectangleF).

Rectangle rect = Rectangle(30,20,150,170);

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

draw_Pen->Color=Color::Green;

g->DrawEllipse(draw_Pen, rect);

/*Методы класса Grapfics также позволяют нарисовать часть дуги эллипса или сектор эллипса.*/

/*Дуга представляет собой часть эллипса, заключённую между значениями start_angle и start_angle+end_angle. Параметр start_angle - угол в градусах, который измеряется по часовой стрелке, начиная от оси х и заканчивая начальной точкой дуги; end_angle - угол в градусах, который измеряется по часовой стрелке, начиная от значения start_angle и заканчивая конечной точкой дуги.*/

int start_angle = 35;

int end_angle = 215;

rect = Rectangle(32,234,153,129);

/* Вывод на экран дуги эллипса, задание ограничивающей эллипс области может быть различным. Возможно также использование чисел с плавающей точкой. */

draw_Pen->Color=Color::Blue;

g->DrawArc(draw_Pen, rect, start_angle, end_angle);

draw_Pen->Color=Color::Red;

g->DrawArc(draw_Pen, 20, 70, 30, 40, start_angle, end_angle);

/* Рисование сектора эллипса, определяемого эллипсом, заданным любым из возможных способов, и двумя радиальными линиями. Параметры start_angle и end_angle задают углы, по которым пройдёт линия.*/

draw_Pen->Color=Color::Red;

rect = Rectangle(52,234,173,129);

g->DrawPie(draw_Pen, rect, start_angle, end_angle);

draw_Pen->Color=Color::Blue;

g->DrawPie(draw_Pen, 70, 70, 100, 40, start_angle, end_angle);

delete draw_Pen;

delete g;

}

3.1 Pen: декоративные приёмы

С некоторыми свойствами объекта Pen мы уже знакомы. Обратим внимание на несколько свойств, которые не были необходимы при построении графиков, но могут быть полезны при рисовании контурных фигур.

Одним из свойств класса Pen является тип соединения линий. Под соединением линий понимаются точки их пересечения и соприкосновения. Интерфейс GDI+ предоставляет три стиля соединения линий: острый или подрезанный угол, скошенное соединение и скругленное соединение. Стиль соединения определяется свойством LineJoin класса Pen. Ниже приведён код, выполняющий рисование многоугольников. Для каждой фигуры задан свой стиль соединения линий.

void draw_join()

{

System::Drawing::Graphics ^g=example_form::CreateGraphics();

g->Clear(Color::White);

Pen^ p=gcnew Pen(Color::FromArgb(0x780000FF), 6.0);

//Cкошенное соединение линий

p->LineJoin=System::Drawing::Drawing2D::LineJoin::Bevel;

g->DrawRectangle(p, 10, 10, 140, 140);

//Острый или подрезанный угол

p->Color = Color::FromArgb(255, 0, 0);

p->LineJoin=System::Drawing::Drawing2D::LineJoin::Miter;

array<Point>^control_points={Point(260,50),Point(140,150),\

Point(36,34)};

g->DrawPolygon(p, control_points);

/* Изменение длины соединения - расстояния от точки пересечения границ линий внутри соединения до точки пересечения границ линий снаружи*/

p->MiterLimit=5;

p->LineJoin=System::Drawing::Drawing2D::LineJoin::MiterClipped;

p->Color=Color::DarkBlue;

array<Point>^control_points_2={Point(50,50),Point(190,190),\

Point(3,78)};

g->DrawPolygon(p,control_points_2);

//Скруглённые соединения линий

p->Color = Color::FromArgb(134, Color::Green);

p->LineJoin=System::Drawing::Drawing2D::LineJoin::Round;

g->DrawRectangle(p, 60, 60, 360, 260);

delete p;

delete g;

}





Дата публикования: 2015-04-10; Прочитано: 707 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.012 с)...