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.

Коришћење тригонометрије

Аналогни сат

Напиши програм који приказује аналогни сат.

Кључни део задатка је да се на основу сати, минута и секунди одреде координате крајева казаљки. Претпоставићемо да се положај минутне и сатне казаљке мења сваког минута, а секундне казаљке сваког секунда. Пошто се казаљке крећу равномерном брзином, зависност између угла и броја сати, минута и секунди је линеарна. Угао се, дакле, може израчунати пропорцијом. Броју од 0 секунди одговара угао 0, док броју од 60 секунди одговара угао од 360 секунди. Дакле, угао секундне казаљке може се одредити дељењем броја секунди са 60 и множењем са 360. Веома слично се одређује и угао минутне казаљке. Што се тиче сатне казаљке, потребно је и преподневне и поподневне сате свести на интервал од 0 до 12, што се може урадити једноставим проналажењем остатка при дељењу бројем 12. Пошто желимо да се угао сатне казаљке одређује сваког минута, положај сатне казаљке одређиваћемо претварањем времена протеклог од поднева односно поноћи у минутима. Тај број се може добити множењем тренутног броја сати са 60 и сабирањем са тренутним бројем минута. Времену од 0 сати и 0 минута, тј. вредности од 0 минута, одговара угао од 0 степени, док углу од 12 сати и 0 минута, тј. вредности од 12·60 минута, одговара угао од 360 степени.

Када је познат угао неке казаљке, могу се одредити координате њене завршне тачке коришћењем функције tacka_na_krugu, при чему се за центар круга узима центар сата, а полупречник круга се одређује на основу дужине казаљки (сатна казаљка је најкраћа и њена дужина износи око 70 процената полупречника сата, док су дужина секундне и минутне казаљке око 90 процената полупречника сата). Унутар те функције користимо тригонометријске формуле да бисмо одредили непознате координате.

../_images/sat_koordinate.png

Ако уочимо правоугли троугао A0A, позната нам је дужина његове хипотенузе R, угао α, док нам непознате дужине катета представљају координате тачке A (односно помераје те тачке од центра круга у хоризонталном и вертикалном правцу). Пошто је синус угла однос наспрамне катете и хипотенузе, а косинус угла однос налегле катете и хипотенузе, и пошто у графици y координате расту наниже, добијамо формуле:

x=cx+rsinαy=cyrcosα

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

 
1
import datetime, math
2
import pygame as pg
3
4
import pygamebg
5
6
(sirina, visina) = (300, 300) # otvaramo prozor
7
prozor = pygamebg.open_window(sirina, visina, "Аналогни сат")
8
9
# funkcija koja izrаčunava koordinate tacke na krugu sa centrom
10
# u (x, y), poluprečnika r, koja zaklapa ugao alpha sa položajem
11
# 12 sati
12
def tacka_na_krugu(cx, cy, r, alpha):
13
    alpha_rad = math.radians(alpha)
14
    x = ???
15
    y = ???
16
    return (x, y)
17
18
def crtaj():
19
    # bojimo pozadinu u belo
20
    prozor.fill(pg.Color("white"))
21
22
    # crtamo krug sata
23
    (cx, cy) = (sirina // 2, visina // 2)
24
    r = round(0.9 * min(sirina // 2, visina // 2))
25
    pg.draw.circle(prozor, pg.Color("black"), (cx, cy), r, 5)
26
27
    # crtamo male podeoke za svaki minut
28
    for ugao in range(0, 360, ???):
29
        (x1, y1) = tacka_na_krugu(cx, cy, 0.9*r, ugao)
30
        (x2, y2) = tacka_na_krugu(cx, cy, r, ugao)
31
        pg.draw.line(???)
32
33
    # crtamo malo vece podeoke za svaki sat
34
    for ugao in range(0, 360, ???):
35
        (x1, y1) = tacka_na_krugu(cx, cy, 0.8*r, ugao)
36
        (x2, y2) = tacka_na_krugu(cx, cy, r, ugao)
37
        pg.draw.line(???)
38
39
    # ispisujemo brojeve
40
    font = pg.font.SysFont('Arial', 15)     # font kojim cemo pisati brojeve
41
    for i in range(1, 12+1):
42
        ugao = ???
43
        tekst = font.render(str(i), True, pg.Color("black"))         # tekst koji se ispisuje
44
        (tekst_sirina, tekst_visina) = (tekst.get_width(), tekst.get_height())   # dimenzije teksta
45
        (x, y) = tacka_na_krugu (cx, cy, 0.75*r, ugao)                           # prikazujemo tekst tako da mu je centar tacka na krugu
46
        prozor.blit(tekst, (x - tekst_sirina / 2, y - tekst_visina / 2))
47
48
    # crtamo kazaljke
49
50
    # određujemo trenutno vreme
51
    vreme = datetime.datetime.now()
52
    sati = vreme.hour % 12 # svodimo sate na interval [0, 12)
53
    minuta = vreme.minute
54
    sekundi = ???
55
56
    # na osnovu vremena izračunavamo uglove koje kazaljke zaklapaju sa
57
    # položajem podneva
58
    ugao_sekundne_kazaljke = ???
59
    ugao_minutne_kazaljke = ???
60
    ugao_satne_kazaljke = ???
61
62
    # crtamo jednu po jednu kazaljku
63
    (x, y) = tacka_na_krugu(cx, cy, round(0.9*r), ugao_sekundne_kazaljke)
64
    pg.draw.line(prozor, pg.Color("red"), (cx, cy), (x, y), 3)
65
    (x, y) = tacka_na_krugu(cx, cy, round(0.9*r), ugao_minutne_kazaljke)
66
    pg.draw.line(prozor, pg.Color("black"), (cx, cy), (x, y), 5)
67
    (x, y) = tacka_na_krugu(cx, cy, round(0.7*r), ugao_satne_kazaljke)
68
    pg.draw.line(prozor, pg.Color("black"), (cx, cy), (x, y), 10)
69
70
# funkciju crtaj pozivamo svake sekunde
71
pygamebg.frame_loop(1, crtaj)
72

(analogni_sat)