- Мавзу 11. Функция графиклари
- Функция графикларини қуриш
- Топшириқ: y = 3 sin(x) функция графикини 0 ва 2π интервалида қуриш.
- Тахлил:
- Максималь қиймат x = π/2 да ymax = 3
- Минималь қиймат x = 3π/2 да ymin = -3
- Муаммо: функция математик система координаталарида берилган, лекин координаталарни пикселларда кўрсатган холда экранда қуриш керак.
- Координаталарни алмаштириш
- Координаталарни математик
- системаси
- Координаталарни (пикселларда) экран системаси
- k – масштаб (тасвирнинг экрандаги бирлик қисмининг узунлиги)
- const a = 50, b = 200, k = 50;
- const float xmin = 0, xmax =2*M_PI;
- float x, y, h = 0.01;
- int xe, ye, w;
- w = (xmax - xmin)*k;
- line(a-10, b, a+w, b);
- line(a, 0, a, 2*b);
- for (x = xmin; x < xmax; x += h)
- {
- y = 3*sin(x);
- xe = a + k*x;
- ye = b - k*y;
- putpixel (xe, ye, 12);
- }
- Нуқтанинг экрандаги координаталари
- Нуқталар қандай бирлаштирилади?
- Агар биринчи нуқта
- (xэ,yэ)нуқтага ўтиш
- акс ҳолда
- (xэ,yэ) нуқтада қисм
- Харакат вариантини танлаш
- ўзгарувчи-флаг (фақат 1 ёки 0)
- int first;
- ...
- first = 1;
- for (x = xmin; x < xmax; x += h)
- {
- ...
- if ( first ) {
- moveto(xe, ye);
- first = 0;
- }
- else lineto(xe, ye);
- ...
- }
- "4": y = x2 функция графигини [-3,3] интервалида қуриш.
-
- "5": Функция (эллипс) графигини қуриш
Си тилида Дастурлаш - Топшириқ: Фигурани қуриш:
- Ўзига хос ҳусусияти: Учта ўхшаш фигуралар.
- Малум бўлган усуллар билан ечиш мумкинми?
- Нечта координаталарни билиш керак?
- Процедура – бу ёрдамчи алгоритм бўлиб, баъзи харакат, жараёнларни бажариш учун мўлжалланган.
- Қўлланилиши:
- Дастурнинг турли жойларида бир хил харакатларни бажариш
- Яхши тушунарли бўлиши учун дастурни (ёки бошқа процедурани) дастуростиларга бўлиш
- Ишлаб чиқиш тартиби:
- Бир хил ёки ўхшаш харакатларни ажратиш (учта фигура)
- Уларда умумийлик (ўлчови, форма, бурилиш бурчаги) ва фарқни (координаталар, ранг) топиш
- Фарқни номаълум ўзгарувчи кўринишида ёзиб олиш, улар процедура параметрлари бўлади
- void Tr( int x, int y, int c )
- {
- moveto ( x, y );
- lineto ( x, y-60 );
- lineto ( x+100, y );
- lineto ( x, y );
- setfillstyle ( 1, c );
- floodfill ( x+20, y-20, 15);
- }
- void main()
- {
- ...
- Tr(100, 100, LIGHTBLUE);
- Tr(200, 100, LIGHTGREEN);
- Tr(200, 160, LIGHTRED);
- ...
- }
- void Tr( int x, int y, int c)
- {
- ...
- }
- Хусусияти:
- Одатда процедуралар асосий дастурдан юқорида жойлашади
- Процедура номида формаль параметрлар санаб ўтилади, уларнинг номлари кўрсатилади, чунки ўзгариши мумкин
- Процедурани чақирганда қавс ичида маълум параметрлар кўрсатилади (сон ёки арифметик ифода) худди шу тартибда
- void Tr( int x, int y, int c )
- Tr ( 200, 100, LIGHTGREEN );
- Хусусияти:
- Процедура номида хар бир формаль параметрларнинг типи кўрсатилади
- Процедура ичида параметрлар ўзгарувчи сифатида фойдаланилади
- Процедурада қўшимча локал ўзгарувчиларни о эълон қилиш мумкин, лекин уларга бошқа процедуралар мурожат эта олмайди
- void A ( int x, float y, char z ) { ... }
- void A ( int x, float y, char z ) {
- int a2, bbc = 345;
- ... }
- Ўринларни қандай алмаштириш мумкин?
- Топшириқ: Иккита пиёла ичидаги массани ўрнини алмаштириш
- Топшириқ: иккита хотира ячейкасидаги маълумот ўрнини алмаштириш.
- Топшириқ: иккита ўзгарувчи қийматлари ўрнини алмаштирувчи процедура тузиш.
- Хусусияти: процедурада бажарилган ўзгартиришлар чақирилувчи дастурда маълум бўлиши керак
- void main()
- {
- int x = 1, y = 2;
- Swap ( x, y );
- printf ( "x = %d, y = %d", x, y );
- }
- void Swap ( int a, int b )
- {
- int c;
- c = a; a = b; b = c;
- }
- Бу процедура параметр нусхаси билан ишлайди
- Қўлланилиши: шундай қилиб процедура (ва функция) бир нечта қиймат қайтариши мумкин
- Мурожаат қилиш мумкин эмас
- Swap ( 2, 3 ); // сон
- Swap ( x+z, y+2 ); // ифода
- void Swap ( int & a, int & b )
- {
- int c;
- c = a; a = b; b = c;
- }
- Параметрларни ўзгартириш мумкин
- "4": Процедурадан фойдаланиб фигура қуринг.
-
- "5": Процедурадан фойдаланиб фигура қуринг.
Си тилида Дастурлаш - Анимация (инг. animation) – тасвирнинг экрандаги харакатио.
- Топшириқ: 400 га 400 пикселли кўк квадрат ичида чапдан ўнгга 20 га 20 сариқ квадрат харакатлансин. Esc клавишаси босилганда ёки кўк квадрат чегарасига етганда дастур ўз ишини тўхтатсин.
- Муаммо: объектнинг экрандаги харакати қандай тасвирланади?
- Боғлиқлиги: (x,y) координаталари орқали объект холати берилади
- Анимация принципи:
- (x,y) нуқтада объектни чизамиз
- бир неча миллисекундларда тўхташ
- Объектни ўчирамиз
- (x,y) координатларни ўзгартирамиз
- 1 қадамга ўтамиз
- Клавиша босилишини қандай “ушлаб олиш мумкин”?
- kbhit() – функция (ихтиёрий!) клавишага босилганлини аниқлайди (0 – босилмаган, не 0 – босилган).
- getch() – функция босилган клавиша кодини аниқлайди: 27 = Esc, 13 = Enter, 32 = пробел, …
- if ( kbhit() )
- printf(“Қандайдир клавиша босилган...");
- else printf(“босилмаган...");
- if ( kbhit() ) {
- printf(“Қандайдир клавиша босилган...");
- c = getch();
- printf(“Клавиша коди %d", c);
- }
- #include
- void main()
- {
- ...
- while ( x + 20 < 400 )
- {
- if ( kbhit() )
- if ( getch() == 27 ) break;
- ...
- }
- ...
- }
- Кўк квадрат чегарасидан чиқиб кетмагунча
- Майдон чегарасидан чиқиб кетмаслиги учун нима қилинади?
- Процедура (чизиш ва ўчириш)
- void Draw( int x, int y, int color )
- {
- setfillstyle ( 1, color );
- bar(x, y, x+20, y+20);
- }
- Ғоялар
- Битта процедура чизади ва ўчиради
- ўчириш = фон ранги билан чизиш
- Квадрат чегарасини тўхтатиб қўйиш (асосий дастурда)
- ранг: сариқ чизади, кўк ўчиради
- color ранги билан бутунлай бўяш
- void Draw ( int x, int y, int color )
- {
- ...
- }
- void main()
- {
- int d = DETECT, m;
- initgraph ( &d, &m, "c:\\borlandc\\bgi" );
- int x, y;
- setfillstyle(1, 9);
- bar(0, 0, 399, 399);
- x = 0; y = 240;
- while ( x + 20 < 400 )
- {
- if ( kbhit() )
- if ( getch() == 27 ) break;
- Draw ( x, y, YELLOW );
- delay ( 20 );
- Draw ( x, y, 9 );
- x ++;
- }
- closegraph();
- }
- Esc клавишаси бўйича чиқиш
- 20 мс кутамиз, керак
- #include
- "4": Иккита квадрат қарама-қарши томонга харакатланади:
-
- "5": иккита квадрат қарама-қарши томонга харакатланади ва кўк квадрат деворидан урилиб қайтади:
- Топшириқ: Кўк квадрат ичидаги сариқ квадрат стрелка-клавишалари орқали бошқариш. Клавишалар коди:
- чапга – 75 юқорига – 72 Esc – 27
- ўнгга – 77 пастга – 80
- Муаммо: харакат йўналиши қандай ўзгартирилади?
- Ечим:
- if нажата клавиша {
- получить код клавиши - code
- if (code == 27) break;
- if (code == 75) x --;
- if (code == 77) x ++;
- if (code == 72) y --;
- if (code == 80) y ++;
- }
- Агар клавиша босилиши рўй берса, ...
- switch ( code ) {
- case 75: x --; break;
- case 77: x ++; break;
- case 72: y --; break;
- case 80: y ++;
- }
- }
- void Draw (int x, int y, int color)
- {
- ...
- }
- Клавишага босилишини қайта ишлаш
- void main()
- {
- int x, y, code;
- ...
- while ( 1 ) {
- Draw(x, y, YELLOW);
- delay(20);
- Draw(x, y, 9);
-
-
- }
- }
- Пирпирашни қандай олиб ташланади?
- "4": Квадрат стрелкаларни босиш орқали харакатланади, лекин кўк квадрат чегарасидан чиқиб кета олмайди:
-
- "5": Квадрат узлуксиз харакатланади, стрелкаларни босганда йўналишини ўзгартиради ва кўк квадрат чегарасига урилиб қайтади:
- Топшириқ: Ерни Қуёш атрофида айланишини тасвирлаш.
- Муаммо: айлана бўйлаб харакатланганда координаталар қандай ўзгартирилади?
- Ечиш: α бурилиш бурчагини номаълум ўзгарувчи сифатида фойдаланиш (циклда ўзгартириш)
- x = x0 + L·cos(α)
- y = y0 – L·sin(α)
- void Draw( int x, int y, int color )
- {
- const r = 10;
- setcolor ( color );
- circle ( x, y, r );
- }
- ранг: сариқ – чизади, қора – ўчиради
- Константа ва ўзгарувчилар
- #include // математик функциялар
- void main()
- {
- const rSun = 60, // Қуёш радиуси
- L = 150, // Ер орбитаси радиуси
- x0 = 200, // Қуёш маркази координаталари
- y0 = 200;
- int x, y, // Ер координаталари
- code; // Босилган клавиша коди
- float a, ha; // бурилиш бурчаги, қадам
- int d = DETECT, m;
- initgraph ( &d, &m, "c:\\borlandc\\bgi" );
- ...
- }
- void Draw ( int x, int y, int color )
- {
- ...
- }
- circle ( x0, y0, rSun );
- setfillstyle(1, YELLOW);
- floodfill ( x0, y0, WHITE );
- a = 0; // бошланғич бурчак
- ha = M_PI/180; // 100 мс да 1o қадам
- while(1) {
- x = x0 + L*cos(a);
- y = y0 - L*sin(a);
- Draw ( x, y, LIGHTBLUE );
- delay ( 20 );
- Draw(x, y, 0);
-
- a = a + ha;
- }
- closegraph();
- Қуёшни чизиш: Оқ контур, сариқ бўяқ
- if ( kbhit() )
- if ( 27 == getch() ) break;
- #include // sin, cos, M_PI
- "4": Қуёшн ва иккита сайёра бир-бирига қарама-қарши йўналишдаги харакатини тасвирланг:
-
-
- "5": Қуёш-Ер-Ой тизими моделини тасвирланг:
Do'stlaringiz bilan baham: |