Лабораторная работа № 2
Тема: Простейшие графические примитивы. Основные подходы к разработке графических приложений. Способы закраски. Шрифты.
Цель: Знакомство с графическими примитивами, их применением; изучение способов закраски связной области.
Ход работы.
1. Включить ПЗВМ.
2. Загрузить компилятор С++ на рабочем столе Windows.
3. Открыть окно текстового редактора.
4. Изучить построение простейших графических объектов.
Примечание! Предварительно необходимо провести инициализацию графической библиотеки (см Лабораторную работу №1).
4.1. Точки
•Т о ч к а — простейший примитив, который характиризуется координатами и цветом.
Для задания точки с координатами (x,y) определенного цвета (Color) существует функция putpixel:
void far putpixel ( int x, int y, int Color );
Возврат цвета пиксела с координатами (x,y) на экране осуществляется функцией getpixel:
unsigned far getpixel (int x, int y );
4.2. Линейные объекты
Примечание! Для построения линейных объектов основной инструмент — мнимое перо. Ему свойственно иметь следующее:
* цвет (default — белый);
* толщина (default ==1);
* шаблон типа линии (default — сплошной). Применяется для рисования пунктирных и штрихпунктирных линий. Предварительно необходимо установить эти параметры, для чего используют следующие функции:
— установка цвета
void far setcolor ( int Color );
— установка шаблона и толщины
void far setlinestyle (int Style, unsigned Pattern, int Thickness );
В качестве шаблона (Style) выступают либо предопределенные ранее (SOLID_LINE, DOTTED_LINE, CENTER_LINE, DASHED_LINE) и второй параметр не указывается, либо тип USERBIT_LINE (шаблон пользователя). Тогда второй параметр (Pattern) задается. Шаблон определяется 8 битами (1- означает наличие точки, 0- ее отсутствие). Третий параметр (Thickness) задает толщину линии в пикселах. Возможные значения параметра — NORM_WIDTH (1) или THICK_WIDTH (3).
4.2.1. отрезки
• О т р е з о к — линия постоянной толщины, характеризующаяся двумя точками. Для соединения точек (x1, y1) и (x2,y2) используют функцию line:
void far line ( int x1, int y1, int x2, int y2);
4.2.2. окружности
• О к р у ж н о с т ь — множество точек плоскости, равноудаленных от центра. Для построения окружности радиуса (r) с центром в точке (x,y) используют функцию circle:
void far circle ( int x, int y, int r);
4.2.3. дуга окружности
• Д у г а — фрагмент окружности определяемый кривизной (1/r), координатами точки центра (x,y) и величинами стартового (StartAngle) и конечного (EndAngle) углов. Для описания используется функция Arc:
void far arc ( int x, int y, int StartAngle, int EndAngle, int r );
4.2.4. эллипс
• Э л л и п с — множество точек плоскости, сумма расстояний для каждой из которых до двух данных (фокусов) величина постоянная и большая, чем расстояние между фокусами. Фигура определяется координатами центра (x,y), значениями полуосей (rx,ry) и величинами углов — начального (StartAngle) и конечного (EndAngle):
void far ellipse ( int x, int y, int StartAngle, int EndAngle, int rx, int ry )
Примечание! Углы задаются против часовой стрелки в градусах.
4.3. Рисование сплошных объектов.
Сплошные объекты, в отличие от линейных, характеризуются наличием определенного цветового компонента в каждой точке. Изображение строится из множества таких точек и пустых зон.
4.3.1. Понятие кисти.
Для выполнения закрашивания используют средство — кисть. Кисть определяется такими параметрами, как цвет и шаблон. Шаблон — матрица (8 х 8) бит. Причем, если бит = = 1? нужно ставить точку цвета кисти; если = = 0? будет черная точка.
Для задания кисти используются функции:
void far setfillstyle ( int Pattern, int Color ); // функция задания кисти
Параметр определяет шаблон из списка имеющихся стандартных (EMPTY_FILL, SOLID_FILL, LINE_FILL, LTSLASH_FILL) или определяет, как пользовательский (USER_FILL). Для пользовательского шаблона необходимо выполнить процедуру:
void far setfillpattern ( char far * Pattern, int Color );
В ней первый параметр и определяет шаблон в виде матрицы (8 х 8 бит). Биты по горизонтали собраны в байты. По умолчанию — принят SOLID_FILL , цвет — белый.
4.3.2. Закрашенный прямоугольник.
Выполняется при помощи функции bar, которая определяет границы области по левому верхнему (x1,y1) и нижнему правому (x2,y2) углам.
void far bar ( int x1, int y1, int x2, int y2 );
4.3.3. Закрашенный сектор эллипса.
В качестве базовых данных параметры дуги эллипса (см. выше):
void far fillellipse ( int x, int y, int StartAngle, int EndAngle, int rx, int ry );
4.3.4. Закраска произвольной связной области.
Область ограничена линией (цветом BorderColor) и содержит точку внутри себя (x,y):
void far floodfill ( int x, int y, int BorderColor );
4.3.5. Закраска многоугольника.
Многоугольник задан массивом значений координат, и представлен функцией:
void far fillpoly ( int numpoints, int far * points );
5. Работа со шрифтами.
•Ш р и ф т — набор изображений символов, объединенных в группу. Шрифты различаются:
— по организации (растровые и векторные);
— по размеру;
— по направлению вывода.
Шрифты бывают фиксированными (размеры всех символов совпадают) или пропорциональными (совпадают только высоты символов).
Для выбора шрифта и его параметров есть специальная функция settextstyle:
void far settextstyle ( int Font, int Direction, int Size );
Назначение параметров следующее:
— Font является идентификатором одного из шрифтов:
DEFAULT_FONT — стандартный растровый шрифт размером 8 х 8 точек (находится в ПЗУ видеоадаптера);
TRIPLEX_FONT, GOTHIC_FONT, SANS_SERIF_FONT, SMALL_FONT — набор стандартных пропорциональных векторных шрифтов, входящих в комплект компилятора (С++). Хранятся в файле .CHR и по этой команде подгружаются в ОЗУ.
Примечание! Файлы должны находиться в том же каталоге, что и драйвера устройств.
— Direction задает направление вывода:
HORZ_DIR — по горизонтали;
VERT_DIR — по вертикали.
— Size определяет коэффициент увеличения размера шрифта перед выводом на экран. Допустимомые значения 1, 2, 3, … 10.
Возможно использование любых шрифтов .CHR. Однако их необходимо предварительно загрузить с помощью функции:
int far installuserfont ( char far * FontFileName );
а затем возвращенное функцией значение передать функции settextstyle в качестве идентификатора шрифта. Например:
int MyFont = installuserfont ( “MYFONT.CHR” );
settextstyle ( MyFont, HORIZ_DIR, 5 );
Для вывода текста служит функция outtextxy:
void far outtextxy ( int x, int y, char far * text );
При этом строка text выводится так, что точка (х,у) будет вершиной левого верхнего угла первого символа.
Если надо определить размер, который занимает при выводе текущим шрифтом строка, применяют функции:
int far textwidth ( char far * text ); /*возвращает ширину в пикселах строки текста*/
int far textheight (char far * text ); /*возвращает высоту в пикселах строки текста*/
Примечание! Следующий пример поясняет действие функций по созданию и выводу на экран графических примитивов. Параметр “” (в строке инициализации) требует указать (в кавычках) действительный путь к местонахождению драйвера адаптера EGAVGA.BGI (см. Лабораторную работу №1). Файлы шрифтов (*.CHR) и драйвера должны находиться в одном каталоге.
Пример. Построение графических фрагментов.
// examp2.cpp
//example2.cpp
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main(void)
{
int gdriver = DETECT, gmode, errorcode;
char text[256];
puts(«Введите произвольный текст (не более 30 символов).»);
gets(text);
if (strlen(text) > 30)
text[30] = ‘\0’;
// Инициализация графического режима
initgraph(&gdriver, &gmode, «»); //См. Примечание!, приведенное выше.
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf(«Graphics error: %s\n», grapherrormsg(errorcode));
printf(«Press any key to halt:»);
getch();
exit(1); /* return with error code */
}
// Основная часть
int x1,x2,y1,y2; // Координаты прямоугольника.
int height = textheight(text)+4; // Высота текста в пикселах.
int width = textwidth(text)+4; // Ширина текста в пикселах.
int cent_x = getmaxx()/2; // Центральные координаты
int cent_y = getmaxy()/2; // экрана.
// Расчет координат прямоугольника в зависимости от параметров текста.
x1 = cent_x — width/2;
x2 = cent_x + width/2;
y1 = cent_y — height/2;
y2 = cent_y + height/2;
// ТЕКСТ В ПРИМОУГОЛЬНИКЕ
settextjustify(CENTER_TEXT, CENTER_TEXT); // Центрирование текста.
outtextxy(cent_x, cent_y, text); // Выводим текст.
rectangle(x1, y1, x2, y2); // Изображаем рамку.
getch(); // Задержка.
// ТЕКСТ В ЭЛЛИПСЕ
cleardevice(); // Очистка экрана.
settextstyle(DEFAULT_FONT, VERT_DIR, 2);
height = textheight(text)+4; // Высота текста в пикселах.
width = textwidth(text)+4; // Ширина текста в пикселах.
outtextxy(cent_x, cent_y, text); // Вывод текста.
ellipse(cent_x, cent_y, 0, 360, height/2+10, width/2+10);// Эллипс.
getch(); // Задержка.
// ТЕКСТ РАЗЛИЧНЫМИ ШРИФТАМИ В ЭЛЛИПСЕ
int style, size = 1;
for (style = DEFAULT_FONT; style<=GOTHIC_FONT; style++)
{
cleardevice();
if (style == TRIPLEX_FONT)
size = 4;
settextstyle(style, HORIZ_DIR, size);
height = textheight(text)+4; // Высота текста в пикселах.
width = textwidth(text)+4; // Ширина текста в пикселах.
outtextxy(cent_x, cent_y, text); // Вывод текста.
ellipse(cent_x, cent_y, 0, 360, width/2+20, height/2+20);// Эллипс.
getch();
}
// Закрытие графического режима.
closegraph();
puts(«Введите количество окружностей (до 1000).”);
gets(text);
int number = abs(atoi(text));
if(number > 1000) number = 1000;
// Инициализация графического режима.
initgraph(&gdriver, &gmode, «»);
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf(«Graphics error: %s\n», grapherrormsg(errorcode));
printf(«Press any key to halt:»);
getch();
exit(1); /* return with error code */
}
// КОНЦЕНТРИЧЕСКИЕ ОКРУЖНОСТИ ПРОИЗВОЛЬНОГО РАДИУСА
for(int i = 0; i < number; i++)
circle(cent_x, cent_y, rand()%240);
// Закрытие графического режима
getch();
closegraph();
return 0;
}
П р а к т и ч е с к о е з а д а н и е.
1. Создать описание и провести трансляцию программы, которая строит прямоугольную область со сторонами 150 х 180, рисует в центре окружность (радиусом R=22.5), а в углах — 4 эллипса, которые касаются сторон. Для окружности призвести заливку. Внутри эллипсов должна быть запись ELLIPSE разным типом шрифта.
