Час 10 - цртање у петљама - утврђивање¶
На овом часу додатно увежбај цртање уз помоћ петљи тако што ћеш урадити још неколико задатака из ове области. Не мораш да урадиш све задатке, већ само одабери оне који ти се из неког разлога највише допадају. Пожељно је да сваки задатак урадиш самостално, од почетка до краја. Тек ако из више покушаја не успеш, онда потражи помоћ, па покушај да допуниш код. Ако ни то не успеш, онда погледај коначно решење.
Испрекидана линија¶
Напиши програм који по средини екрана исцртава испрекидану линију код које је свака линијица обојена насумично одабраном бојом. Дужине линијица и размак између њих су једнаки 30 пиксела, а дебљина линије је 5 пиксела.
import random
import pygame as pg
import pygamebg
(sirina, visina) = (400, 400) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Испрекидана линија")
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(isprekidana_linija)
Црта-тачка линија¶
Напиши програм који црта зелену испрекидану линију „црта-тачка”.
import random
import pygame as pg
import pygamebg
(sirina, visina) = (400, 400) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Испрекидана линија црта-тачка")
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(crta_tacka)
Шпартање дијагоналама¶
У једном од претходних задатака шпартали смо прозор водоравним и усправним линијама. Тада смо видели да се крајње тачке тих линија налазе на ободу прозора и имају координате облика (i⋅dx,0), (i⋅dx,v), (0,i⋅dy) и (s,i⋅dy), где су dx и dy хоризонтално тј. вертикално растојање између две линије, док су s и v ширина тј. висина прозора. Ако употребимо исте тачке, али их спојимо дужима на мало другачији начин, можемо добити веома интересантне шаре.
Напиши програм који дијагонално шпарта прозор у правцу споредне дијагонале. Број линија изнад споредне дијагонале (укључујући и њу) је n=10 (исто важи и за број линија испод споредне дијагонале).
Крајње тачке ових дужи деле сваку од ивица прозора на по n
једнаких делова. Стога се растојање dx између суседних тачака
на горњој (и доњој) ивици прозора може израчунати дељењем ширине, а
растојање dy између суседних тачака на левој (и десној) ивици
дељењем висине прозора бројем n. Посматрајмо дужи које спајају
леву и горњу ивицу прозора (последња таква је споредна
дијагонала). Прва дуж спаја тачке са координатама (dx,0) и
(0,dy), друга дуж тачке са координатама (2dx,0) и (0,2dy) итд. Дакле, те дужи можемо нацртати тако
што у петљи у којој бројачка променљива i
мења вредности од 1 до
n
цртамо дужи које спајају тачке са координатама (i*dx, 0)
и
(0, i*dy)
. Слично, прва дуж испод дијагонале спаја тачке са
координатама (w,dy) и (dx,h), друга тачке са
координатама (w,2dy) и (2dx,h) итд.,
где w означава ширину, а h висину екрана. Дакле, те
дужи можемо нацртати тако што у петљи у којој бројачка променљива
i
мења вредности од 1 до n-1
цртамо дуж која спаја тачке са
координатама (sirina, i*dy)
и (i*dx, visina)
.
На основу претходне дискусије напиши наредни програм.
import pygame as pg
import pygamebg
(sirina, visina) = (400, 300) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Дијагонално шпартање")
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(dijagonalno_spartanje)
Програм се може мало једноставније написати ако се не обазиремо на то да крајње тачке дужи изађу ван граница прозора.
# crtamo linije i van granica prozora, računajuci da se deo linija
# koji ne pripada prozoru neće ni videti
for i in range(2*n):
pg.draw.line(prozor, CRNA, (0, i*dy), (i*dx, 0), 1)
(spartanje_dijagonale_van_prozora)
Ажурирај претходни програм тако да се додају и дијагонале паралелне главној дијагонали исцртане црвеном бојом.
import pygame as pg
import pygamebg
(sirina, visina) = (400, 300) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Дијагонално шпартање")
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(dijagonalno-spartanje-2)
Шарање ротираним дужима¶
Напиши програм који исцртава шару по прозору која је креирана од дужи, како је приказано на слици.

