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

Цртање лукова

Библиотека PyGame нам омогућава и да цртамо кружне лукове (делове кружница и делове елипси). Посматрајмо наредни пример.

Лукови

Лукови се, дакле, цртају функцијом pg.draw.arc. Њени параметри су веома слични онима који се наводе приликом цртања елипсе. Прво се наводи прозор по ком се црта, затим боја, а након тога уређена четворка којом се задаје правоугаоник у који је уписана елипса (или кружница, ако је тај правоугаоник квадрат) чији је лук део. Прва два броја предстаљају координате горњег левог темена тог правоугаоника, а друга два његову ширину и висину.

Након тога се наводе два броја који одређују који део елипсе је кружни лук. Кружни лук се задаје помоћу два угла, који се мере од крајње десне тачке елипсе и протежу се у смеру супротном кретању казаљке на сату. Тако тачки на врху елипсе одговара угао од 90 степени, крајњој левој тачки 180 степени, а крајњој доњој тачки угао од 270 степени. Угао од 360 степени поново одговара крајњој десној тачки елипсе (као и угао од 0 степени). Негативни углови одговарају кретању у смеру казаљке на сату. Тако крајњој доњој тачки поред угла од 270 степени одговара и угао од минус 90 степени, а крајњој левој тачки угао од минус 180 степени. Лук се такође протеже од првог до другог угла, у смеру супротном кретању казаљке на сату.

Међутим, функцији pg.draw.arc се углови не наводе у степенима, што је био једини начин да мерите углове који сте до сада учили. У математици постоји и друга мера, која се често покаже као погоднија него што је то степен, коју ћете сигурно користити кроз целу своју средњу школу. Фундаментално, постоје два различита начина да мериш угао. Један начин је да се угао измери као део пуног окрета (пуног угла). Угао од једног степена дефинисан је као 360-ти део пуног угла и степени мере углове на претходни начин. Међутим, са овом мером постоји проблем, јер није увек једноставно одредити који је део пуног угла неки угао који нам је задат, није је једноставно одредити дати број степени (без угломера). Замисли сада да на располагању имаш само један канап. Поставља се питање да ли можеш угао измерити само помоћу њега. Згодан начин да то урадиш је да тим канапом прво нацрташ круг (то можеш урадити тако што фиксираш један крај канапа, а други крај окрећеш док је канап затегнут). Сваком углу мањем од пуног једнозначно одговара неки кружни лук на том нацртаном кругу. Можеш фиксирати било коју тачку на том кругу и затим кренути да мериш дужину кружних лукова који почињу у тој тачки. Пошто немаш метар, него само канап, дужине лукова можеш да изражаваш само у функцији дужине тог канапа. Тако ће ти онда дужина 1 одговарати оном луку који је дугачак тачно колико и канап који имаш у рукама. Пошто си тај канап користио и за цртање круга, полупречник тог круга је такође једнак дужини тог канапа. Један радијан дефинишемо као онај угао чија је дужина кружног лука једнака дужини полупречника. Дакле, за разлику од једног степена, један радијан можемо лако да конструишемо коришћењем само једног канапа. Интуитивно је некако јасно да у кругу има мало више од шест радијана (пробај то да измериш са канапом). Хајде да прецизно израчунамо колико степени има у једном радијану. Обим кружнице је \(2r\pi\). Дужина лука који одговара једном степену је онда 360 пута мањи и износи \(\frac{r\pi}{180}\), док је дужина лука која одговара \(x\) степени једнака \(\frac{x\cdot r\cdot \pi}{180}\). Ми желимо да проверимо колико степени има у једном радијану. По дефиницији радијана дужина његовог кружног лука једнака је \(r\). Дакле, \(\frac{x\cdot r\cdot \pi}{180} = r\), па је \(x = \frac{180}{\pi}\). Дакле, један радијан износи \(\frac{180}{\pi}\) степени, што је око \(57,3^\circ\). Са друге стране један степен износи \(1^\circ{} = \frac{\pi}{180}\) радијана. Зато \(x\) степени износи \(x\cdot \frac{\pi}{180^\circ}\) радијана, на основу чега веома лако можемо превести угао из степени у радијане, што је управо оно што нам треба. Углу од нула степени одговара нула радијана. Приметимо да је угао од 90 степени износи \(90^\circ\frac{\pi}{180^\circ} = \frac{\pi}{2}\). Угао од 180 степени је тачно \(\pi\) радијана (мало више од три, што се поклапа са нашом интуицијом и експериментима са канапом). Пун угао има 360 степени и \(2\pi\) радијана (што је мало више од шест, што се поново поклапа са нашом интуицијом и експериментима).

