ПРИЕМЫ ПРОГРАММИРОВАНИЯ ГРАФИЧЕСКОГО РЕЖИМА



Подключение графической библиотеки

 

Для подключения графической библиотеки можно использовать один из двух приемов. Во-первых, включить в меню оболочки 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!