Цртање многоуглова помоћу петљи

Подсетимо се примера програма који црта ограду:

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

Свакако је корисно да се уведе главна тачка (сидро), у односу на коју би била изражена сва темена многоугла. У случају ограде, темена прве притке су [(20, 80), (30, 70), (40, 80), (40, 270), (20, 270)]. Можемо да изаберемо прву наведену тачку (20, 80) за сидро, а остала темена да изразимо помоћу координата прве тачке. Тако добијамо да су темена једне притке [(x, y), (x+10, y-10), (x+20, y), (x+20, y+190), (x, y+190)]. Задавањем x = 20, y = 80 добијамо координате прве притке у огради, а повећавањем x за по 40 можемо да добијемо и остале притке.

y = 80
for x in range(20, 300, 40):
    pg.draw.polygon(prozor, pg.Color('brown'), [(x, y), (x + 10, y-10), (x + 20, y), (x + 20, y+190), (x, y+190)])

Пошто су све притке на истој висини, y координата сидра се не мења па не морамо ни да је уводимо (увођење y координате би нам било потребно када би неке притке биле изнад других). То значи да у овом случају претходни код можемо да напишемо и нешто једноставније.

for x in range(20, 300, 40):
    pg.draw.polygon(prozor, pg.Color('brown'), [(x, 80), (x + 10, 70), (x + 20, 80), (x + 20, 270), (x, 270)])

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

Можемо да израчунамо координате померених темена у додатној петљи:

pritka = [(0, 0), (10, -10), (20, 0), (20, 190), (0, 190)]
y0 = 80
for x0 in range(20, 300, 40):
    pomerena_temena = []
    for x, y in temena:
        pomerena_temena.append((x+x0, y+y0))
    pg.draw.polygon(prozor, boja, pomerena_temena)

Можемо да уведемо функцију за цртање задатог многоугла на задатом месту, па да листу померених темена формирамо у функцији:

def crtaj_mnogougao(temena, boja, x0, y0):
    pomerena_temena = []
    for x, y in temena:
        pomerena_temena.append((x+x0, y+y0))
    pg.draw.polygon(prozor, boja, pomerena_temena)

pritka = [(0, 0), (10, -10), (20, 0), (20, 190), (0, 190)]
for x0 in range(20, 300, 40):
    crtaj_mnogougao(pritka, pg.Color('brown'), x0, 80)

Сваки од ова два начина може да замени седам позива функције pg.draw.polygon из датог почетног примера, и сваки од њих је бољи него цртање притки засебним наредбама. Употреба функције даје нешто дужи код, али има ту предност да се потпуно иста функција може без измене употребити за цртање било ког многоугла на новој позицији.

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

Задаци за вежбу

Задатак - осмоуглови

Написати програм који цтра осмоуглове као у примеру (кликните на дугме „Прикажи пример”).

Функција за цртање многоугла је слична претходној. Разлика је само у томе што се у њој функција pg.draw.polygon позива два пута: једном за унутрашњост многоугла, а други пут за ивице.

Дате су и координате темена осмоугла, остало је да се дода позив функције за цртање у двострукој петљи. И x и y стартују од нуле и повећава ју се за по 48 (48 је „висина” и „ширина” осмоугла).

Задатак - Стрелице

Допуните следећи програм тако да црта задату слику (слику можете да видите кликом на дугме „Прикажи пример”).

На слици се појављују беле стрелице усмерене на лево и црне, усмерене на десно. Како црне и беле стрелице заједно потпуно покривају слику, приметите да је довољно нацртати само црне стрелице (на белој позадини).

Задатак - крдо жирафа

Дате су координате темена многоугла који представља жирафу. Довршите програм тако да (користећи функцију crtaj_mnogougao) исцртава неколико жирафа. Листу положаја жирафе направите по жељи.