Prijavi problem


Obeleži sve katergorije koje odgovaraju problemu

Jos detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link
Na žalost nismo trenutno u mogućnosti da obradimo Vaš zahtev.
Molimo Vas da pokušate kasnije.

Programiranje grafike pomoću Pygame, priručnik za gimnaziju

Мало сложеније анимације

Кртица

Напиши програм који приказује анимацију кртице која излази из своје рупе и враћа се у њу. Пењање и боравак на површини, као и спуштање и боравак у рупи трају тачно 20 фрејмова.

Анимацију можеш реализовати помоћу следећих слика кртице (именоване као krtica1.png, …, krtica10.png).

../_images/krtica1.png ../_images/krtica2.png ../_images/krtica3.png ../_images/krtica4.png ../_images/krtica5.png ../_images/krtica6.png ../_images/krtica7.png ../_images/krtica8.png ../_images/krtica9.png ../_images/krtica10.png

Као и у свим „цртаним филмовима” учитаћемо слике у низ и чуваћемо позицију слике у низу која се тренутно приказује. Такође, чуваћемо променљиву која означава смер промене слика (када кртица излази из рупе она ће имати вредност 1, када се спушта -1, а када мирује 0). На крају, чуваћемо и променљиву у којој се броје преостали фрејмови, до промене смера кретања. Када кртица уђе у рупу (када позиција текуће слике постане 0) или када изађе на површину (када позиција постане за један мања од дужине листе) тада смер постављамо на 0. Када бројач преосталих фрејмова постане 0, тада се функција покређе (тако што јој се смер промене поставља на 1, ако је у рупи, тј. на -1, ако је на врху).

Модификуј претходни пример тако да се дужина боравка кртице у рупи и боравка на површини одређује насумично (када је кртица на површини, кретање на доле започиње са вероватноћом 1:40, а када је у рупи кретање на горе започиње са вероватноћом 1:20).

Уместо бројача преосталих фрејмова до промене смера кретања, сваки пут када је кртица у рупи или је на површини извлачићемо насумичан број између 1 и 20 тј. 1 и 40 и ако добијемо баш број 1, вршићемо покретање кртице у одговарајућем смеру.

ЕКГ срца

Напиши програм који приказује анимацију ЕКГ сигнала срца.

ЕКГ сигнал представљен је изломљеном линијом. У сваком кораку анимације цртаћемо изломљену линију која има једну дуж више него у претходном кораку. Број дужи које линија тренутно садржи чуваћемо у променљивој broj_duzi. На почетку тела петље увећавамо тај број за 1. Претпостављаћемо да је хоризонтално растојање између сваке две суседне тачке сигнала једнако dx. Укупна ширина коју заузима изломљена линија се онда може добити множењем броја дужи и вредности dx. Када та вредност постане већа од ширине екрана, број дужи враћамо на 1 и крећемо цртање сигнала из почетка.

Изломљену линију цртамо тако што у петљи цртамо једну по једну њену дуж. Бројачка променљива i означава редни број дужи који цртамо и креће се од 0 до броја дужи умањеног за један. Та дуж спаја тачку која има редни број i и редни број i+1. Да бисмо нацртали дуж, потребно је да знамо координате њених крајњих тачака. Координата x тачке са редним бројем i се лако добија множењем i*dx. Што се тиче координата y, оне се периодично понављају. Анализом облика сигнала можемо проценити да се облик сигнала може проценити серијом бројева dy = [0, 0, 1, -1, 5, -5, 1, 0, 0, 0]. Наиме, прве две дужи су потпуно хоризонталне, наредна мало скаче на горе, наредна исто толико скаче на доле, затим имамо велики скок (око 5 пута већи него претходни) на горе, затим исти такав скок на доле, затим враћање на висину малог скока на горе и на крају равну линију неко време. На основу вредности у овој листи одређујемо y координате крајњих тачака дужи. Координату одређујемо тако што од вертикалне средине екрана одузмемо вредност из листе помножену неким фактором скалирања (ако је фактор скалирања 10, то значи да скок за 5 јединица представља скок од 50 пиксела). Пошто се сигнал периодично понавља, након обиласка елемената листе, треба кренути од почетка, што можемо лако постићи тако што се код тачке i посматра елемент на позицији која се добије израчунавањем остатка при дељењу броја i дужином листе.