Да резимирамо, број радијана се од броја степени добија дељењем са 180 и множењем са \(\pi\). Када знамо број степени, можемо га на овај начин трансформисати у број радијана и онда га проследити функцији pg.draw.arc. Међутим, чак ни ово не морате знати (а мораћете га научити кад-тад, па што не сад :)), да бисте могли да користите pg.draw.arc. Наиме, у Python-у постоји библиотечка функција math.radians којом се угао из степени аутоматски преводи у радијане. Њу смо употребили неколико пута у претходном примеру и тиме постигли да углове које одређују кружни лук можемо задавати y степенима, како сте и навикли (само не заборавите да морате да позовете math.radians, јер ћете у супротном добити лоше исцртане лукове).

Приликом цртања црвеног лука навели смо math.radians(0), math.radians(120), тако да се лук простирао од 0 до 120 степени (мерено од крајње десне тачке, у смеру супротном кретању казаљке, као што смо на почетку описали). Приликом цртања плавог лука навели смо math.radians(-180), math.radians(-30), тако да се лук простирао од минус 180 степени, до минус 30 степени (опет мерено на начин који смо на почетку описали). Приликом цртања зеленог лука навели смо 0, 1, што значи да се лук простире од нула до једног радијана. Зелени лук нам, дакле, врло јасно приказује колики је угао од једног радијана. На крају, приликом цртања жутог лука навели смо 0, math.pi што значи да се лук простире од нула до \(\pi\) радијана. На основу претходне дискусије, сетићете се да је угао од \(\pi\) радијана одговарао углу од 180 степени и зато је нацртан жути полукруг (да смо обрнули редослед ова два аргумента, добио би се полукруг окренут надоле, јер се увек црта од првог до другог угла, у смеру супротном кретању казаљке на сату).

Цвет од лукова

Напиши програм који црта цвет помоћу кружних лукова чији су центри распоређени у теменима правилног шестоугла, а полупречници су једнаки димензији странице шестоугла (100 пиксела).

За решавање овог проблема дефинисаћемо помоћну функцију luk(prozor, boja, centar, r, pocetni_ugao, krajnji_ugao, debljina) која ће нам помоћи да параметре лука задамо на једноставнији начин. Ова функција као аргументе има прозор, боју којом желимо да исцртамо лук, центар круга на којем се лук налази, угао одакле лук почиње и угао где се лук завршава, оба задата у степенима. Наиме, пошто библиотечка функција pg.draw.arc уместо центра и полупречника лука тражи да се задају координате горњег левог темена, ширина и висина правоугаоника који је описан око кружног лука (тј. елипсе чији је лук део) и да се углови задају у радијанима, а пошто си вероватно више навикао/навикла на рад са степенима, него са радијанима, функција luk ће ти бити удобнија за коришћење од библиотечке функције pg.draw.arc.

Променљиве \(h\) која представља висину једнакостраничног троугла од којих је сачињен правилан шестоугао и центар шестоугла \((c_x, c_y)\), тј. координате ове тачке су кључне за одређивање координата осталих тачака.

../_images/cvetSaLukovima.png

На основу слике можемо уочити да координате свих шест тачака, темена правоуглог шестоугла, можемо описати са неколико координата: x1 = cx - a, x2 = cx - a//2, x3 = cx + a//2, x4 = cx + a, y1 = cy - h, y2 = cy и y3 = cy + h и то на следећи начин: A1 = (x1, y2), A2 = (x2, y1), A3 = (x3, y1), A4 = (x4, y2), A5 = (x3, y3), A6 = (x2, y3).

На основу претходне дискусије, допуни наредни код.