9.1. Релативне координате - утврђивање¶
Упознали смо се са релативно задатим координатама и предностима тог механизма цртања. Утврдимо ово кроз примере који следе.
Примери:¶
Саобраћајни знак од једнакостраничних троуглова¶

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

Из математике знамо да тежиште троугла дели тежишну дуж (у
овом случају то је уједно и висина) у односу
Координате
Дакле, тачка
Пошто је потребно да нацртамо два троугла, можемо дефинисати функцију за цртање троугла и позвати је два пута (за исто тежиште, али различите боје и димензије). Тежиште ћемо поставити хоризонтално на средину прозора, док ћемо га вертикално поставити тако да троугао делује центриран по средини прозора. Оставићемо простор (маргину) од по 30 пиксела изнад и испод троугла, а тежиште троугла ћемо поставити тако да преосталу висину дели у односу 1:2.
На основу претходне дискусије допуни наредни програм:
import math
import pygame as pg
import pygamebg
(sirina, visina) = (300, 300) # otvaramo prozor
prozor = pygamebg.open_window(sirina, visina, "Saobracajni znak")
def jedakostranicni_trougao(tx, ty, h, boja):
a = h * 2 / math.sqrt(3) # dužina stranice
# koordinate temena - težište deli visinu u odnosu 1 : 2
A = (tx - a/2, ty - h/3)
B = (???, ???)
C = (???, ???)
pg.draw.polygon(prozor, ???, ???)
# bojimo pozadinu prozora u belo
prozor.fill(pg.Color("white"))
margina = 30
h = visina - 2*margina
(tx, ty) = (sirina / 2, margina + h / 3)
jedakostranicni_trougao(tx, ty, h, pg.Color("red"))
jedakostranicni_trougao(tx, ty, 0.65*h, pg.Color("yellow"))
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(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 пиксела).

За цртање круга потребно је знати координате центра и дужину
полупречника круга. Пречник свих кругова је једнак, самим тим и
полупречник
На основу претходне дискусије, допуни наредни програм и поправи грешке везане за тип података бројева:
import math
import pygame as pg, pygamebg
(sirina, visina) = (400, 400) # uključujemo prozor dimenzije 400x400 piksela
prozor = pygamebg.open_window(400, 400, "Blue circle")
# boje koje ćemo koristiti
BELA = (255, 255, 255)
ZUTA = (255, 255, 0)
ROZE = (255, 200, 200)
# bojimo pozadinu u belo
prozor.fill(BELA)
# koordinate centra prozora
(cx, cy) = (sirina / 2, visina / 2)
# prečnici krugova - dužina stranice pravilnog šestougla u čijim se
# temenima nalaze centri krugova
a = 100
# visina karakterističnog trougla šestougla
h = a * math.sqrt(3) / 2
# sva temena šestougla dele ove koordinate
x1 = cx - a
x2 = cx - a/2
x3 = cx + a/2
x4 = cx + a
y1 = ???
y2 = cy
y3 = ???
# koordinate temena šestougla
O = (cx, cy)
A1 = (x1, y2)
A2 = (???, ???)
A3 = (???, ???)
A4 = (???, ???)
A5 = (???, ???)
A6 = (???, ???)
# poluprečnik krugova
r = a / 2
# iscrtavamo krugove
pg.draw.circle(prozor, ZUTA, O, r)
pg.draw.circle(prozor, ROZE, A1, r)
pg.draw.circle(prozor, ROZE, A2, ???)
pg.draw.circle(prozor, ROZE, ???, ???)
pg.draw.circle(prozor, ROZE, ???, ???)
pg.draw.circle(prozor, ROZE, ???, ???)
pg.draw.circle(prozor, ROZE, ???, ???)
# prikazujemo prozor i čekamo da ga korisnik isključi
pygamebg.wait_loop()
(cvet)