- •«Национальный исследовательский
- •Т.Е. Мамонова Лабораторная работа № 12
- •220700 – «Автоматизация технологических процессов и производств».
- •Лабораторная работа № 12
- •Теоретическая часть
- •Цвет устанавливается функцией:
- •Функции для работы с терминалом в текстовом режиме (файл conio.H)
- •Некоторые графические функции
- •Порядок выполнения работы
- •Варианты заданий к лабораторной работе № 12
- •Содержание отчета
- •Список литературы
- •220700 – «Автоматизация технологических процессов и производств». Отпечатано в Издательстве тпу в полном соответствии с качеством предоставляемого оригинал-макета
- •634034, Г. Томск, пр. Ленина, 30
Порядок выполнения работы
-
Открывается система программирования BCW (Borland C++ for Windows) и создаётся в ней новый проект:
-
File – New – Project…
2) в появившемся окне (рис. 2) в строке «Project Path and Name» указывается путь к проекту (файл с расширением ide);
Рис. 2.
3) в выпадающем списке «Platform» выбирается платформа DOS (Standart); если в программе будут вызываться графические функции, то устанавливается флажок BGI в окне Libraries;
4) щелчок по OK, а затем двойной щелчок по выделенному имени cpp-файла, рис. 3, откроет окно редактора, в котором набирается текст программы.
Рис. 3.
#include <graphics.h>
#include <conio.h>
#include <dos.h>
void main ( void )
{
int y = 200, r = 15, x= 5, i ;
int a , b;
a = DETECT; // автоматическое определение драйвера
initgraph ( &a, &b, “c:\\bc5\\bgi\\” ); /* путь к бибилиотеке BGI */
for ( i = 0; i <= 10; i++)
{
setcolor( i );
circle(x, y, r );
setfillstyle(i, i);
floodfill(x, y, i);
x+=60;
delay(500);
}
getch( );
closegraph( );
}
Блок-схема программы:
Пример 2. Используя оператор цикла с параметром, табулировать1 функцию на отрезке [Хst; Хen] с шагом Step и построить её график.
# include <iostream.h> // cin, cout
# include <iomanip.h> // setprecision, setw
# include <conio.h> // clrscr(), getch()
# include <math.h> // sin(x)
# include <graphics.h>
# include <stdlib.h> // exit
// Объявление прототипов функций:
float F(float x);
void tabular_for(float Xst, float Xen, float Step);
float Fmodif(float x);
void graphF(float Xst, float Xen, float Step, int color);
void main()
{ clrscr();
float Xst, Xen, Step;
cout << "Tabulirovanie F(x).\n";
cout << "Xstart = "; cin>>Xst;
cout << "Xend = "; cin>>Xen;
cout << "Step = "; cin>>Step;
tabular_for(Xst, Xen, Step);
getch();
cout<<"\n Grafik F(x).\n";
cout<<"Xstart ="; cin>>Xst;
cout<<"Xend = "; cin>>Xen;
cout<<"Step = "; cin>>Step;
graphF(Xst, Xen, Step, 1); }
// Объявление функций:
float F(float x)
{ if(x == 0) return 1; else return sin(x)/x; }
void tabular_for(float Xst, float Xen, float Step)
{for(float x = Xst; x <= Xen; x += Step)
{ cout<<"\n x = " << setw(6)<<setprecision(2)<<x; // манипуляторы;
cout<<" F(x) = "<<setw(6)<<setprecision(3)<<F(x);
} }
float Fmodif(float x)
{ if(x != 0) return sin(x/6)/(x/6); else return 1; }
void graphF(float Xst, float Xen, float Step, int color)
{int gd=DETECT, gm, err;
// инициализации модуля graph:
initgraph(&gd, &gm, "с:\\bc5\\bgi");
// проверка результата инициализации:
err = graphresult();
if (err != grOk) // ошибка инициализации!
{cout<<"\n Error: "<< grapherrormsg(err); // характер ошибки;
cout<<"\nEnter any kay:";
getch();
exit(1); // завершение программы с кодом ошибки 1;
}
setbkcolor(15); // цвет фона;
setcolor(color); // цвет линий;
// координаты середины графического экрана:
int cX= (int) getmaxx()/2, cY= (int) getmaxy()/2;
float x, y;
line(0, cY, 2*cX, cY); // ось координат OX;
line(cX, 0, cX, 2*cY); // ось координат OY;
// строим график функции:
for(x = Xst; x <= Xen; x += Step)
{ y = Fmodif(x); putpixel( (int) x + cX, (int) -40*y + cY, color); }
getch(); }
Примечание. Все сведения по графическим функциям языка C++ можно найти в Help-файле (\HELP\bcdos.hlp – Borland Graphic Interface (BGI)).
Результат работы проекта:
табулирование функции F(x) на отрезке [-1; 1] с шагом 0,4:
Движение фигур в C++
Движение в С++ осуществляется функциями getimage, imagesize, putimage и putpixel. Опишем каждую из них.
getimage – копирует образ с экрана в память. Общий синтаксис:
#include <graphics.h>
void getimage (int left, int top, int right, int bottom, void far *bitmap),
где left, top, right и bottom определяют область экрана прямоугольной формы, которая будет скопирована, bitmap указывает на область в памяти, куда записывается битовый образ. Первые два слова этой области задают ширину и высоту прямоугольника, оставшиеся определяют сам образ. Функция уникальна для Borland C++. Она работает только на компьютерах IBM PCи совместимых с ними, оснащённых дисплейными адаптерами, поддерживающими графический режим. Функция не совместима с Windows.
imagesize – определяет области памяти, требуемой для хранения битового образа. Если размер, требуемый для выбранного образа больше или равен 64К-1 байт, imagesize возвращает 0xFFFF(-1). Общий синтаксис:
#include <graphics.h>
unsigned far imagesize (int left, int top, int right, int bottom).
putimage – помещает битовый образ, ранее сохранённый с помощью getimage, обратно на экран. Общий синтаксис:
#include <graphics.h>
void getimage (int left, int top, void far *bitmapб int op),
где точка left и top – координаты точки образа, находящейся в левом верхнем углу образа, bitmap – указывает области памяти, в котором хранится требуемый образ, op – параметр, который определяет составной оператор, предназначенный для определения вычисления цвета каждой точки экрана, основываясь на существующей уже на экране точке и соответствующей точке образа памяти.
Перечень значений putimage_op даёт названия операциям, представленным в таблице 4.
Таблица 4. Значения putimage_op
Имя |
Значение |
Описание |
COPY_PUT |
0 |
копия |
XOR_PUT |
1 |
исключающее «или» |
OR_PUT |
2 |
«или» |
AND_PUT |
3 |
«и» |
NOT_PUT |
4 |
копия источника с инверсией |
putpixel – выводит пиксель в заданную точку экрана. Общий синтаксис:
#include <graphics.h>
void putpixel (int x, int y, int color),
где x и y – координаты точки, color – цвет точки
Пример 3. С помощью функции getimage и putimage изобразить фигуру, движущуюся случайным образом по экрану на фоне звездного неба. Звездным небом называется множество точек на экране, цвет и координаты которых вычисляются с помощью генератора случайных чисел.
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
int change(int current)
{
if (random(32767) > 30000)
{
switch (random(5))
{
case 0: return -2;
case 1: return -1;
case 2: return 0;
case 3: return 1;
case 4: return 2;
}
}
return current;
}
void main(void)
{
int gd = VGA, gm = VGAHI, i;
int StartX = 100, StartY = 50, r = 20;
int ulx, uly, lrx, lry, width, height, size;
int dx = 0, dy = 0;
int do_job = 1;
void *img;
initgraph(&gd, &gm, "c:\\bc5\\bgi");
setfillstyle(SOLID_FILL, getmaxcolor());
fillellipse(StartX, StartY, r, (r / 3) + 2);
ellipse(StartX, StartY - 4, 190, 357, r, r / 3);
line(StartX + 7, StartY - 6, StartX + 10, StartY - 12);
circle(StartX - 10, StartY - 12, 2);
line(StartX - 7, StartY - 6, StartX - 10, StartY - 12);
circle(StartX + 10, StartY - 12, 2);
ulx = StartX - (r + 1);
uly = StartY - 14;
lrx = StartX + (r + 1);
lry = StartY + (r / 3) + 3;
width = lrx - ulx + 1;
height = lry - uly + 1;
size = imagesize(ulx, uly, lrx, lry);
img = malloc(size);
getimage(ulx, uly, lrx, lry, img);
cleardevice();
for (i = 1; i < 1000; i++)
putpixel(random(640), random(480), random(16));
while (do_job)
{
putimage(StartX, StartY, img, XOR_PUT);
delay(50);
putimage(StartX, StartY, img, XOR_PUT);
dx = change(dx);
dy = change(dy);
StartX += dx;
StartY += dy;
if (StartX > 639 - width) StartX = 639 - width;
if (StartY > 479 - height) StartY = 479 - height;
if (StartX < 0) StartX = 0;
if (StartY < 0) StartY = 0;
if (kbhit()) do_job = (getch() != ' ');
}
closegraph();
}