Садржај
1. Програмирање у пајтону - Увод у Pygame
15. Цртање уз помоћ петљи - обнављање
16. Завршни квиз

9.1. Релативне координате - утврђивање

Упознали смо се са релативно задатим координатама и предностима тог механизма цртања. Утврдимо ово кроз примере који следе.

Примери:

Саобраћајни знак од једнакостраничних троуглова

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

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

Приликом цртања саобраћајног знака потребно је да одредимо поступак којим се црта једнакостранични троугао. Сидро ћемо поставити у тежиште T, које има координате (tx,ty). Димензија троугла може бити било дужина странице a, било висина h, јер се из једне од ових димензија друга једноставно израчунава на основу познате везе h=a32.

Извођење везе висине и странице применом Питагорине теореме

Веза h=a32 се лако изводи применом Питагорине теореме на правоугли троугао чија је једна катета висина једнакостраничног троугла, друга половина странице, а хипотенуза је страница једнакостраничног троугла.

../_images/jednakostranicanTrougaoZnak.png

Из математике знамо да тежиште троугла дели тежишну дуж (у овом случају то је уједно и висина) у односу 2:1, тако да су координате темена A и B у односу на ову тачку померене (транслиране) на горе за 13h, док је тачка C померена на доле за 23h.

Координате x ових тачака одређујемо у односу на тачку T, користећи дужину странице a. Тачка А је померена од тежишта за а2 ка левој ивици прозора. Тачка В је померена од тежишта за а2 ка десној ивици. Тачка C има исту x координату као и тежиште.

Дакле, тачка A има координате (txa2,tyh3), тачка B има координате (tx+a2,tyh3), док тачка C има координате (tx,ty+2h3).

Пошто је потребно да нацртамо два троугла, можемо дефинисати функцију за цртање троугла и позвати је два пута (за исто тежиште, али различите боје и димензије). Тежиште ћемо поставити хоризонтално на средину прозора, док ћемо га вертикално поставити тако да троугао делује центриран по средини прозора. Оставићемо простор (маргину) од по 30 пиксела изнад и испод троугла, а тежиште троугла ћемо поставити тако да преосталу висину дели у односу 1:2.

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

 
1
import math
2
import pygame as pg
3
import pygamebg
4
5
(sirina, visina) = (300, 300) # otvaramo prozor
6
prozor = pygamebg.open_window(sirina, visina, "Saobracajni znak")
7
8
def jedakostranicni_trougao(tx, ty, h, boja):
9
    a = h * 2 / math.sqrt(3)       # dužina stranice
10
    # koordinate temena - težište deli visinu u odnosu 1 : 2
11
    A = (tx - a/2, ty - h/3)
12
    B = (???, ???)
13
    C = (???, ???)
14
    pg.draw.polygon(prozor, ???, ???)
15
16
# bojimo pozadinu prozora u belo
17
prozor.fill(pg.Color("white"))
18
margina = 30
19
h = visina - 2*margina
20
(tx, ty) = (sirina / 2, margina + h / 3)
21
jedakostranicni_trougao(tx, ty, h, pg.Color("red"))
22
jedakostranicni_trougao(tx, ty, 0.65*h, pg.Color("yellow"))
23
24
# prikazujemo prozor i čekamo da ga korisnik isključi
25
pygamebg.wait_loop()
26

(obojeni_trougao)

Проблеми приликом израчунавања параметара кругова

Подсетимо се да, за разлику од функција за цртање линија и правоугаоника које примају и реалне аргументе, функција за цртање кругова захтева да су координате центра круга и дужина полупречника искључиво цели бројеви. Ово може довести до одређених проблема у програмима у којима се ти аргументи израчунавају у програму. Када видиш поруку TypeError: integer argument expected, got float, тада знај да је проблем у томе што је функцији за цртање круга уместо целог прослеђен неки реалан број и тај проблем можеш лако решити коришћењем неког облика заокруживања бројева.

Зато ћемо често у задацима у којима цртамо кругове, морати да користимо заокруживање реалних бројева (функцијом round или функцијом int) када извршимо потребна израчунавања.

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

Q-39: Након позива pg.draw.circle(prozor, boja, (x, y), r) пријављена је грешка TypeError: integer argument expected, got float. Шта може бити узрок те грешке?







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

Цвет

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

../_images/roze_cvet.png

За цртање круга потребно је знати координате центра и дужину полупречника круга. Пречник свих кругова је једнак, самим тим и полупречник r=a2. Нека је тачка О центар жутог, централног круга. Координате ове тачке означимо са (cx,cy). Ова тачка се налази у центру прозора и њене координате једнаке су половини висине, односно ширине прозора. Координате осталих центара кругова изразићемо такође преко координата (cx,cy). Координате тачке А1 означимо са (x1,y1). Тачка А1 је за a померена (транслирана) од тачке О по оси x, тако да је x1, прва координата ове тачке једнака x1=cx+a, а друга координата ове тачке y1 једнака је y координати тачке О, тј. y1=cy. Координате тачке А2 означимо са (x2,y2). Ова тачка је у односу на тачку О померена (транслирана) за a2 по оси x, односно за висину h=a32 једнакостраничног троугла OA1A2 по оси y. На основу овога закључујемо да су координате тачке А2 (x2,y2)=(cx+a2,cy+h). Координате центра осталих кругова одређујемо на сличан начин.

На основу претходне дискусије, допуни наредни програм и поправи грешке везане за тип података бројева:

56
 
1
import math
2
import pygame as pg, pygamebg
3
4
(sirina, visina) = (400, 400)  # uključujemo prozor dimenzije 400x400 piksela
5
prozor = pygamebg.open_window(400, 400, "Blue circle")
6
7
# boje koje ćemo koristiti
8
BELA = (255, 255, 255)
9
ZUTA = (255, 255, 0)
10
ROZE = (255, 200, 200)
11
12
# bojimo pozadinu u belo
13
prozor.fill(BELA)
14
15
# koordinate centra prozora
16
(cx, cy) = (sirina / 2, visina / 2)
17
18
# prečnici krugova - dužina stranice pravilnog šestougla u čijim se
19
# temenima nalaze centri krugova
20
a = 100
21
# visina karakterističnog trougla šestougla
22
h = a * math.sqrt(3) / 2
23
24
# sva temena šestougla dele ove koordinate
25
x1 = cx - a
26
x2 = cx - a/2
27
x3 = cx + a/2
28
x4 = cx + a
29
y1 = ???
30
y2 = cy
31
y3 = ???
32
33
# koordinate temena šestougla
34
O = (cx, cy)
35
A1 = (x1, y2)
36
A2 = (???, ???)
37
A3 = (???, ???)
38
A4 = (???, ???)
39
A5 = (???, ???)
40
A6 = (???, ???)
41
42
# poluprečnik krugova
43
r = a / 2
44
45
# iscrtavamo krugove
46
pg.draw.circle(prozor, ZUTA, O, r)
47
pg.draw.circle(prozor, ROZE, A1, r)
48
pg.draw.circle(prozor, ROZE, A2, ???)
49
pg.draw.circle(prozor, ROZE, ???, ???)
50
pg.draw.circle(prozor, ROZE, ???, ???)
51
pg.draw.circle(prozor, ROZE, ???, ???)
52
pg.draw.circle(prozor, ROZE, ???, ???)
53
54
# prikazujemo prozor i čekamo da ga korisnik isključi
55
pygamebg.wait_loop()
56

(cvet)

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