Рисование изображений в bmp-формате



 

Для создания фона в задаче о снегопаде можно использовать 16-ти цветный bmp-файл, так как это устраняет проблему самостоятельного рисования фонового изображения средствами языка C++. Для загрузки изображения из файла надо выполнить действия:

1) с позиции 22 в файле прочитать высоту рисунка;

2) вычислить ширину записанного изображения

ширина = (размер_файла - 118) / высота;

3) загрузить сам рисунок, начиная с позиции 118, учитывая, что в одном байте содержится 2 пикселя и то, что изображение в файле записано построчно, причем первая строка записана в конец файла, а последняя – с позиции 118.

// карта замещения цветов для создания визуального эффекта

char map[] = {0,12,2,6,9,5,3,8,7,4,10,14,1,13,11,15};

int y0 = getmaxy();

 

// Открываем картинку

 FILE *f = fopen(fon, "rb");

 if(f==NULL)

 return 2;

 

 // читаем ширину картинки

 fseek(f, 0, 2);

 long l = ftell(f)-118;

 fseek(f, 22, 0);

 int w,h;

 fread(&h, 2, 1, f);

 w = int(l / h);

 

// читаем и рисуем картинку

 fseek(f, 118, 0);

 int x=0;

 int y=0;

 while(1) {

 c = fgetc(f);

    if(feof(f))

 break;

    ch = map[c/16];

    cl = map[c%16];

    putpixel(2*x+0, y0-y, ch);

    putpixel(2*x+1, y0-y, cl);

    if(++x==w) {

 x=0;

 y++;

 }

 }

 fclose(f);

 

Работа с мышью

 

Вызовы BIOS используют программные прерывания. BIOS имеет несколько различных прерываний для разных целей. Для работы с мышью используют прерывание 0x33. Для доступа к этим прерываниям используется функция Си с прототипом в файле <dos.h>

int int86(int num, REGS *in, REGS *out);

где num – номер прерывания. Объединение REGS имеет вид

union REGS{

    struct WORDREGS x;

    struct BYTEREGS y;

};

struct WORDREGS{

    unsigned int ax, bx, cx, dx, si, di, cflags, flags;

};

struct BYTEREGS{

    unsigned char al, ah, bl, bh, cl, ch, dl, dh;

};

//Определим глобальную переменную

REGS regs;

//показать курсор

void showcursor(void){        

     regs.x.ax = 0x01;

     int86(0x33,&regs,&regs);

}

//спрятать курсор

void hidecursor(void){ 

regs.x.ax = 0x02;

     int86(0x33,&regs,&regs);

}

//получение статуса мыши

void get_mouse_status(int& button,int& x,int& y){

     regs.x.ax = 0x03;

     int86(0x33,&regs,&regs);

     button = regs.h.bl;

     x = regs.x.cx;

     y = regs.x.dx;

}

//пример использования мыши

main(){

//инициализация графического режима

int button, x, y;

char str[20];

showcursor();

while(1){

get_mouse_status(button, x, y);

if(x == 0 || y == 0)

    break;

sprintf(str, “%d %d”,x, y);

              outtext(30, 30, str);

}

hidecursor();

}


ЗАДАНИЯ ДЛЯ ЛАБОРАТОРНОЙ РАБОТЫ

Звездное небо

 

На экране в непрерывном режиме рисуются звезды (пиксели) в случайном месте и случайным цветом. Распределение случайных величин равномерное. При наложении новой звезды на другую видимую звезду обе стираются. Рисование прекращается нажатием клавиши Escape. Затем происходит подсчет числа видимых звезд, и процент заполнения неба выводится по центру графического экрана с точностью до сотых долей процента. Использовать готический шрифт размером 1 см.

Рисование звезд и их подсчет реализовать в виде отдельных функций. Получить ответ для двух режимов VGAHI и VGALO.

 

Снегопад

 

С верхней части и с боковых сторон экрана в непрерывном режиме падают белые снежинки в форме одного пикселя. Выход из программы по нажатию клавиши Escape. Снежинки пролетают экран и снова появляются. Создать на экране графический фон в виде голубого полумесяца, красивого текста и пр. Фон не содержит белого цвета и не должен перерисовываться.

Плотность снегопада вводится в начале программы в текстовом режиме. Максимальное количество снежинок равно 50 000. Параметры снежинки находятся в пользовательской структуре данных. Для хранения информации о снежинках следует использовать двумерный динамический массив структур.

Смещения снежинок содержат хаотическую составляющую по горизонтали и вертикали. Организовать управление ветром с помощью клавиш-стрелок.

Рисование графика функции

 

Нарисовать график функции y = f(x) на отрезке [a, b]. Вещественные границы интервала вводятся с клавиатуры в графическом режиме с возможностью редактирования. График необходимо масштабировать по ширине экрана так, чтобы отрезок [a, b] полностью вписался в экран.

Функция f(x) задается исходным кодом на языке Си. Осуществить проверку выхода переменной x из ОДЗ.

 

Вращение звезды

 

Написать функцию, которая рисует правильную пятиконечную цветную звезду, со следующими параметрами:

· x, y – математические координаты центра;

· R, r – математические радиусы внутренней и внешней окружностей;

· fi – угол между осью x и одним из больших лучей звезды, в радианах;

· col – цвет контура звезды;

· colfill – цвет заливки.

Написать также программу, в которой вращается красная звезда в центре экрана.


БИБЛИОГРАФИЧЕСКИЙ СПИСОК

 

1. Керниган Б. Язык программирования Си / Б. Керниган, Д. Ритчи. М.: Финансы и статистика, 1992. 272 с.

2. Керниган Б. Язык программирования Си. Задачи по курсу Си / Б. Керниган, Д. Ритчи. М.: Финансы и статистика, 1985. 192 с.

3. Юркин А.Г. Задачник по программированию / А.Г. Юркин. СПб.: Питер, 2002. 192 с.

4. Подбельский В.В. Программирование на языке Си: учеб. пособие / В.В. Подбельский, С.С. Фомин. М.: Финансы и статистика, 2005. 600 с.

5. Трофимов С.П. Программирование в Си. Организация ввода-вывода: метод. указания / С.П. Трофимов. Екатеринбург: УГТУ,1998. 20 с.

6. Трофимов С.П. Программирование в Си. Динамически распределяемая память: метод. указания / С.П. Трофимов. Екатеринбург: МИДО, 1998. 14 с.


Дата добавления: 2019-07-17; просмотров: 268; Мы поможем в написании вашей работы!

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






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