Izrada složenijih crteža pomoću petlji

Pravilnost koju želimo da iskoristimo na crtežima može da bude i nešto složenija. Evo nekih primera:

../_images/repeat_alternating.png

U svim ovim slučajevima pravilnost i dalje postoji i može da se iskoristi pri pisanju programa. Osim toga, možemo da primetimo da primeri sa slike svi imaju nešto zajedničko, a to je da se naizmenično pojavljjuju dva pravila. Na primer, na crtežu sa ciglama prvi red počinje celom ciglom, drugi polovinom cigle, treći opet celom i tako dalje. Slično tome, na crtežu zgrade se naizimenično pojavljuju osvetljeni i zatamnjeni prozori.

Zbog naizmeničnog pojavljivanja dva pravila na crtežima, i programi koji ih crtaju će imati nekih sličnosti. Pogledajmo primere.

Primer - rajsferšlus

Da bismo nacrtali ovakav rajsferšlus, linije ćemo svakako crtati u petlji. Sa crteža se vidi da je svaka sledeća linija za isti broj piksela niže od prethodne, tako da ne bi trebalo da bude problema sa računanjem \(y\) koordinata. Nešto je teža situacija sa \(x\) koordinatama, jer se one menjaju po malo složenijem pravilu.

Ovaj problem možemo da rešimo pomoću if naredbe u petlji. Nakon crtanja jedne linije, proveravamo koju od dve moguće vrednosti ima \(x\) koordinata početka linije, pa ako ima prvu vrednost - dodeljujemo joj drugu i obrnuto. Evo kako to izgleda u programu:

Druga mogućnost da rešimo problem sa \(x\) koordinatama je da u jednom prolasku kroz petlju crtamo po dve linije, na primer ovako:

Primer - Cigle

Već smo pomenuli da redovi cigala naizmenično počinju celom ciglom i polovinom cigle. Zato pri crtanju cigala možemo da iskoristimo iste dve ideje kao i u prethodnom primeru.

Neka je dužina cigle označena sa \(a\), a njena visina sa \(h\). Celu ciglu na početku reda dobijamo tako što crtamo pravougaonik od tačke na datoj visini, sa \(x\) koordinatom jednakom nuli. Polovinu cigle na početku reda možemo da dobijemo tako što nacrtamo celu ciglu pomerenu za \(a \over 2\) ulevo, to jest tako što crtamo pravougaonik od tačke na istoj visini, ali sa \(x\) koordinatom jednakom -a // 2. Tako postižemo da se vidi samo desna polovina cigle. Ostaje da rešimo kada crtamo pomerenu ciglu a kada ne.

Jedno rešenje je da mesto početka reda cigala čuvamo u promenljivoj, nazovimo je x_poc. Posle svakog iscrtanog reda, proveravamo da li promenljiva x_poc ima vrednost nula ili -a // 2. Kao i u prethodnom primeru, koju god od ove dve vrednosti promenljiva imala, dodelićemo joj onu drugu vrednost, da bi u sledećem redu crtanje cigala počelo drugačije.

Dovršite naredbe za dodeljivanje vrednosti promenljivoj x_poc.

Druga ideja je da u svakom prolasku kroz dvostruku petlju crtramo ciglu koju smo crtali i u prvom rešenju, a osim nje i ciglu ispod i polu-levo od nje. Primetite da u tom slučaju petlja po y0 ima dvostruko veći korak, jer unutrašnja petlja crta dva reda cigala.

Dovršite naredbe za crtanje pravougaonika u ovom programu.

Zadaci za vežbu

Zadatak - šahovska tabla

Nacrtati šahovsku tablu preko celog prozora (polja table treba da budu veličine 50h50 piksela). Donje levo polje treba da bude tamne boje.

Zadatak - Zgrada

Izmenite program tako da se prozori crtaju u dvostrukoj petlji.

Deo koji treba izmeniti, nakon izmene može da počinje ovako:

for y in range(5):     # sprat
    for x in range(2): # strana zgrade (0 - leva, 1 - desna)
        if (x+y) % 2 == 0:
            boja = ...

Ako sa svim ovim zadacima niste imali većih problema, pokušajte za kraj da rešite i jedan malo teži zadatak.

Zadatak - izazov: Parket

Napišite program koji prikazuje parket (sliku parketa možete da vidite kada kliknete na dugme „Prikaži primer”, a slika je ista kao na početku ove strane, desno). Cilj je, naravno, da se crtanje daščica parketa obavlja u višestrukoj petlji. Dimenzije daščice su 10h60, a boje su „goldenrod” i „brown”.

Kostur programa ugrubo izgleda ovako:

for red ...
    for kol ...
        if ...
            for dascica in range(6):
                pg.draw.rect(...)
        else:
            for dascica in range(6):
                pg.draw.rect(...)