ПРИЕМЫ ПРОГРАММИРОВАНИЯ ГРАФИЧЕСКОГО РЕЖИМА
Подключение графической библиотеки
Для подключения графической библиотеки можно использовать один из двух приемов. Во-первых, включить в меню оболочки BC++3.1 опцию Options-Linker-Libraries-Graphics library. Во-вторых, создать проект и включить в него исходные cpp-файлы и библиотеку LIB\graphics.lib.
Графический режим может не работать в оболочке, если не хватает места в динамической памяти. Следует увеличить ее размер в пункте Options-Debugger-Heap size.
Инициализация графического режима
Простейшую инициализацию осуществляет следующий код
#include <graphics.h>
void main()
{
int gd = DETECT, gm;
initgraph( &gd, &gm, “c:\\bc31\\bgi” );
// работаем в графическом режиме
putpixel(100, 200, WHITE);
// ……….
If(!getch())
getch();
closegraph();
}
Включение драйвера и шрифтов в исполняемый файл
Для включения графического драйвер egavga.bgi в исполняемый файл необходимо:
а) в командной строке выполнить
C:\BC31\BGI\bgiobj.exe egavga
и получить файл egavga.obj;
б) создать проект в оболочке с помощью команды меню Project-Open и включить в него файл egavga.obj и исходные cpp-файлы;
в) затем в тексте программы записать код
registerbgidriver(EGAVGA_driver);
initgraph(&gd, &gm, “”);
Для включения графических шрифтов (файлов с расширением chr) в исполняемый файл необходимо:
а) в командной строке выполнить
C:\BC31\BGI\bgiobj.exe goth
и получить файл goth.obj;
б) создать проект в оболочке с помощью команды меню Project-Open и включить в него файл goth.obj и исходные cpp-файлы;
в) затем в тексте программы записать код
|
|
registerbgifont(GOTHIC_font);
initgraph(&gd, &gm, “c:\\borlandc\\bgi”);
//…………………
settextstyle(GOTHIC_FONT, HORIZ_DIR, 10);
outtext(“Hello”);
//…………………
Рисование геометрических фигур
а) Нарисуем красное солнце
setcolor(RED);
circle(100, 100, 50); //красная окружность
setfillstyle(SOLID_FILL, RED);
floodfill(100, 100, RED); /* рисуем красный круг, указывая внутреннюю точку области и цвет контура */
б) Нарисуем в центре экрана квадрат со стороной a, повернутый относительно центра C на угол j против часовой стрелки. Пусть С(x0, y0) – математические координаты точки. Тогда вершины неповернутого квадрата имеют координаты
(x0 + (sqrt(2) / 2) · a · cos( p/4 + p/2 · k),
y0 + (sqrt(2) / 2) · a · sin( p/4 + p/2 · k)), где k = 0, 1, 2, 3.
При повороте на угол j получаем математические вершины
(fk, gk) = (x0 + (sqrt(2) / 2) · a · cos( p/4 + p/2 · k + j),
y0 + (sqrt(2) / 2) · a · sin( p/4 + p/2 · k + j)),
где k = 0, 1, 2, 3.
В соответствии с данными, приведенными п.2.11, переводим математические координаты (fk, gk) в координаты пикселей (uk, vk). Затем определяем целочисленный массив A координат вершин замкнутого многоуольника
{u[0], v[0], u[1], v[1] , u[2], v[2], u[3], v[3], u[0], v[0] }.
Теперь рисуем квадрат с помощью одной функции
drawpoly(5, A);
Выделение памяти под большие одномерные массивы
Элементами массивов могут быть структуры большого размера. Если и размер массива значителен, то выделить динамическую память под такой массив одним вызовом функции malloc нельзя. Прототип этой функции
|
|
void *malloc( unsigntd int T);
Поэтому максимальный размер блока памяти, который она выделяет, не превосходит 64К.
Предлагается эмулировать одномерный динамический массив двумерным динамическим массивом с использованием массива
указателей.
Например, выделим память под long T=50000l структур
struct comp {
float re, im;
};
Общий размер такого массива равен 50 000 * 8 = 400 000 байт. Выберем размеры двумерного массива
int m = 1000; // количество столбцов выбираем произвольно
int n = (int)((T – 1)/ m) +1; // количество строк, нумерация строк
с нуля
В последней (m-1)-й строке прямоугольной динамической матрицы m ´ n могут содержаться элементы, не принадлежащие исходному одномерному массиву. Поэтому при переборе элементов массива необходима соответствующая проверка.
comp ** A = NULL;
A = (comp **) malloc( m * sizeof(comp *));
// проверка выделения памяти
for(int i=0; i < m; i++)
A[i] = (comp *) malloc(k * sizeof(comp));
// проверка выделения памяти
for( i =0; i < m; i++)
for( int j =0; j < n; j++)
if( (long) i*k+j < T) // работаем только с элементами
// исходного одномерного массива {
|
|
A[i][j].re = 0;
A[i][j].im = 0;
}
// работа программы
// освобождение памяти
for( i =0; i < m; i++)
free(A[i]);
free(A);
Вывод числовой информации
Для вывода форматированных данных используется двухэтапный алгоритм. Вначале данные записываются в строку или, как иногда говорят, в память. Затем строка выводится на графический экран.
Например выведем вещественное число с двумя знаками после запятой.
char buf[5];
float x = 3.1415;
sprintf(buf, “%4.2”, x);
outtextxy(100, 100, buf);
Цифра 4 в форматной строке задает количество байтов в памяти, которые будет занимать выводимая форматированная информация без учета признака конца строки. Прием используется для предотвращения выхода за диапазон массива. Подобная ошибка возникла бы в случае
x = 13.1415.
Задержка экрана
Организация задержки экрана не зависит от выбора графического или текстового режима, и реализуется следующим образом
if (!getch())
getch();
Данный код корректно обрабатывает два возможных случая. Во-первых, при нажатии обычной клавиши. При этом с клавиатуры в буфер ввода помещается ненулевой ascii-код символа, соответствующего нажатой клавише. Тогда условие !getch() ложно и второй getch() не вызывается.
Во-вторых, при нажатии клавиши с расширенным кодом (например, функциональные клавиши, стрелки) с клавиатуры в буфер ввода поступают два числа: ноль и scan-код этой клавиши. Тогда условие !getch() истинно, вызывается второй getch(), который считывает scan-код и тем самым очищает буфер.
|
|
Другим способом задержки экрана является код
while(!getch())
;
Отметим, что стандартным способом задержки (в учебниках и примерах из справок по функциям) является вызов функции
getch();
Однако этот способ некорректно обрабатывает нажатие клавиши с расширенным кодом. В данном случае в буфере останется один непрочитанный символ, который будет считываться при следующем вводе информации.
Дата добавления: 2019-07-17; просмотров: 315; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!