Час 8 - понављање облика коришћењем петљи¶
Употреба генератора случајних бројева¶
Функцијом random.randint(a, b)
можемо добити насумично одабран цео
број из интервала \([a, b]\). Ово може бити веома корисно када је
потребно да цртеж испунимо са већим бројем неправилно распоређених
облика. Слично, функцијом random.uniform(a, b)
добијамо насумично
одабрани реални број из интервала \([a, b]\).
Ноћно небо¶
Смркнуло се и небо је препуно звездица. Уз звездице се види и пун месец. Нацртај такав цртеж.
Насумичне боје¶
Украсићемо собу тако што ћемо на плафон окачити 5 балона у насумично одабраним бојама. Напиши програм који исцртава овакав цртеж, при чему сваки балон црта у облику елипсе.
Генератор случајних бројева можемо употребити и да насумично одаберемо боју. Довољно је да за сваку од црвене, зелене и плаве компоненте насумично одаберемо број између 0 и 255. Ово можемо издвојити у посебну функцију коју ћемо позвати када год нам затреба насумична боја.
Прикажимо и како да равномерно распоредимо балоне по плафону. Претпоставимо да треба да распоредимо \(n\) балона. Ширину екрана ћемо поделити на \(n\) једнаких делова. Сваки балон ћемо закачити на средину њему одговарајућег дела. Ширину једног дела можемо израчунати тако што ширину екрана поделимо са бројем делова, x координату левог краја i-тог дела (где бројање креће од 0) добијамо тако што ширину једног дела помножимо са i, док x координату средине тог дела (тачке у којој се налази врх балона) добијамо тако што на леви крај додамо још пола ширине дела. На основу те тачке лако израчунавамо горњу леву тачку правоугаоника описаног око елипсе (x координату добијамо тако што од x координате средине поља одузмемо пола ширине елипсе, док је y координата једнака нули).
Дијагонално распоређивање облика¶
Кругови дуж дијагонале¶
Напиши програм који дуж целе главне дијагонале прозора распоређује \(n=10\) једнаких кругова.
Пречници кругова деле главну дијагоналу на \(n\) једнаких делова. Полупречник кругова можемо израчунати тако што дужину дијагонале поделимо са \(2n\), а дужину дијагонале можемо израчунати Питагорином теоремом као \(\sqrt{s^2 + v^2}\), где су \(s\) и \(v\) ширина тј. висина прозора. На основу Талесове теореме (сличности троуглова) пројекције центара кругова на x осу и на y осу деле те две осе у истом односу у ком центри кругова деле дужину дијагонале. Ако са \(k_x\) означимо \(n\)-ти део ширине прозора, а са \(k_y\) означимо \(n\)-ти део висине прозора, тада прва тачка има координате \((\frac{k_x}{2}, \frac{k_y}{2})\), друга има координате \((\frac{k_x}{2} + k_x, \frac{k_y}{2} + k_y)\), трећа има координате \((\frac{k_x}{2} + 2k_x, \frac{k_y}{2} + 2k_y)\) итд. На основу овога допуни наредни програм.
Шума¶
Поред скијашке стазе постављена су два реда јелки. Напиши програм који исцртава ову скијашку стазу.
Претпоставићемо да на располагању имамо функцију која црта јелку. Овај
пут ће та функција примати координате сидра (средину дна стабла
јелке), али и димензију јелке. Да би цртеж реалније изгледао
претпоставићемо да неће све крошње бити у истој нијанси зелене боје,
већ да ће неке бити тамније, а неке светлије. Стога ћемо функцији за
цртање јелке прослеђивати и четврти параметар који ће представљати
фактор промене основне зелене боје. Промену боје ћемо постићи кроз
посебну функцију која сваку појединачну компоненту дате боје множи са
задатим коефицијентом. Ако је тај коефицијент број мањи од 1, тада боја
постаје тамнија, а ако је већи од 1, тада боја постаје
светлија. Приликом сваког позива функције фактор ћемо одређивати као
насумично одабран реалан број из интервала \([0.2, 2]\), позивом
функције random.uniform(0.2, 2.0)
.
У главном делу програма распоредићемо 6 јелки левог и 6 јелки десног дрвореда. У петљама ћемо одржавати координате сидра текуће јелке. Леви дрворед ће кретати мало испод линије хоризонта и мало лево од вертикалне средине екрана и свако дрво ће бити померено доле, лево у односу на претходно. То ћемо постићи тако што ћемо у сваком кораку петље умањивати x и увећавати y координату. Слично, десни дрворед ће кретати мало испод линије хоризонта и мало десно од вертикалне средине екрана и свако дрво ће бити померено доле, десно у односу на претходно. То ћемо постићи тако што ћемо у сваком кораку петље увећавати и x и y координату. Да би се постигао ефекат перспективе, свако наредно дрво биће мало веће у односу на претходно. То ћемо постићи тако што ћемо у сваком кораку петље увећавати и димензију текућег дрвета.
Допуни наредни програм на основу претходне дискусије.
Правилно распоређивање боја¶
Чињеница да су нијансе боја одређене бројевима између 0 и 255 нам омогућава и да аутоматски израчунавамо нијансе боја тако да боје буду распоређене дуж неког дела спектра боја. Прикажимо ову технику кроз неколико примера.
Квадрати у нијансама црвене боје¶
Напиши програм који црта шест квадрата обојених у различите, правилно распоређене нијансе црвене боје (све дефинисане помоћу RGB система).
Нијансе црвене боје су одређене тиме да садрже само црвену компоненту
боје, док су зелена и плава на нули. Боје иду од чисте црвене ([255,
0, 0]
), па до црне ([0, 0, 0]
). Претпоставићемо да је разлика
количине светлости између сваке две суседне нијансе иста. Ако је та
разлика r
, тада је црвена компонента у нашим бојама редом
\(0\), \(r\), \(2r\), \(3r\), \(4r\) и
\(5r\). Пошто најсветлија боја треба да буде најсветлија важи да
је \(5r = 255\), тј. да је \(r = 51\). Дакле, боје су редом
одређене са [255, 0, 0]
, [204, 0, 0]
, [153, 0, 0]
, [102,
0, 0]
, [51, 0, 0]
и [0, 0, 0]
. Опет претпостављамо да су
димензије квадрта 50 пута 50 пиксела, тако да квадрате редом
распоређујемо дуж прозора димензије 300 пута 50 пиксела.
Наравно, много бољи кôд добијамо ако задатак решимо уз помоћ петље.
Оптичка варка¶
Позадину прозора обоји у нијансе сиве боје које се постепено мењају од црне на левој ивици прозора до беле на десној ивици. Након тога у средини прозора нацртај правоугаоник сиве боје висине 50 пиксела и ширине једанке три четвртине ширине екрана. Видећеш интересантну оптичку варку.
Ефекат градијента ћеш постићи тако што ћеш ширином прозора распоредити 256 једнаких правоуганика, сваки обојен у различитну нијансу сиве боје.
Домаћи задатак - прелаз између две боје¶
Напиши програм који исцртава десет правоугаоника исте величине, распоређених један до другог ширином прозора. Боја првог и последњег правоугаоника се одређују насумично, а боје правоугаоника између њих су одређене тако да се врши постепен прелаз од прве до последње боје.
Кључни проблем у овом задатку је како извршити постепени прелаз
нијанси између две задате боје. Кључни увид је да се прелаз врши
независно за црвену, зелену и плаву компоненту. Пошто желимо да прелаз
буде постепен и равномеран, конструисаћемо линеарне функције.
Претпоставимо да имамо \(n\) правоугаоника тј. \(n\) нијанси
које треба да одредимо. Претпоставимо да је вредност неке компоненте
боје за почетни правоугаоник \(a\), а за крајњи \(b\). За ту
компоненту је потребно онда конструисати линеарну функцију која слика
редни број правоугаоника \(i\) у вредност те компоненте боје за
тај правоугаоник такву да је за први правоугаоник тј. за \(i = 0\)
вредност те компоненте \(a\), а за последњи правоугаоник тј. за
\(i=n-1\) вредност те компоненте \(b\). Функција је облика
\(p\cdot i + q\) и непознате коефицијенте \(p\) и \(q\)
одређујемо из почетних услова. Дакле, за \(i = 0\) важи да је
\(p\cdot 0 + q = a\) тј. \(q = a\). Даље, за \(i = n-1\)
важи да је \(p\cdot (n-1) + q = b\), па је \(p =
\frac{b-a}{n-1}\). Дакле, вредност те компоненте за правоугаоник број
\(i\) се израчунава као \(a + i\cdot \frac{b-a}{n-1}\). Пошто
ово не мора бити цео број, потребно га је заокружити (нпр. функцијом
round
).