Иако шара изгледа на први поглед прилично различито, овај програм је
заправо прилично сличан претходном. Прва дуж спаја тачке се
координатама (0,dy) и (dx,h), друга спаја тачке са
координатама (0,2dy) и (2dx,h), итд., све до дужи
која спаја тачке (0,(n−1)⋅dy) и ((n−1)⋅dx,h), где је h висина прозора. Дакле, дужи можемо нацртати у
петљи у којој се бројачка променљива i
креће од 1
до n-1
,
у чијем телу цртамо дуж која спаја тачке са координатама (0, i*dy)
и (i*dx, visina)
. Ако би се бројач у петљи мењао од 0
до
n
, тада би се цртале и прва вертикална и последња хоризонтална дуж
(oне се не виде, јер се поклапају са ивицама прозора).
На основу претходне дискусије допуни наредни програм.
import pygame as pg
import pygamebg
(sirina, visina) = (400, 300) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Ротиране дужи")
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(rotirane_duzi)
Допуни претходни програм тако да се сличан шаблон понавља у сва четири угла прозора, како је приказано на слици.

Пажљиво анализирај координате крајњих тачака дужи, уочи правилности, експериментиши и покушај тако да дођеш до решења.
import pygame as pg
import pygamebg
(sirina, visina) = (400, 300) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Ротиране дужи")
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(rotirane_duzi2)
Крешендо¶
Напиши програм који исцртава 100 паралелних вертикалних линија равномерно распоређених ширином прозора, тако да дужина тих линија равномерно расте од нуле па до висине прозора.
import pygame as pg
import pygamebg
(sirina, visina) = (800, 200) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Крешендо")
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(kresendo)
Лоптице¶
Напиши програм који исцртава лоптице хоризонтално распоређене по средини екрана, који се међусобно додирују, тако да је полупречник прве 10 пиксела, а полупречник сваке наредне за 10 пиксела већи од претходне. Лоптице су наизменично црвене, зелене, плаве и жуте боје (и тако у круг).
import pygame as pg
import pygamebg
(sirina, visina) = (800, 200) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Шарене лоптице")
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(loptice.py)
Згуснуте линије¶
Нацртај цртеж у ком се усправне линије полако разређују како се померамо ка десној страни прозора.
import pygame as pg
import pygamebg
(sirina, visina) = (400, 400) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Згуснуте линије")
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(zgusnute_linije)
Цигле¶
Редови цигала наизменично почињу целом циглом и половином цигле. Нека
је ширина цигле означена са s, а њена висина са
v. Целу циглу на почетку реда добијамо тако што цртамо
правоугаоник од тачке на датој висини, са x координатом
једнаком нули. Половину цигле на почетку реда можемо да добијемо тако
што нацртамо целу циглу померену за s2 улево, то јест
тако што цртамо правоугаоник од такче на истој висини, али са
x координатом једнаком -s // 2
. Тако постижемо да се види
само десна половина цигле. Остаје да решимо када цртамо померену циглу
а када не.
Једно решење је да место почетка реда цигала чувамо у променљивој,
назовимо је x_poc
. После сваког исцртаног реда, проверавамо да ли
променљива x_poc
има вредност нула или -s // 2
. Коју год
од ове две вредности променљива имала, доделићемо јој ону другу
вредност, да би у следећем реду цртање цигала почело другачије.
Нагласимо да корак у петљи мора бити целобројна вредност тако да пола ширине цигле морамо израчунати целобројним дељењем.
import pygame as pg
import pygamebg
(sirina, visina) = (300, 300) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Цигле")
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(PyGame_loops_bricks1)
Тараба¶
Напиши програм који црта сеоску ограду (тарабу).
Сваку притку ограде представићемо у облику многоугла. Да бисмо притке могли да цртамо на различитим позицијама, потребно је да координате тог многоугла буду задате релативно. Пошто ће све притке бити увек на истој висини (истој y координати), довољно је да притке буду параметризоване једним параметром - координатом x левог краја притке.
Један начин је да у задавању темена притке користимо променљиву x
,
која се мења у петљи. Када би се притке померале и на горе или на
доле, онда би у задавању темена учествовала и променљива 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)])
(ograda_1nacin)
Можемо и да уведемо функцију која црта притку у односу на њену релативно задату x координату.
def pritka(x):
temena = [(x, 80), (x+10, 70), (x+20, 80), (x+20, 270), (x, 270)]
pg.draw.polygon(prozor, boja, temena)
for x in range(20, 300, 40):
pritka(x)
(ograda_2nacin)
Још једна могућност је да приликом цртања пресликамо координате основне листе (коришћењем компрехенсије тј. скуповне нотације за листе).
temena = [(20, 80), (30, 70), (40, 80), (40, 270), (20, 270)]
for i in range(7):
pg.draw.polygon(prozor, pg.Color('brown'), [(x + 40*i, y) for (x,y) in temena])
(ograda_3nacin)
Коришћењем било ког од наведених решења нацртај тарабу.
import pygame as pg
import pygamebg
(sirina, visina) = (300, 300) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Тараба")
???
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(PyGame_loops_fence)