Садржај
1. Робот Карел - линијски програми и бројачка петља
2. Робот Карел - условна петља и гранање
3. Робот Карел - задаци за вежбање
4. Корњача графика - линијски програми и петље
5. Корњача графика - гранање, угнежђене петље, функције, торке и листе
6. Корњача графика - задаци за вежбање
9. Израчунавања - коришћење и дефинисање функција
10. Израчунавања - задаци за вежбање
13. Контрола тока - вежбање
17. Програмирање 2Д графике - Увод у Pygame

22.1. Правилно распоређивање облика

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

Мердевине

Измени наредни програм тако да се пречке мердевина цртају у петљи.

Пажљиво проучи које се вредности мењају кроз позиве функције pg.draw.line, шта је почетна вредност, шта је крајња вредност и који је корак, па на основу тога позови функцију range у оквиру петље for.

Једно могуће решење је:

Правилно распоређени бројеви

У претходном примеру било је потребно да набројиш неки низ правилно распоређених бројева (низ 50, 100, 150, 200, 250).

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

при чему је било потребно обратити пажњу на то да десни крај није укључен у набрајање (узимају се вредности из полуотвореног интервала \([x_0, x_{Max}+1) = [x_0, x_{Max}]\)).

Провери да ли ово разумеш тако што ћеш одговорити на следеће питање.

    Q-172: Упари низ бројева са петљом која га генерише. Покушај поново!
  • 15, 30, 45, 60, 75
  • for i in range(15, 75+1, 15)
  • 100, 350, 600
  • for i in range(100, 600+1, 250)
  • 5, 10, 15, 20, 25, 30
  • for i in range(5, 30+1, 5)
  • 100, 200, 300, 400, 500, 600
  • for i in range(100, 600+1, 100)

Навешћемо још неколико опција којима се постиже исти ефекат. Ако почетак обележимо са \(x_0\), а корак са \(d_x\), тада су вредности које исписујемо \(x_0\), \(x_0 + d_x\), \(x_0+2d_x\), \(x_0+3d_x\) итд. Ако желимо да набројимо \(n\) ових вредности, можемо да употребити петљу облика

Још један начин је да променљиву x ажурирамо кроз сваки корак петље тако што је увећавамо за dx.

Видећеш да се велики број задатака са цртањем правилно распоређених облика може решити применом оваквих петљи.

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

Хоризонтално и вертикално распоређивање облика

Често у применама имамо потребу да распоредимо објекте тако да буду један до другог, тако да су сви објекти равномерно распоређени, тј. тако да су свака два узастопна објекта на истом растојању.

Хоризонтално распоређени кругови

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

Наредних неколико питања ће ти помоћи да решиш овај задатак.

    Q-173: Ако се два круга полупречника \(r\) додирују, растојање између њихових центара је једнако:

  • 2*r
  • Тачно
  • r
  • Покушај поново
  • r / 2
  • Покушај поново
  • 100
  • Покушај поново

Ако круг полупречника \(r\) додирује леву ивицу прозора, \(x\) координата његовог центра је једнака:

На основу овога, допуни наредни програм.

Још један начин да се овај задатак реши јесте да се уочи да су координате центара кругова редом \(r\), \(r + 2r\), \(r + 4r\), \(r + 6r\) итд. Дакле, \(x\) координата круга са редним бројем \(i\) је \(r + 2\cdot i\cdot r\) тј. \((2i+1)r\). Реши задатак коришћењем ове формуле.

Трећи начин би могао искористити могућност да се функцијом range може вршити набрајање са кораком (нпр. range(r, r + 10*2*r + 1, 2*r)).

Вертикално распоређени кругови

Приказаћемо сада како кругове можемо распоредити вертикално.

Напиши програм који црта кругове полупречника 10 пиксела равномерно распоређене вертикално средином прозора тако да су им центри удаљени 30 пиксела (нацртај све кругове који се виде). Висина прозора се мења приликом сваког покретања програма.

Овај задатак је сличан претходном, уз неколико важних разлика. То што су кругови распоређени вертикално уместо хоризонтално не мења много - само је потребно заменити улогу \(x\) и \(y\) координата. Растојање између центара је овај пут фиксно (износи 30 пиксела) и не израчунава се на основу полупречника. Кључна разлика је то што број кругова није унапред задат већ је кругове потребно цртати све док се бар неки њихов делић види у прозору. Зато имамо две могућности. Или ћемо некако на основу висине прозора израчунати број кругова који се виде или ћемо уместо бројачке петље for употребити условну петљу while. Ово друго може бити једноставније.

Правоугаона мрежа

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

Основни задатак је да се одреде координате \(x\) вертикалних линија и координате \(y\) хоризонталних линија. Ширину једног правоугаоника можемо одредити дељењем ширине прозора бројем колона (у нашем случају то је 10), док висину једног правоугаоника можемо одредити дељењем висине прозора бројем врста (то је поново 10). Означимо те димензије са \(d_x\) и \(d_y\). Вертикалне линије се онда налазе на растојању \(d_x\), \(2 d_x\), \(3 d_x\), …, \(9 d_x\) пиксела од леве ивице прозора (то су им координате \(x\)). Пошто се те линије простиру од врха до дна прозора, координате \(y\) крајњих тачака су једнаке нули, односно висини прозора. Понављање цртања линија остварујемо, наравно, употребом петље for, при чему је најбоље да се бројач i креће од један до девет, јер се тада у кораку i црта линија од тачке (i*dx, 0) до тачке (i*dx, visina). Цртање хоризонталних линија остварујемо веома слично, у независној петљи for у којој се црта линија од тачке (0, i*dy) до тачке (sirina, i*dy).

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

Дијагонално распоређивање облика

Кругови дуж дијагонале

Напиши програм који дуж целе главне дијагонале прозора распоређује \(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)\) итд. На основу овога допуни наредни програм.

(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+