На крају, остаје питање одређивања нијансе боје сваке дужи. Како би се постигао ефекат исчезавања, боју дужи ћемо одређивати тако да последња нацртана дуж буде потпуно зелена, а прва нацртана дуж потпуно црна (док ћемо боје дужи између прве и последње одређивати тако да буду неке нијансе зелене боје, између ове две крајности). Ако усвојимо линеарни модел, потребно је да пронађемо линеарну функцију која ће за i=0 дати количину зелене 0, а за i=broj_duzi-1 дати количину зелене 255 (количина плаве и црвене боје ће стално бити на нули. Веома једноставно се може уочити да је таква линеарна функција i/(broj_duzi-1)*255. Потребно је једино обратити пажњу на специјални случај када постоји само једна дуж (њу можемо обојити у чисту зелену боју).

Овај модел се може још додатно побољшати ако се учини да су све дужи осим оних последњих неколико потпуно црне, а да се онда линеарна скала осветљености примењује само на тих последњих неколико дужи.

Рецаманова секвенца

Жабац Индијана Џонс решава тежак задатак да би се спасао из опасне замке и дошао до блага. Свуда око њега се обрушила земља и он стоји на првом стубу, на сред провалије. Испред њега се налази дугачка стаза од стубова којом може да се извуче. Сви стубови су распоређени дуж праве линије и он се налази на почетном (обележеног бројем 0) и растојање између њих је један метар. У тајној књизи упутстава пише да у сваком наредном кораку мора да скочи један више него у претходном. Пошто је он жабац са супер моћима, то за њега не представља никакав проблем. Веома брзо би одскакутао преко стубова испред њега, да у тајној књизи упутстава пише да када год скоком уназад долази на неки стуб на коме раније није био, он мора да скочи уназад.

Први стуб на коме се жабац налази је 0. Он скаче 1 метар и пошто иза њега нема стубова (пао би у провалију), он мора да скочи унапред, на стуб број 1. У наредном скоку скаче два метра. Опет би га скок уназад довео у провалију, тако да скаче унапред и долази на стуб број 3. У наредном скоку скаче три метра. Скок уназад би га довео сада на стуб 0, где је већ био, па зато може да скочи унапред на стуб број 6. У наредном скоку скаче четири метра. Пошто би скоком уназад доскочио на стуб број 2, на коме раније није био, он мора да уради тако. Након тога скаче на стуб број 7 итд.

Секвенца бројева стубова које жабац обилази назива се Рацаманова секвенца и њени почетни елементи су 0, 1, 3, 6, 2, 7, … Ова секвенца се веома лепо графички представља. Између свака два суседна елемента поставља се полукруг, а ти су полукругови наизменично окренути ка горе и ка доле (као да жабац у једном кораку скаче изнад, а у другом испод стубова). Напиши програм који приказује скокове жапца.

Веома интересантна хипотеза је да ће на било који стуб жабац доскочити у неком тренутку. Провери да ли то важи за првих неколико десетина стубова.

Током извршавања задатка чуваћемо текући елемент секвенце (за то ћемо користити променљиву xt), као и текућу разлику између текућег и наредног елемента секвенце (за то ћемо користити променљиву razlika). Текући елемент иницијализујемо на нулу, а разлику на 1. Пошто је потребно да проверавамо да ли се неки елемент раније јављао, чуваћемо и све претходне елементе секвенце. За то нам је најједноставније (мада не и најефикасније) да употребимо листу (назовимо је recaman). На почетку ћемо у ту листу убацити само почетни елемент секвенце (нулу). У сваком кораку главне петље израчунаваћемо број xt - razlika и проверавати да ли је могуће да он постане наредни елемент секвенце. То ће бити случај ако је у питању природан број (тј. ако је xt - razlika >= 0) и ако се тај број није раније јављао (тј. ако важи not(xt - razlika in recaman)). Ако се установи да xt - razlika може да буде наредни кандидат, онда се xt ажурира на вредност xt - razlika, а у супротном се ажурира на вредност xt + razlika. Након сваког ажурирања вредности xt, ту вредност додајемо и на крај листе recaman (за додавање на крај можемо употребити append).

Остаје још питање како цртати спиралу. Она ће се састојати од полукругова који ће наизменично ићи навише, па наниже. Оријентацију полукруга лако можемо одредити на основу парности броја razlika (провером да ли је razlika % 2 == 0). У једном случају почетни угао лука ће бити 0, а завршни math.pi радијана (тада је полукруг окренут ка горе), а у другом случају обратно (тада је полукруг окренут ка доле). За цртање полукруга потребно је још да знамо координате горњег левог темена квадрата у који је полукруг уписан и његове димензије. Да би слика лепше изгледала, извршићемо трансформацију координатног система тако што ћемо скалирати (зумирати) слику (на пример, фактором 5). То значи да ће разлика између суседних тачака на x оси бити 5 пиксела. Полупречник полукруга се може израчунати као пола разлике између претходне и текуће тачке, помножен фактором скалирања. Ту разлику имамо сачувану у променљивој razlika, пре њеног увећавања за 1 на крају петље. У случају када се скок врши на лево (када се xt ажурира на xt - razlika), тада се леви крај квадрата налази на позицији одређеној вредношћу xt - razlika (десни крај је тада на позицији одређеној вредношћу xt), док се у случају када се скок врши на десно (када се xt ажурира на xt + razlika) леви крај квадрата налази на позицији одређеној вредношћу xt (десни крај је тада на позицији одређеној вредношћу xt + razlika). Најједноставније нам је да током анализе одредимо одговарајући леви крај полукруга (нпр. у променљивој levi_kraj_polukruga), тако да приликом цртања имамо ту вредност на располагању (координату на прозору онда добијамо множењем са фактором скалирања). Коодината y левог горњег темена квадрата се може лако одредити тако што се од координате вертикалне средине прозора (половине висине) одузме полупречник полукруга.

Microbit порука

Уређај MicroBit има дисплеј на коме се налази 25 диода, уређених у пет врста и пет колона. Направи анимацију која приказује текст који се полако помера по таквом дисплеју.