Некоторые графические функции
line (x, y, x1, y1) – чертит на экране прямую линию от точки с координатами (х, у) до точки (х1, у1);
circle (x, y, radius) – рисует окружность с центром в точке с координатами (x, y) и радиусом radius (в пикселях);
arc (x, y, w1, w2, radius) –строит дугу окружности с центром (x, y), радиусом radius, w1 -уголначальной точки дуги, w2 – угол конечной точки дуги; углы задаются в градусах, отсчет от горизонтальной оси, направленной слева направо, против часовой стрелки;
fillellipse (x, y, xr, yr) –строит эллипс с центром (x, y), xr, yr – полуоси эллипса;
ellipse (x, y, w1, w2, xr, yr) – рисует дугу эллипса с центром (x, y), w1, w2 – углы начальной и конечной точек дуги, xr, yr – полуоси эллипса;
lineto (x, y ) –рисует линию из текущей точки в точку с координатами (х, у);
moveto (x, y ) – перемещает текущую точку в точку (х, у);
rectangle (x, y, x1, y1) – рисует прямоугольник (x, y, x1, y1) – координаты левого верхнего и правого нижнего углов прямоугольника);
bar (x, y, x1, y1) –строит прямоугольник, закрашенный текущим орнаментом и цветом заполнения;
setlinestyle (x, y) – устанавливает ширину и стиль линии (x и y): 0-сплошная, 1-пунктирная, 2 – штрихпунктирная, 3 – штриховая, 4 – заданная пользователем; толщина линий 1 – нормальная, 3 – толстая.
Цвет и шаблон заполнения замкнутой области устанавливаются функцией: setfillstyle ( pattern, color ).В таблице 3 представлены значения шаблонов закрашивания.
Таблица 3.Шаблоны закрашивания (pattern)
Макрос | Значение | Вид заполнения |
EMPTY_FILL | заполнение цветом фона | |
SOLD_FILL | однородное заполнение цветом | |
LINE_FILL | заполнение линиями --- | |
LSTLASH_FILL | заполнение косыми /// | |
SLASH_FILL | заполнение яркими /// | |
BKSLASH_FILL | заполнение \\\ | |
LTBKSLASH_FILL | заполнение яркими \\\ | |
HATCH_FILL | заполнение клеткой | |
XHATCH_FILL | заполнение косой клеткой | |
INTERLEAVE_FILL | заполнение частой сеткой | |
WIDE_DOT_FILL | заполнение редкими точками | |
CLOSE_DOT_FILL | заполнение частыми точками | |
USER_FILL | заполнение определяется пользователем |
Для закрашивания замкнутого контура служит функция:
floodfill (x, y, color ) где х, у – координаты внутри контура, color – цвет контура.
Для вывода текста в графическом режиме используются функции:
outtext (‘текст’) –выводит текст с текущей позиции;
outtextxy (x, y, ’ текст ’) – выводит текст с заданной позиции (x, y).
Пример 1. Программа, которая строит 10 окружностей по оси х и заполняет их различными стилями.
Порядок выполнения работы
1) Открывается система программирования 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 | копия источника с инверсией |
Пример 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();
}
Варианты заданий к лабораторной работе № 12
Задача 1. В каждом варианте требуется табулировать заданную функцию F на отрезке [Хst; Хen] с шагом Step и построить её график; действительные числа Хst, Хen и Stepвводятся интерактивно. Напишите и отладьте программу согласно своему варианту.
Вариант 1.
Вариант 2.
Вариант 3.
Вариант 4.
Вариант 5.
Вариант 6.
Вариант 7.,
Вариант 8.
Вариант 9.
Вариант 10.
Вариант 11.
Вариант 12.
Вариант 13.
Вариант 14.
Вариант 15.
Задача 2. Изобразить на экране движение фигуры.
Вариант 1. Шар движется влево до соприкосновения со стеной и обратно с разными скоростями.
Вариант 2. Восход солнца.
Вариант 3. Плывущий корабль.
Вариант 4. Облако с дождём.
Вариант 5. Движение стрелы под углом 30° к горизонтали .
Вариант 6. Движение прямоугольника по диагонали из правого нижнего угла в левый верхний.
Вариант 7. Построить точку, двигающуюся по окружности.
Вариант 8. Взлёт ракеты.
Вариант 9. Две точки вращаются в одном направлении.
Вариант 10.Две точки вращаются в противоположных направлениях.
Вариант 11. Построить точку, двигающуюся по синусоиде.
Вариант 12. Построить изображение стрелы, передвигающейся в направлении под углом в 45° к горизонтали.
Вариант 13. Шар движется влево до соприкосновения со стеной и обратно с разными скоростями.
Вариант 14. Шар движется вниз до соприкосновения с линией и обратно с разными скоростями.
Вариант 15. Изобразить ползущую змею.
Содержание отчета
· цель работы;
· задание;
· код программы;
· блок-схема;
· результаты работы программы;
· выводы по работе.
Список литературы
1. Ален И. Голуб. Правила программирования на C и С++. Пер. с англ.: – М.: Вильямс, 2001. – 241 с.
2. Павловская Т.А. С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2010.
3. Прата С. Язык программирования С++. Лекции и упражнения. СПб.: Питер, 2003. – 645 с.
Учебное издание
МАМОНОВА Татьяна Егоровна
ГРАФИКА В С++
Методические указания по выполнению лабораторных работ
по курсу «Информатика» для студентов I курса, обучающихся по направлениям 220000 – «Мехатроника и робототехника»,
220700 – «Автоматизация технологических процессов и производств».