Корњача графика

Веома леп начин да се прикажу неки основни концепти програмирања је такозвана корњача-графика у којој се неки замишљени лик креће по екрану остављајући притом траг који чини цртеж. У ранијим језицима (пре свега у језику Logo из којег је концепт потекао) лик који је цртао била је једна корњачица, а у Python-у можемо бирати између неколико ликова (подразумевано цртање врши један троуглић који се помера, али без обзира на то што је троугаоног облика, ми ћемо га називати корњачом).

Наредбе корњаче

Да бисмо у нашим програмима могли користити цртање уз помоћ корњаче, потребно је прво да укључимо библиотеку за рад са корњачом (то се ради тако што наведемо import turtle). Након тога можемо издавати наредбе нашој корњачи. Свака наредба ће почињати са turtle.???. Кроз неколико једноставних програма прикажимо основне наредбе корњаче.

Цртање линије

Корњача се на почетку налази у центру екрана и окренута је надесно (у смеру истока). Наредбом turtle.forward(100) корњачи говоримо да се помери напред (у смеру у ком је тренутно окренута) 100 корака и тако, пошто наша корњача подразумевано са собом носи оловку којом црта, постижемо да се на екрану нацрта дуж дужине 100 пиксела.

Да бисмо видели јасније како корњача ради, можемо јој променити брзину кретања. turtle.speed(0) нам даје најбржу корњачу (након покретања програма се одмах види готов цртеж), док turtle.speed(10) даје најспорију корњачу (могуће је навести и било коју целобројну вредност између 0 и 10).

Боја и дебљина линије

Могуће је поставити различите параметре који одређују начин на који се врши исцртавање. Да бисмо видели нашу корњачу (уместо стрелице која се подразумевано приказује) можемо употребити наредбу turtle.shape("turtle"). Помоћу turtle.color можемо променити боју корњаче и њене оловке (и тако променити и боју трага тј. линија које се цртају). Као параметар ове наредбе у заградама под наводницима наводимо име жељене боје на енглеском језику. На пример, наредба turtle.color("red") поставља црвену боју. Помоћу turtle.width постављамо дебљину трага који корњача оставља, при чему се дебљина задаје као параметар. На пример, наредбом turtle.width(5) постижемо да линије које се цртају буду дебеле 5 пиксела.

Да ли можеш да погодиш шта ће се добити покретањем наредног програма? Пробај да погодиш, а онда након тога покрени програм и провери да ли си био/била у праву.

Подизање оловке

Корњача током свог кретања оставља траг. Међутим, некада је згодно да корњачу померимо без цртањa. Наредбом turtle.penup() корњача подиже своју оловку и након тога се креће по екрану не остављајући траг све док јој се не изда наредба turtle.pendown() након чега поново почиње да оставља траг током кретања. Допуни наредни програм тако да корњача нацрта испрекидану линију која се састоји од три дужи.

Отисци корњаче

Наредбом turtle.stamp() корњача може да остави свој отисак на месту на ком се тренутно налази.

Окретање корњаче

Корњача може мењати свој смер кретања тако што се окреће налево (у смеру супротном смеру кретања казаљке на сату) или надесно (у смеру кретања казаљке) за одређени број степени, за шта се користе наредбе turtle.left(n) и turtle.right(n) где је n број степени.

Резимирајмо све наредбе корњачи које смо до сада поменули.

turtle.forward(n) корњача се помера напред за n корака
turtle.left(n) корњача се окреће налево за n степени
turtle.right(n) корњача се окреће надесно за n степени
turtle.penup() корњача подиже оловку
turtle.pendown() корњача спушта оловку
turtle.color(c) боја оловке се поставља на боју c (назив је на енглеском језику, нпр. "red", "green", "blue")
turtle.width(n) дебљина оловке се поставља на вредност n
turtle.stamp() корњача оставља свој отисак
turtle.shape(s) корњача мења свој облик (нпр. "arrow", "turtle", "circle")
turtle.speed(n) корњача мења своју брзину кретања од 0 (најбрже) до 10 (најспорије)

Линијски програми

Квадрат

Напиши програм у којем корњача црта квадрат чија је дужина страница 100 корака.

Квадрат се може нацртати тако што се четири пута корњачи зада да иде 100 корака напред и да се затим окрене за 90 степени (на пример, налево). Допуни наредни програм тако што ћеш додати још наредби.

За вежбу пробај да допуниш претходни програм тако да се црта шарени квадрат (сваку страницу обоји другом бојом).

Претходни програм можемо да скратимо ако уведемо наредбу којом постижемо да се неки задати низ наредби више пута понови. У језику Python најлакши начин да се то уради је наредба for. Наредбу ponovi n puta можемо записати као for i in range(n):. Наредбе које се понављају наводимо увучене неколико размака у односу на положај наредбе for. Погледајмо како претходни пример изгледа уз коришћење понављања.

