Первая страница
Наша команда
Контакты
О нас

    Головна сторінка



Та програмування

Та програмування




Сторінка3/11
Дата конвертації10.03.2017
Розмір2.35 Mb.
1   2   3   4   5   6   7   8   9   10   11

Лістинг 1.5. Рисування кіл за заданими координатами


#include

#include

#include

#include


int main(void)

{ int gdriver = DETECT, gmode, errorcode;

int midx, midy;

int radius = 100;


/* ініціалізація графіки */

initgraph(&gdriver, &gmode, "");


/* результат ініціалізації */

errorcode = graphresult();

if (errorcode != grOk)

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));



printf("Press any key to halt:");

getch();


exit(1);

}

midx = getmaxx() / 2;



midy = getmaxy() / 2;

setcolor(getmaxcolor());


//функція рисування кола

circle(midx, midy, radius);

getch();

closegraph();

return 0;

}


Рисунок 1.5 – Зображення результату роботи виконуваного файлу для прикладу 1.5
Лістинг 1.6. Використання генератора випадкових чисел для рисування прямокутників з різною товщиною контуру
#include

#include

#include

#include

#include

int main () {

int gdriver=DETECT, gmode, errorcode;

Результат, пі́дсумок, (заст. ску́ток, вислід) - кінцевий наслідок послідовності дій. Можливі результати містять перевагу, незручність, вигоду, збитки, цінність і перемогу. Результат є етапом діяльності, коли визначено наявність переходу якості в кількість і кількості в якість.
Генератор випадкових чисел (англ. Random number generator; часто скорочується як RNG, ГВЧ) - обчислювальний або фізичний пристрій, спроектований для генерації послідовності номерів чи символів, які не відповідають будь-якому шаблону, тобто є випадковими.

int X1,Y1,X2,Y2;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk) {

printf ("Graphics error: %s\n", grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

do {


getmaxcolor ();

setcolor (WHITE);

setlinestyle (random(4),0,random(10));

X1=random(getmaxx()); Y1=random(getmaxy());

X2=X1 random(getmaxx()); Y2=Y1 random(getmaxy());

if (X2>getmaxx()) X2=getmaxx();

if (Y2>getmaxy()) Y2=getmaxy();

rectangle (X1,Y1,X2,Y2);

delay(100);

} while (!kbhit());

return 0;

}


Рисунок 1.6 – Зображення результату роботи виконуваного файлу для прикладу 1.6
Лістинг 1.7. Рисування дуги

#include

#include

#include

#include
int main () {

int gdriver=DETECT, gmode, errorcode;

int maxX,x,y;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",



grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

maxX=getmaxx();



y=10;

for (x=25;x

{

setcolor (x);



arc (x,y,y60,x60,x/10);

y =x%2;


}

getch();


closegraph ();

return 0;

}

Рисунок 1.7 – Зображення результату роботи виконуваного файлу для прикладу 1.7
Лістинг 1.8. Рисування заповненого прямокутника
#include

#include

#include

#include


int main () {

int gdriver=DETECT, gmode, errorcode;

int x1, y1, x2, y2;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",



grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

x1=getmaxx()/2;



y1=getmaxy()/4;

x2=x1 25;

y2=y1*2;

setfillstyle (1,3);

bar (x1,y1,x2,y2);

getch ();

closegraph ();

return 0;

}

Рисунок 1.8 – Зображення результату роботи виконуваного файлу для прикладу 1.8
Лістинг 1.9. Рисування прямокутного паралелепіпеда
#include

#include

#include

#include


#define FALSE 0

#define TRUE 1


int main () {

int gdriver=DETECT, gmode, errorcode;

int x1,y1,x2,y2,depth,top;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",



grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

x1=getmaxx()/2;



y1=getmaxy()/4;

x2=x1 25;

y2=y1*2;

depth=10;

top=TRUE;

setfillstyle (1,3);

bar3d (x1,y1,x2,y2,depth,top);

getch ();

closegraph ();

return 0;

}

Рисунок 1.9 – Зображення результату роботи виконуваного файлу для прикладу 1.9
Лістинг 1.10. Програма для рисування еліпсів різних розмірів та кольорів
#include

#include

#include

#include

#include

#include

int main () {

int gdriver=DETECT, gmode, errorcode;

int xmax, ymax, radius;

randomize ();

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",



grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

xmax=getmaxx();



ymax=getmaxy();

radius=10;

while (radius

{

setcolor (1 abs(random(getmaxcolor())));



ellipse (xmax/2, ymax/2,0,360,radius,50);

ellipse (xmax/2, ymax/2,0,360,50,radius);

radius =10;

}

getch();



closegraph ();

return 0;

}

Рисунок 1.10 – Зображення результату роботи виконуваного файлу для прикладу 1.10
Лістинг 1.11. Рисування зафарбованих еліпсів
#include

#include

#include

#include

#include

int main () {

int gdriver=DETECT, gmode, errorcode;

int x,direction,count,xmax,ymax;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",



grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

xmax=getmaxx();



ymax=getmaxy();

x=20;


direction=1; count=5;

randomize ();

setcolor (WHITE);

while (!kbhit())

{

if ((x>xmax-50)||(x<=0))



{

direction=1;

count =5;

}

setfillstyle(random(12),



1 abs(random(getmaxcolor())));

fillellipse (x,ymax/2, count random(xmax/6),

count random(ymax/4));

x =(50-direction);

}

getch();


closegraph ();

return 0;

}
Лістинг 1.12. Креслення лінії
#include

#include

#include

#include

#include
int main () {

int gdriver=DETECT, gmode, errorcode;

int cmax,xmin,ymin,xmax,ymax;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",



grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch();

exit (1);

}

cmax=getmaxcolor();



xmax=getmaxx();

ymax=getmaxy();

xmin=0;

ymin=0;


while ((xmin

{

delay (25);



setcolor(random(cmax));

line(xmin,ymin,xmax,ymin);

line(xmin,ymax,xmax,ymax);

xmin ;


ymin ;

xmax--;


ymax--;

}

getch();



closegraph ();

return 0;

}

Рисунок 1.11 – Зображення результату роботи виконуваного файлу для прикладу 1.12
Лістинг 1.13. Креслення лінії щодо поточної позиції
#include

#include

#include

#include

#include

int main () {

int gdriver=DETECT, gmode, errorcode;

int cmax,xmax,ymax,color;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",



grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

cmax=getmaxcolor();



xmax=getmaxx();

ymax=getmaxy();

randomize();

while (!kbhit())

{

moveto(0,0);



color=1 random(cmax);

while (xmax>1)

{

setcolor(random(color));



linerel(xmax,0);

linerel(0,ymax);

linerel(-xmax,0);

linerel(0,-ymax);

xmax-=2;

ymax-=2;


moveto(getx() 1,gety() 1);

}

}



getch();

closegraph ();

return 0;

}


Рисунок 1.12 – Зображення результату роботи виконуваного файлу для прикладу 1.13
Лістинг 1.14. Формування ефекта мультиплікації
#include

#include

#include

#include

#include

int main () {

int gdriver=DETECT, gmode, errorcode;

int dx,dy,x,y,maxx,maxy;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",



grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

maxx=getmaxx();



maxy=getmaxy();

dx=maxx/4;

dy=maxy/4;

bar3d(dx,dy,maxx-dx,maxy-dy,30,6);

setwritemode (XOR_PUT);

do

{



x=random(maxx-dx);

y=random(maxy-dy);

rectangle(x,y,x dx,y dy);

delay(200);

rectangle(x,y,x dx,y dy);

} while (!kbhit());

closegraph();

return 0;

}

Рисунок 1.13 – Зображення результату роботи виконуваного файлу для прикладу 1.14
Керування кольорами і шаблонами заливання (фарби, палітра, заповнення)

Функція getcolor() повертає значення коду поточного кольору.

Функція getmaxcolor() повертає значення типу int, що містить максимально доступний код кольору, який можна використовувати для звертання до setcolor().

Функція setpalette( int colornum,int color) заміщує один із кольорів в палітрі (colornum – вказує номер кольору в палітрі).


Функція заливання (шаблон заповнення)

void setfillpattern(const char far *__upattern, int __color);

Функція setfillpattern встановлює тип заливання і її колір для всіх типів заливання, які виконуються функціями fillpoly(), bar(), floodfill(), bar3d(), pieslicе().

Функція встановлює зразок і колір заливання (для функцій fillpoly(), bar(), bar3d(), pieslise()).

Всі дозволені значення зразків визначені в бібліотеці graphics.h у вигляді сталих.

Ось декілька прикладів:

EMPTY_FILL=0; суцільне заливання кольором фона;

SOLID_FILL=l; суцільне заливання поточним кольором;

LINE_FILL=2; заливання лініями;

HATCH_FILL=7; заливання рідким штрихуванням;

USER_FILL=12; заливання визначене програмістом.

color колір, яким виконується шаблон, колір фону при цьому залишається незмінним.


Заливання областей зображення

Існує ряд функцій, які рисують графічні фігури і одразу ж заповнюють їх за заданим шаблоном:

bar(int left, int top, int right, int bottom) рисує прямокутник, внутрішня область якого залита за поточним шаблоном.
Лістинг 1.15. Заливання області
do

{

r=random(getmaxcolor());



setfillstyle(l,7);

xl=random(getmaxx());

yl=random(getmaxy());

x2=random(getmaxx() / 2);

y2=random(getmaxy() / 2);

bаr(х1,у1,х2,у2);

delay(200);

} while(!kbhit());


Функція bar3d(int left, int top, int right, int bottom, int depth, int topflag) рисує паралелепіпед, лицьова сторона якого заливається за поточним шаблоном, а глибина задається в пікселах параметром depth.
Лістинг 1.16. Заливання області
setfillstyle(l,7);

X1=random(getmaxx());

Y1=random(getmaxy());

X2=random(getmaxx());

Y2=random(getmaxy());

bar3d(xl,yl,x2,y2,15,True);

delay(200);

bar3d(xl,yl,x2,y2,15,False);

delay(200);

bar3d(80,100,120,180,15,True);

getch(0);
Функція fillellipse(int x, int y, int xradius, int yradius ) рисує еліпс поточним кольором і зaповнює його за встановленим шаблоном.
Приклад:

setfillstyle(l,11);

setcolor(7);

fillellipse(xl,yl,x2,y2);


Заповнення більш складних геометричних фігур, в тому числі і неправильної форми, виконується функцією fillpoly(int numpoints, const int far *polypoints).
Геоме́трія (від дав.-гр. γη - Земля і μετρέω - вимірюю; землеміряння) - розділ математики, наука про просторові форми, відносини і їхні узагальнення.

Функція floodfill(int x, int y, int border) заливає всю область навколо точки (x, y), обмежену лініями кольору border. Наприклад, якщо точка (х, у) знаходиться всередині області, обмеженій колом, то вся область буде залита за шаблоном і кольором, встановленим функціями setfillpattern() або setfillstyle(). Якщо точка знаходиться поза цією областю, то залитим буде весь екран за винятком цієї області.


1.5 Ефекти мультиплікації
Функція setwritemode( int mode ) задає режим порозрядного суміщення зображень, тобто режим, в якому при накладанні 2-х точок стирається або ні нижня точка (спосіб зняття верхнього зображення з екрана).

Дві послідовно проведені логічні операції XOR_PUT приведуть біти пам'яті монітора в початковий стан. Це означає, що якщо на екрані присутнє якесь зображення, то його можна використати як фон, нарисувати на ньому довільний рисунок, а потім відновити первинний вигляд.

Відно́влення (рос. восстановление, англ. reduction; нім. Reduktion f) -- це процес приєднання електронів речовиною, при цьому ступінь окиснення її елементів знижується.
При ініціалізації і після зміни режимів встановлювати режим COPY_PUT.

Режим setwritemode() розповсюджується тільки на рисування відрізками, тобто функціями line(), lineto(), linerel(), rectangle(), drawpoly().
1.6 Робота з фрагментами зображення
Для запам’ятовування в буфері і відновлення з нього прямокутних фрагментів графічного зображення використовуються три функції. Це дуже зручно, оскільки дозволяє оперувати готовими елементами зображень.

imagesize(int left, int top, int_right, int bottom);

getimage(int left, int top, int right, int bottom, void far *bitmap);

putimage(int left, int top, const void far *bitmap, int op);.

Функція imagesize() дозволяє визначити розмір прямокутного фрагмента в байтах. Прямокутник визначається координатами діагоналі (х1, у1), (х2, у2). Ця функція використовується разом з функцією malloc(). Записується зображення в буфер за допомогою функції getimage(), в якій параметри xl, yl, x2, y2 мають те ж значення, що в imagesize(). Параметр bitmap – нетиповий, повинен бути більше чи дорівнювати 4 розмір пам'яті, відведеної для області екрана (максимальний розмір збережуваного зображення не повинен перевищувати 64К) і є зміною-буфером (4 байти = 2 слова, які містять ширину і висоту в пікселях зображення, що запам’ятовується).

Функція putimage(). Найбільш цікавим в цій функції є можливість визначити режим виведення зображення: можна додавати зображення на екрані і зображення в буфері;

Додавання - бінарна арифметична операція, суть якої полягає в об'єднанні математичних об'єктів.
можна знищити зображення, яке знаходиться в певній області; можна інвертувати зображення, яке міститься в буфері. Ці операції задаються параметром op, для якого визначені такі сталі:

COPY_PUT=0; операція MOV (заміщення);

XOR_PUT=l; операція XOR;

OR_PUT=2; операція OR;

AND_PUT=3; операція AND;

NOT_PUT=4; операція NOT.
Для формування динамічної складної картинки необхідно:


  1. Вибрати розміри прямокутника, який містить динамічний об'єкт, тобто визначаються координати діагоналі (XI,YI) (X2,Y2).
    Дина́міка (грец. δύναμις - сила) - розділ механіки,в якому вивчаються причини виникнення механічного руху. Динаміка оперує такими поняттями, як маса, сила, імпульс, момент імпульсу, енергія.





  1. Визначити крок приросту (для організації руху) по осях Х і Y: SxMove і SyMove i кінцеву точка руху (Xn, Yn) в межах використовуваного екрана.




  1. Задати тип заливання: функція setfillstyle();

  2. Вибрати фонову картинку та її заливання;

  3. Задати розмір динамічної картинки
    Size =imagesize(xl,yl.x2,y2);

  4. Утворити стек (буфер) в буферній пам'яті з однаковим визначенням його початкової адреси malloc(size);

  5. Завантажити фрагмент в буфер getimage(xl,yl,x2,y2,p);

  6. В циклі багатократнообраний фрагмент вивантажується з пам'яті функцією putimage() зі змінними координатами руху putImage(sx, sy,p, XOR_PUT); sx=x dx, sy=y dy;

  7. Після закінчення рисування необхідно очистити буфер процедурою free(Size).

Лістинг 1.17. Робота з фрагментами зображень з використанням функцій

imagesize(), getimage(), putimagе()

#include

#include

#include

#include

#define ARROW_SIZE 10

void draw_arrow(int x, int y);

int main(void)

{

int gdriver = DETECT, gmode, errorcode;



void *arrow;

int x, y, maxx;

unsigned int size;

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();

if (errorcode != grOk)

{printf("Graphics error: %s\n",

grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();


exit(1);

}

maxx = getmaxx();



x = 0;

y = getmaxy() / 2;


/* рисування зображення, яке буде рухатись */

draw_arrow(x, y);


/* визначення розміру зображення */

size = imagesize(x, y-ARROW_SIZE, x (4*ARROW_SIZE), y ARROW_SIZE);


/* відведення пам’яті під зображення*/

arrow = malloc(size);


/* захоплення зображення*/

getimage(x, y-ARROW_SIZE, x (4*ARROW_SIZE), y ARROW_SIZE, arrow);

while (!kbhit())

{
/* вирізання попереднього зображення */

putimage(x, y-ARROW_SIZE, arrow, XOR_PUT);

x = ARROW_SIZE;

if (x >= maxx) x = 0;
/* вставляння нового зображення */

putimage(x, y-ARROW_SIZE, arrow, XOR_PUT);

}

free(arrow);



closegraph();

return 0;

}

void draw_arrow(int x, int y)



{
/* рисування стрілки на екрані */

moveto(x, y);

linerel(4*ARROW_SIZE, 0);

linerel(-2*ARROW_SIZE, -1*ARROW_SIZE);

linerel(0, 2*ARROW_SIZE);

linerel(2*ARROW_SIZE, -1*ARROW_SIZE);

}

Рисунок 1.14 – Зображення результату роботи виконуваного файлу для прикладу 1.17
Лістинг 1.18. Робота з фрагментом зображення і формування динамічної картинки
#include

#include

#include

#include

#include
const r=10; // радіус рухомої кулі

void GrInit ();// прототип функції ініціалізації графіки


void main () {

int x1,y1,x2,y2,sx,sy;

Прототип (від грец. грец. πρῶτος - перший і τύπος - відбиток, відбиток) - прообраз, зразок, оригінал.
// змінні для оживлення фрагмента

int maxx,maxy,sxmove,symove;

int size;// розмір фрагмента

char *p; // вказівник на буфер

GrInit();// виклик функції ініціалізації графіки


/* максимальне поле екрана */

maxx=getmaxx();

maxy=getmaxy();
/*координати області екрана, в якому нарисовано кульку і яка буде збереженим фрагментом*/

x1=(maxx/2)-r;

y1=(maxy/2)-r;

x2=x1 2*r;

y2=y1 2*r;

sx=x1;


sxmove=3;// початкова точка руху

sy=y1;


symove=-1;// крок переміщення кульки

setfillstyle(1,RED);

Переміщення - зміна положення якогось матеріального об'єкту. В фізиці - це переміщення фізичного тіла. Переміщенням також називають вектор, який характеризує цю зміну. Має властивість адитивності. Абсолютна величина переміщення, тобто довжина відрізка, що сполучає початкову й кінцеву точку, вимірюється в метрах у системі СІ та в сантиметрах у системі СГС.
// вибір типу заливання

pieslice(x1 r,y1 r,0,360,r);// рисування кульки

size=imagesize(x1,y1,x2,y2);// розмір фрагмента в байтах

/*розміщення буферу (оператор new відводе місце в size байт в пам’яті, присвоюючи адресу його початку вказівнику p */

p=new char(size);

getimage (x1,y1,x2,y2,p); // фрагмент в буфер

setfillstyle (CLOSE_DOT_FILL,BLUE);// тип заливання фону

bar (50,50, maxx-50, maxy-50);// фонова картинка

do { // починається рух кульки

putimage (sx,sy,p,XOR_PUT);// виведення кульки

delay (10);// затримка 10 мс

putimage (sx,sy,p,XOR_PUT);// стирання кульки

/* обмеження на рух кульки в рамках поля */

if ((sx<50)||(sx>maxx-50-2*r)) sxmove=-sxmove;

if ((sy<50)||(sx>maxy-50-2*r)) symove=-symove;

/* наступна точка появи на екрані кульки, доки не натиснута

1   2   3   4   5   6   7   8   9   10   11