9.1. Релативне координате - утврђивање¶
Упознали смо се са релативно задатим координатама и предностима тог механизма цртања. Утврдимо ово кроз примере који следе.
Примери:¶
Саобраћајни знак од једнакостраничних троуглова¶
Напиши програм који исцртава саобраћајни знак укрштања са путем са првенством пролаза који је у облику жутог једнакостраничног троугла са црвеном ивицом, окренутог тако да му је хоризонтална основица горе.
Ефекат троугла који је жуте боје и има дебелу црвену ивицу постићи ћемо тако што ћемо нацртати прво већи црвени троугао, а затим мањи жути троугао. Та два троугла ћемо поставити тако да им се тежишта (уједно и све значајне тачке) поклапају и да су исто оријентисани.
Приликом цртања саобраћајног знака потребно је да одредимо поступак којим се црта једнакостранични троугао. Сидро ћемо поставити у тежиште \(T\), које има координате \((t_x, t_y)\). Димензија троугла може бити било дужина странице \(a\), било висина \(h\), јер се из једне од ових димензија друга једноставно израчунава на основу познате везе \(h = \frac{a\sqrt{3}}{2}\).
Извођење везе висине и странице применом Питагорине теореме
Веза \(h = \frac{a\sqrt{3}}{2}\) се лако изводи применом Питагорине теореме на правоугли троугао чија је једна катета висина једнакостраничног троугла, друга половина странице, а хипотенуза је страница једнакостраничног троугла.
Из математике знамо да тежиште троугла дели тежишну дуж (у овом случају то је уједно и висина) у односу \(2:1\), тако да су координате темена \(A\) и \(B\) у односу на ову тачку померене (транслиране) на горе за \(\frac{1}{3}h\), док је тачка \(C\) померена на доле за \(\frac{2}{3}h\).
Координате \(x\) ових тачака одређујемо у односу на тачку \(T\), користећи дужину странице \(a\). Тачка \(А\) је померена од тежишта за \(\frac{а}{2}\) ка левој ивици прозора. Тачка \(В\) је померена од тежишта за \(\frac{а}{2}\) ка десној ивици. Тачка \(C\) има исту \(x\) координату као и тежиште.
Дакле, тачка \(A\) има координате \((t_x-\frac{a}{2}, t_y-\frac{h}{3})\), тачка \(B\) има координате \((t_x+\frac{a}{2}, t_y-\frac{h}{3})\), док тачка \(C\) има координате \((t_x, t_y+\frac{2h}{3})\).
Пошто је потребно да нацртамо два троугла, можемо дефинисати функцију за цртање троугла и позвати је два пута (за исто тежиште, али различите боје и димензије). Тежиште ћемо поставити хоризонтално на средину прозора, док ћемо га вертикално поставити тако да троугао делује центриран по средини прозора. Оставићемо простор (маргину) од по 30 пиксела изнад и испод троугла, а тежиште троугла ћемо поставити тако да преосталу висину дели у односу 1:2.
На основу претходне дискусије допуни наредни програм:
Проблеми приликом израчунавања параметара кругова¶
Подсетимо се да, за разлику од функција за цртање линија и
правоугаоника које примају и реалне аргументе, функција за цртање
кругова захтева да су координате центра круга и дужина полупречника
искључиво цели бројеви. Ово може довести до одређених проблема у
програмима у којима се ти аргументи израчунавају у програму. Када
видиш поруку TypeError: integer argument expected, got float
, тада
знај да је проблем у томе што је функцији за цртање круга уместо целог
прослеђен неки реалан број и тај проблем можеш лако решити коришћењем
неког облика заокруживања бројева.
Зато ћемо често у задацима у којима цртамо кругове, морати да
користимо заокруживање реалних бројева (функцијом round
или
функцијом int
) када извршимо потребна израчунавања.
Провери да ли ово разумеш тако што ћеш одговорити на наредно питање:
- Није наведен добар број параметара у позиву функције `pg.draw.circle`
- Покушај поново
- Координате центра не могу бити реални бројеви
- Тачно
- Редослед параметара у позиву није исправан
- Покушај поново
- Полупречник круга не сме да буде негативан број
- Покушај поново
- Потребно је навести још дебљину кружнице
- Покушај поново
Q-39: Након позива pg.draw.circle(prozor, boja, (x, y), r) пријављена је грешка TypeError: integer argument expected, got float. Шта може бити узрок те грешке?
Наредни програм црта цвет састављен од кругова, али не ради исправно и твој задатак је да га поправиш.
Цвет¶
Напиши програм који исцртава цвет који се састоји од централног жутог круга пречника 100 пиксела, око којег се налази 6 правилно распоређених латица розе боје, свака у облику круга, такође пречника 100 пиксела (центри латица се налазе у теменима правилног шестоугла, чији је центар у центру цвета, а дужина странице је 100 пиксела).
За цртање круга потребно је знати координате центра и дужину полупречника круга. Пречник свих кругова је једнак, самим тим и полупречник \(r = \frac{a}{2}\). Нека је тачка О центар жутог, централног круга. Координате ове тачке означимо са \((c_x, c_y)\). Ова тачка се налази у центру прозора и њене координате једнаке су половини висине, односно ширине прозора. Координате осталих центара кругова изразићемо такође преко координата \((c_x, c_y)\). Координате тачке \(А_1\) означимо са \((x_1, y_1)\). Тачка \(А_1\) је за \(a\) померена (транслирана) од тачке О по оси \(x\), тако да је \(x_1\), прва координата ове тачке једнака \(x_1 = c_x + a\), а друга координата ове тачке \(y_1\) једнака је \(y\) координати тачке О, тј. \(y_1 = c_y\). Координате тачке \(А_2\) означимо са \((x_2, y_2)\). Ова тачка је у односу на тачку О померена (транслирана) за \(\frac{a}{2}\) по оси \(x\), односно за висину \(h = \frac{a \sqrt{3}}{2}\) једнакостраничног троугла \(\triangle OA_1A_2\) по оси y. На основу овога закључујемо да су координате тачке \(А_2\) \((x_2, y_2) = (c_x+\frac{a}{2}, c_y + h)\). Координате центра осталих кругова одређујемо на сличан начин.
На основу претходне дискусије, допуни наредни програм и поправи грешке везане за тип података бројева: