Processing math: 100%

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Час 8 - понављање облика коришћењем петљи

Употреба генератора случајних бројева

Функцијом random.randint(a, b) можемо добити насумично одабран цео број из интервала [a,b]. Ово може бити веома корисно када је потребно да цртеж испунимо са већим бројем неправилно распоређених облика. Слично, функцијом random.uniform(a, b) добијамо насумично одабрани реални број из интервала [a,b].

Ноћно небо

Смркнуло се и небо је препуно звездица. Уз звездице се види и пун месец. Нацртај такав цртеж.

 
1
import random
2
import pygame as pg
3
import pygamebg
4
5
(sirina, visina) = (300, 300) # otvaramo prozor
6
prozor = pygamebg.open_window(sirina, visina, "Ноћно небо")
7
8
# bojimo pozadinu prozora u crno
9
prozor.fill(pg.Color("black"))
10
11
# crtamo 100 nasumično raspoređenih zvezdica
12
for i in range(100):
13
    # nasumično određujemo koordinate
14
    x = random.randint(0, sirina)
15
    y = ???
16
    # crtamo zvezdicu kao mali kružić
17
    ???
18
19
# crtamo mlad mesec pomoću jednog crnog i jednog belog kruga
20
pg.draw.circle(prozor, pg.Color("white"), (100, 100),  30)
21
pg.draw.circle(prozor, pg.Color("black"), (???, ???),  30)
22
23
# prikazujemo prozor i čekamo da ga korisnik isključi
24
pygamebg.wait_loop()
25

(nocno_nebo)

Насумичне боје

Украсићемо собу тако што ћемо на плафон окачити 5 балона у насумично одабраним бојама. Напиши програм који исцртава овакав цртеж, при чему сваки балон црта у облику елипсе.

Генератор случајних бројева можемо употребити и да насумично одаберемо боју. Довољно је да за сваку од црвене, зелене и плаве компоненте насумично одаберемо број између 0 и 255. Ово можемо издвојити у посебну функцију коју ћемо позвати када год нам затреба насумична боја.

Прикажимо и како да равномерно распоредимо балоне по плафону. Претпоставимо да треба да распоредимо n балона. Ширину екрана ћемо поделити на n једнаких делова. Сваки балон ћемо закачити на средину њему одговарајућег дела. Ширину једног дела можемо израчунати тако што ширину екрана поделимо са бројем делова, x координату левог краја i-тог дела (где бројање креће од 0) добијамо тако што ширину једног дела помножимо са i, док x координату средине тог дела (тачке у којој се налази врх балона) добијамо тако што на леви крај додамо још пола ширине дела. На основу те тачке лако израчунавамо горњу леву тачку правоугаоника описаног око елипсе (x координату добијамо тако што од x координате средине поља одузмемо пола ширине елипсе, док је y координата једнака нули).

26
 
1
import random
2
import pygame as pg
3
import pygamebg
4
5
(sirina, visina) = (300, 300) # otvaramo prozor
6
prozor = pygamebg.open_window(sirina, visina, "Балони")
7
8
# funkcija koja na nasumičan način određuje boju
9
def nasumicna_boja():
10
    return (random.randint(0, 255), ???,  random.randint(0, 255))
11
12
# bojimo pozadinu prozora u crno
13
prozor.fill(pg.Color("yellow"))
14
15
# crtamo balone
16
broj_balona = 5
17
sirina_polja = ???
18
sirina_balona = 50
19
visina_balona = 70
20
for i in range(broj_balona):
21
    centar_polja = i*sirina_polja + sirina_polja / 2
22
    pg.draw.ellipse(prozor, ???, (???, ???, ???, ???))
23
24
# prikazujemo prozor i čekamo da ga korisnik isključi
25
pygamebg.wait_loop()
26

(baloni)

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

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

Напиши програм који дуж целе главне дијагонале прозора распоређује n=10 једнаких кругова.

Пречници кругова деле главну дијагоналу на n једнаких делова. Полупречник кругова можемо израчунати тако што дужину дијагонале поделимо са 2n, а дужину дијагонале можемо израчунати Питагорином теоремом као s2+v2, где су s и v ширина тј. висина прозора. На основу Талесове теореме (сличности троуглова) пројекције центара кругова на x осу и на y осу деле те две осе у истом односу у ком центри кругова деле дужину дијагонале. Ако са kx означимо n-ти део ширине прозора, а са ky означимо n-ти део висине прозора, тада прва тачка има координате (kx2,ky2), друга има координате (kx2+kx,ky2+ky), трећа има координате (kx2+2kx,ky2+2ky) итд. На основу овога допуни наредни програм.

26
 
1
import math
2
import pygame as pg
3
import pygamebg
4
5
(sirina, visina) = (500, 400) # otvaramo prozor
6
prozor = pygamebg.open_window(sirina, visina, "Кругови на дијагонали")
7
8
# broj krugova
9
n = 10
10
# dužina dijagonale
11
d = round(???)
12
# poluprečnik krugova
13
r = round(???)
14
# razmak između centara krugova po x i y osi
15
kx = round(???)
16
ky = round(???)
17
18
# bojimo pozadinu prozora u belo
19
prozor.fill(pg.Color("white"))
20
# crtamo krugove
21
for i in range(n):
22
    pg.draw.circle(prozor, pg.Color("red"), (???*kx, ???*ky), r, 3)
23
24
# prikazujemo prozor i čekamo da ga korisnik isključi
25
pygamebg.wait_loop()
26

(krugovi_na_dijagonali)

Шума

Поред скијашке стазе постављена су два реда јелки. Напиши програм који исцртава ову скијашку стазу.

Претпоставићемо да на располагању имамо функцију која црта јелку. Овај пут ће та функција примати координате сидра (средину дна стабла јелке), али и димензију јелке. Да би цртеж реалније изгледао претпоставићемо да неће све крошње бити у истој нијанси зелене боје, већ да ће неке бити тамније, а неке светлије. Стога ћемо функцији за цртање јелке прослеђивати и четврти параметар који ће представљати фактор промене основне зелене боје. Промену боје ћемо постићи кроз посебну функцију која сваку појединачну компоненту дате боје множи са задатим коефицијентом. Ако је тај коефицијент број мањи од 1, тада боја постаје тамнија, а ако је већи од 1, тада боја постаје светлија. Приликом сваког позива функције фактор ћемо одређивати као насумично одабран реалан број из интервала [0.2,2], позивом функције random.uniform(0.2, 2.0).

У главном делу програма распоредићемо 6 јелки левог и 6 јелки десног дрвореда. У петљама ћемо одржавати координате сидра текуће јелке. Леви дрворед ће кретати мало испод линије хоризонта и мало лево од вертикалне средине екрана и свако дрво ће бити померено доле, лево у односу на претходно. То ћемо постићи тако што ћемо у сваком кораку петље умањивати x и увећавати y координату. Слично, десни дрворед ће кретати мало испод линије хоризонта и мало десно од вертикалне средине екрана и свако дрво ће бити померено доле, десно у односу на претходно. То ћемо постићи тако што ћемо у сваком кораку петље увећавати и x и y координату. Да би се постигао ефекат перспективе, свако наредно дрво биће мало веће у односу на претходно. То ћемо постићи тако што ћемо у сваком кораку петље увећавати и димензију текућег дрвета.

Допуни наредни програм на основу претходне дискусије.

56
 
1
import random
2
import pygame as pg
3
import pygamebg
4
5
(sirina, visina) = (800, 600) # otvaramo prozor
6
prozor = pygamebg.open_window(sirina, visina, "Дрворед")
7
8
def promeni_nijansu(boja, faktor):
9
    (r, g, b) = boja
10
    return (round(r*faktor), round(g*faktor), ???)
11
12
def jelka(x, y, dim, faktor_promene_boje):
13
    # boje koje cemo koristiti
14
    CRNA  = (0, 0, 0)
15
    ZELENA = (0, 100, 36)
16
    BRAON = (97, 26, 9)
17
    nijansa_zelene = promeni_nijansu(ZELENA, faktor_promene_boje)
18
19
    j = dim / 300
20
    pg.draw.rect(prozor, BRAON, (x-20*j, y-50*j, 40*j, 50*j))
21
    # krošnja - trougao A
22
    Alevo = (x-100*j, y-50*j)
23
    Adesno = (x+100*j, y-50*j)
24
    Agore = (x, y-150*j)
25
    pg.draw.polygon(prozor, nijansa_zelene, [Alevo, Adesno, Agore])
26
    # krošnja - trougao B
27
    Blevo = (x-75*j, y-100*j)
28
    Bdesno = (x+75*j, y-100*j)
29
    Bgore = (x, y-200*j)
30
    pg.draw.polygon(prozor, nijansa_zelene, [Blevo, Bdesno, Bgore])
31
    # krošnja - trougao C
32
    ???
33
34
# bojimo pozadinu u belo
35
prozor.fill(pg.Color("white"))
36
horizont_y = visina * 0.55         # visina linije horizonta
37
# crtamo nebo i sunce
38
pg.draw.rect(prozor, pg.Color("skyblue"), (0, 0, sirina, horizont_y))
39
pg.draw.circle(prozor, pg.Color("yellow"), (150, 150), 65)
40
41
broj_stabala = 6
42
43
# crtatmo levi drvored
44
x, y, dim = sirina / 2 - 0.1 * sirina, horizont_y + 0.1 * visina,  150
45
for i in range(broj_stabala):
46
    jelka(x, y, dim, random.uniform(0.2, 2.0))
47
    x -= 0.075 * sirina
48
    y += 0.05 * visina
49
    dim += 20
50
51
# crtamo desni drvored
52
???
53
54
# prikazujemo prozor i čekamo da ga korisnik isključi
55
pygamebg.wait_loop()
56

(suma2)

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

Чињеница да су нијансе боја одређене бројевима између 0 и 255 нам омогућава и да аутоматски израчунавамо нијансе боја тако да боје буду распоређене дуж неког дела спектра боја. Прикажимо ову технику кроз неколико примера.

Квадрати у нијансама црвене боје

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

Нијансе црвене боје су одређене тиме да садрже само црвену компоненту боје, док су зелена и плава на нули. Боје иду од чисте црвене ([255, 0, 0]), па до црне ([0, 0, 0]). Претпоставићемо да је разлика количине светлости између сваке две суседне нијансе иста. Ако је та разлика r, тада је црвена компонента у нашим бојама редом 0, r, 2r, 3r, 4r и 5r. Пошто најсветлија боја треба да буде најсветлија важи да је 5r=255, тј. да је r=51. Дакле, боје су редом одређене са [255, 0, 0], [204, 0, 0], [153, 0, 0], [102, 0, 0], [51, 0, 0] и [0, 0, 0]. Опет претпостављамо да су димензије квадрта 50 пута 50 пиксела, тако да квадрате редом распоређујемо дуж прозора димензије 300 пута 50 пиксела.

17
 
1
import pygame as pg
2
import pygamebg
3
4
(sirina, visina) = (300, 50) # otvaramo prozor
5
prozor = pygamebg.open_window(sirina, visina, "Квадрати у нијансама црвене боје")
6
7
# crtamo 6 kvadrata
8
pg.draw.rect(prozor, [???, 0, 0], (???, 0, 50, 50))
9
pg.draw.rect(prozor, [???, 0, 0], (???, 0, 50, 50))
10
pg.draw.rect(prozor, [???, 0, 0], (???, 0, 50, 50))
11
pg.draw.rect(prozor, [???, 0, 0], (???, 0, 50, 50))
12
pg.draw.rect(prozor, [???, 0, 0], (???, 0, 50, 50))
13
pg.draw.rect(prozor, [0,   0, 0], (???, 0, 50, 50))
14
15
# prikazujemo prozor i čekamo da ga korisnik isključi
16
pygamebg.wait_loop()
17

(sest_nijansi_crvene)

Наравно, много бољи кôд добијамо ако задатак решимо уз помоћ петље.

13
 
1
import pygame as pg
2
import pygamebg
3
4
(sirina, visina) = (300, 50) # otvaramo prozor
5
prozor = pygamebg.open_window(sirina, visina, "Квадрати у нијансама црвене боје")
6
7
broj_kvadrata = 6
8
razmak = 255 / (broj_kvadrata -  1) # razmak između dve susedne nijanse
9
???
10
11
# prikazujemo prozor i čekamo da ga korisnik isključi
12
pygamebg.wait_loop()
13

(sest_nijansi_crvene_petlja)

Оптичка варка

Позадину прозора обоји у нијансе сиве боје које се постепено мењају од црне на левој ивици прозора до беле на десној ивици. Након тога у средини прозора нацртај правоугаоник сиве боје висине 50 пиксела и ширине једанке три четвртине ширине екрана. Видећеш интересантну оптичку варку.

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

17
 
1
import pygame as pg
2
import pygamebg
3
4
(sirina, visina) = (512, 250) # otvaramo prozor
5
prozor = pygamebg.open_window(sirina, visina, "Градијент")
6
7
# bojimo pozadinu gradijentom tako što iscrtavamo 256 jednakih pravougaonika
8
???
9
10
# crtamo jednobojni sivi pravougaonik u sredini
11
sx = 0.75 * sirina  # širina pravougaonika je 3/4 širine prozora
12
sy = 50             # visina pravougaonika je 50 piksela
13
???
14
15
# prikazujemo prozor i čekamo da ga korisnik isključi
16
pygamebg.wait_loop()
17

(gradijent)

Домаћи задатак - прелаз између две боје

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

Кључни проблем у овом задатку је како извршити постепени прелаз нијанси између две задате боје. Кључни увид је да се прелаз врши независно за црвену, зелену и плаву компоненту. Пошто желимо да прелаз буде постепен и равномеран, конструисаћемо линеарне функције. Претпоставимо да имамо n правоугаоника тј. n нијанси које треба да одредимо. Претпоставимо да је вредност неке компоненте боје за почетни правоугаоник a, а за крајњи b. За ту компоненту је потребно онда конструисати линеарну функцију која слика редни број правоугаоника i у вредност те компоненте боје за тај правоугаоник такву да је за први правоугаоник тј. за i=0 вредност те компоненте a, а за последњи правоугаоник тј. за i=n1 вредност те компоненте b. Функција је облика pi+q и непознате коефицијенте p и q одређујемо из почетних услова. Дакле, за i=0 важи да је p0+q=a тј. q=a. Даље, за i=n1 важи да је p(n1)+q=b, па је p=ban1. Дакле, вредност те компоненте за правоугаоник број i се израчунава као a+iban1. Пошто ово не мора бити цео број, потребно га је заокружити (нпр. функцијом round).

24
 
1
import random
2
import pygame as pg
3
import pygamebg
4
5
(sirina, visina) = (300, 50) # otvaramo prozor
6
prozor = pygamebg.open_window(sirina, visina, "Прелаз боја")
7
8
def nasumicna_boja():
9
    return (???, ???, ???)
10
11
broj_nijansi = 10
12
sirina_polja = ???
13
visina_polja = visina
14
(r1, b1, g1) = nasumicna_boja()
15
(r2, b2, g2) = nasumicna_boja()
16
for i in range(0, broj_nijansi):
17
    r = round(r1 + i*(r2 - r1)/broj_nijansi)
18
    g = round(???)
19
    b = round(???)
20
    pg.draw.rect(prozor, (r, g, b), (???, 0, sirina_polja, ???))
21
22
# prikazujemo prozor i čekamo da ga korisnik isključi
23
pygamebg.wait_loop()
24

(prelaz_boja)