Рисование изображений в 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,®s,®s);
}
//спрятать курсор
void hidecursor(void){
regs.x.ax = 0x02;
int86(0x33,®s,®s);
}
//получение статуса мыши
void get_mouse_status(int& button,int& x,int& y){
regs.x.ax = 0x03;
int86(0x33,®s,®s);
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!