Лого Петље

Напиши програм у којем корњача црта лого фондације петља. Лого се састоји од два квадрата странице 50 корака, која се додирују и окренути су 45 степени у односу на хоризонталу.

_images/petlja.png

Допуни наредни програм наредбама којима се корњача окреће, тако да се добије тражена слика.

Понављање

У програмима које задајемо корњачи често су облици правилни и неке се наредбе понављају. Стога у програмима можемо користити и петље. Најједноставнији начин да се неки блок наредби понови n пута је да се употреби петља for i in range(n): након чега се наредбе које се понављају (тело петље) наводе мало увучено (обично два или три размака). Променљива i је бројачка променљива и за њено име се може одабрати било које исправно име променљиве (укључујући и име _ које се понекад користи да би се нагласило да се бројачка променљива неће користити у наредбама у телу петље).

Квадрат - петља

У наредном програму има неколико грешчица. Исправи га тако да корњача црта квадрат чија је страница дугачка 100 корака.

Шарени квадрат - петља

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

За решавање задатка нам је згодно да употребимо листу у којој ћемо упамтити четири ниске које представљају називе те четири боје на енглеском језику. У сваком кораку петље, боју ћемо постављати на i-ти члан те листе, где је i бројачка променљива која редом узима вредности 0, 1, 2 и 3. У наредном програму опет има неколико грешака и твој задатак је да их исправиш.

Испрекидана линија

У једном од претходних задатака нацртали смо испрекидану линију тако што смо пуно пута понављали исте наредбе. Скрати претходни програм коришћењем петље тако што ћеш нацртати испрекидану линију која се састоји од пет делова.

Правилни многоугао

Уопшти претходни програм тако да уместо цртања квадрата корњача црта неки други правилни полигон (на пример, једнакостранични троугао, правилни петоугао, правилни шестоугао и слично).

Ако је дат број n правилни n-тоугао (правилни полигон са n страна) добијамо тако што нацртамо n његових страница. Зато је цртање странице и окретање потребно поновити n пута. Након цртања сваке странице корњача треба да се окрене тачно за величину спољашњег угла полигона. Важи да је збир свих спољашњих углова у полигону једнак 360 степени, па пошто су сви они једнаки, сваки од њих је једнак количнику бројева 360 и n. Други начин да одредимо угао за који се корњача окреће у сваком кораку је да се примети да она цртање почиње и завршава окренута ка истоку и да се у међувремену, током цртања, окреће тачно за износ једног пуног круга тј. за \(360^\circ\). Пошто се у сваком кораку окреће подједнако, окрет износи тачно \(\frac{360^\circ}{n}\).

Као и у претходним случајевима, твој задатак је да исправиш грешке у следећем програму.

Збир унутрашњих углова сваког n-тоугла (у Еуклидској геометрији) једнак је вредности \((n-2)\cdot 180^\circ\). Заиста, ако из неког темена конвексног многоугла повучемо све његове дијагонале оне ће га поделити на укупно \(n-2\) троугла (на наредној слици, петоугао је на тај начин подељен на три троугла).

_images/uglovi_poligona.png

Збир углова у сваком троуглу (у Еуклидској геометрији) је \(180^\circ\). Сваки унутрашњи угао полигона једнак је збиру неколико углова тих троуглова, док је сваки унутрашњи угао троугла део тачно једног од унутрашњих углова полигона, па је укупан збир унутрашњих углова полигона једнак укупном збиру углова тих троуглова, а то је тачно \((n-2)\cdot 180^\circ\).

Сваки спољашњи угао полигона је допуна унутрашњег угла до \(180^\circ\) степени (његов суплемент). Пошто је тих углова \(n\) важи да је збир спољашњих углова једнак разлици броја \(n \cdot 180^\circ\) и збира унутрашњих углова полигона, који је, на основу претходног једнак \((n-2)\cdot 180^\circ\). Зато је збир спољашњих углова полигона једнак \(n\cdot 180^\circ - (n-2)\cdot 180^\circ\), што је тачно \(360^\circ\).

Звезда

Напиши програм у којем корњача црта звезду са пет кракова.

Звезда са пет кракова (тзв. “петокрака”) је током историје била симбол којем су приписивана различита значења. Ми је посматрамо искључиво као геометријски објекат и ограђујемо се од било каквог њеног другог значења.

_images/star5.png

