Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л_12 (2 пары) Графика+.doc
Скачиваний:
24
Добавлен:
05.11.2018
Размер:
233.98 Кб
Скачать

Порядок выполнения работы

  1. Открывается система программирования BCW (Borland C++ for Windows) и создаётся в ней новый проект:

  • FileNewProject

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();

}