Звезда са пет кракова се састоји од централног правоуглог петоугла на чијим се ивицама налазе једнакостранични троуглови. Збир унутрашњих углова у правилном петоуглу је \((5-2)\cdot 180^\circ\) тако да је сваки угао једнак \(108^\circ\). Ако посматрамо углове на базама два суседна крака (једнакостранична троугла) видимо да су они унакрсни и да заједно са углом од \(108^\circ\) и са њему унакрсном углом чине пун угао. Стога је сваки угао на основици крака једнак \(\frac{360^\circ - 2 \cdot 108^\circ}{2} = 72^\circ\). Пошто је збир углова у краку једнак \(180^\circ\), угао при врху крака једнак је \(180^\circ - 2 \cdot 72^\circ = 36^\circ\). Та информација нам је кључна да бисмо могли да нацртамо звезду. Звезду ћемо цртати тако што ћемо пет пута нацртати дуж од 100 корака и затим се окренути тако да наредна дуж заклопи угао од \(36^\circ\) са претходном. Да бисмо то постигли, корњача треба да се окрене надесно за суплемент тог угла тј. за угао од \(180^\circ - 36^\circ = 144^\circ\).

Теби препуштамо да на основу ове дискусије допуниш наредни програм.

Квадратни сигнал

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

_images/kornjaca-kvadratni-signal.png

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

_images/kornjaca-kvadratni-signal-boje.png

Дакле, облик се састоји од пет понављања основног облика, који се може добити тако што корњача иде напред, затим се окрене налево, иде напред, окрене се надесно, иде напред, опет се окрене надесно, иде напред и окрене се налево (увек се окреће за по 90 степени).

За вежбу прилагоди програм тако да се димензије облика лако мењају (уведи променљиве које представљају дужину и ширину основног облика).

Гранање

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

Испрекидана линија

Нацртај поново испрекидану линију, али овај пут коришћењем гранања.

Корњача иде напред 10 пута, при чему пет пута од тога има подигнуту, а пет пута има спуштену оловку. Дакле, уведи петљу чије се тело понавља пет пута, у телу петље помери корњачу за 20 корака, а затим или подигни или спусти оловку, тако да то буде наизменично (то можеш реализовати тако што ћеш у парним корацима подизати, а у непарним корацима спуштати оловку). Имајући ово у виду исправи наредни програм тако да црта испрекидану линију.

Звезда без пресецања

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

_images/kornjaca-zvezda.png

Звезду можемо нацртати тако што нацртамо десет дужи (десет кракова једнакокраких троуглова који представљају краке звезде). Након цртања сваке од тих дужи окрећемо се и то наизменично налево за \(72^\circ\) (када смо у дну крака) па надесно за \(144^\circ\) (када смо на врху крака). Поново наизменично изршавање наредби (овај пут окретања) можемо остварити тако што проверавамо парност бројачке променљиве.

Напоменимо и да решење можемо добити и без гранања, уз помоћ двочлане листе. У листу можемо поставити углове од 72 и -144 степена и у сваком кораку се окретати улево за један од та два угла (окрет удесно за 144 степена је једнак окрету улево за -144 степена), наизменично. Угловима из листе приступамо наизменично, тј. приступамо угловима на позицији 0, затим 1, па 0, па 1, и тако даље. Ово можемо остварити тако што у сваком кораку приступимо угло у листи на позицији која се добије као остатак при дељењу променљиве i бројем два. У складу са тим исправи наредни програм.

За вежбу покушај да уопштиш неки од претходна два програма тако да црта звезду са \(n\) кракова. Помоћ: звезда се састоји од централног правилног \(n\)-тоугла, чије су странице продужене тако да формирају једнакокраке троуглове који чине краке. Дакле, углови на основици звездиних кракова су спољашњи углови правилног многоугла и могу се лако израчунати (ти углови одговарају првом окрету корњаче). У другом окрету корњача се окреће за суплемент (допуну до 180 степени) угла који се налази на врху једнакостраничног троугла који чини звездин крак. Имајући ово у виду, допуни наредни програм попуњавајући углове (одреди још и од колико се дужи састоји звезда са \(n\) кракова).

Угнежђене петље

Три квадрата

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

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

Компликованија звезда

Напиши програм у којем корњача црта звездицу приказану на слици. Она се састоји од 20 троуглова чија је страница дугачка 60 корака, који су распоређени око правилног 20-оугла чија је дужина странице 10 корака.

_images/kornjaca-komplikovana-zvezda.png

Исправи наредни програм тако да се добије облик са слике.

Процедуре

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

Процедура за цртање многоугла

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

Четири квадрата

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

_images/kornjaca-cetiri-kvadrata.png

Дефиниши процедуру за цртање квадрата, а затим размисли како су ти квадрати међусобно распоређени, тј. колико треба да се окрене корњача након завршетка цртања сваког квадрата.

Решење са петљом у петљи.

Решење са помоћном процедуром за цртање квадрата.

Слободно цртање

На крају, остављамо ти празан простор да нацрташ шта год желиш.