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.

Кретање по законима физике

Коси хитац

Напиши програм који симулира кретање топовског ђулета испаљеног под углом α=45 у односу на подлогу, са почетном брзином v0=10ms.

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

Почетну брзину лако можемо разложити на њену хоризонталну и вертикалну компоненту. Она је задата вектором чији је интензитет v0, и чији је угао у односу на подлогу једнак α. Имајући у виду да је α=45 јасно је да су хоризонтална и вертикална компонента странице квадрата ком је вектор почетне брзине дијагонала. Стога је интензитет тих вектора једнак интензитету почетног вектора v0 подељеном са 2. Ипак општије решење добијамо применом тригонометрије. Лако се уочава да три вектора брзине чине правоугли троугао, да је вертикална компонента катета која се налази наспрам угла α, да је хоризонтална компонента катета која је налегла на угао α, а да је почетна брзина хипотенуза. Пошто је синус угла α однос између наспрамне катете и хипотенузе, интензитет вертикалне компоненте можемо израчунати као v0y=v0sinα. Слично, пошто је косинус угла α однос између налегле катете и хипотенузе, интензитет хоризонталне компоненте можемо израчунати као v0x=v0cosα. Наравно, меру угла α морамо претворити у радијане (множењем са π и дељењем са 180 или, још једноставније, библиотечком функцијом math.radians).

Када знамо почетне брзине по свакој компоненти, положај у оба правца (тј. координате центра лоптице) можемо једноставно израчунати. Пошто је кретање дуж хоризонтале равномерно, важи да је x=v0xt. Пошто је кретање дуж вертикале равномерно успорено, са гравитационим успорењем g, важи да је y=v0ytgt22.

Цео рачун у програму може бити изражен у стандардним мерним јединицама (брзине v0, v0x и v0y можемо изразити у метрима у секунди, убрзање g је стандардно изражено у метрима у секунди за секунду, док се координате x и y могу изразити у метрима). Генерално је веома добар обичај да се у свим физичким симулацијама управо тако ради. Међутим, тада нам остаје проблем прерачунавања координата из стварног света у екранске координате. Желимо да лоптица започне своје кретање од левог краја екрана и да га заврши на десном крају. Да бисмо могли да тако подесимо прерачунавање координата, потребно је да одредимо максимални домет лоптице, тј. даљину на којој ће поново пасти на земљу. То се веома једноставно може одредити из услова да је y=0 тј. 0=v0ytgt22. Једно решење је t=0, јер се у почетку лоптица налази на земљи. Друго решење се, након дељења једанчине са t (под условом да t није једнако нули) добија из услова v0y=gt2. Одатле израчунавамо да је време до пада једнако 2v0yg, па је домет једнак xmax=2v0xv0yg. Ово је већ довољно да можемо израчунати тражени домет, мада се ова формула може даље свести на xmax=v20(2sinαcosα)g, тј., применом формуле за синус двоструког угла на xmax=v20sin2αg. Интересантно, одавде се лако види да се максимални домет достиже за угао α=45 (јер је синус угла увек мањи или једнак 1, а за угао од 45 степени добија се управо вредност 1).

 
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, "Коси хитац")
7
8
g     = 9.81     # gravitaciona konstanta - 9.81 metara u sekundi po sekundi
9
t     = 0        # đule se ispucava u trenutku t = 0 sekundi
10
v0    = 10       # pocetna brzina je 10 m/s
11
alpha = 45       # ugao je 45 stepeni
12
(x, y) = (0, 0)  # početni položaj je u koordinatnom početku
13
14
v0x  = v0 * math.cos(math.radians(alpha)) # horizontalna brzina
15
v0y  = v0 * math.sin(math.radians(alpha)) # vertikalna brzina
16
xmax = v0x * (2 * v0y / g)                # maksimalni domet
17
18
dt = 0.01  # vremenski interval između dva susedna frejma
19
20
def crtaj():
21
    prozor.fill(pg.Color("white"))  # bojimo pozadinu u belo
22
    r = 20                          # poluprecnik đuleta
23
    # preračunavamo iz koordinata sveta u ekranske koordinate
24
    # za x=0 želimo da je xe=r, a za x=xmax želimo da je xe=sirina-r
25
    # skaliranje po obe ose treba da bude jednako
26
    k = (sirina - 2 * r) / xmax
27
    xe = round(k * x + r)
28
    ye = round(visina - r - k * y)
29
    pg.draw.circle(prozor, pg.Color("blue"), (xe, ye), r)  # crtamo đule
30
31
def novi_frejm():
32
    global t, x, y  # menjaćemo ove globalne promenljive
33
    t += dt         # uvećavamo vreme
34
    if x < xmax:    # ako đule još nije palo
35
        (x, y) = (v0x * t, v0y * t - g*t**2 / 2) # novi polozaj đuleta
36
        if y < 0: # ako je đule propalo u zemlju
37
            (x, y) = (xmax, 0)  # vraćamo ga na površinu
38
39
pygamebg.frame_loop(round(1/dt), novi_frejm)
40

(kosi_hitac)

Слободно бацање

Напиши програм који анимира слободно бацање. Можеш употребити слику лопте (lopta.png), коша (kos.png) и мрежице (mrezica.png).

../_images/lopta.png ../_images/kos.png ../_images/mrezica.png ../_images/pygame_logo.png ../_images/petlja_logo.png

Слободно бацање представља коси хитац. Претпоставићемо да се изводи са растојања d од коша и са висине h, а да се кош налази на висини H. Координатни систем ћемо поставити тако да му је координатни почетак на месту на ком стоји играч који изводи бацање (тада се бацање изводи из тачке (0,h) и треба да се погоди кош који је у тачки (d, H). Пре цртања ћемо вршити трансформацију координата из овог координатног система у координатни систем прозора. Приликом анимације косог хица мењаћемо обе координате све док y координата не достигне вредност d (лопта не дође до коша), након чега ћемо наставити да смањујемо x координату, а да y координату не мењамо (лопта наставља да пада вертикално наниже). Да би се постигао ефекат проласка лоптице кроз кош лоптица треба да буде испред табле, а иза мрежице. Стога смо из слике коша издвојили мрежицу и цртаћемо прво таблу, затим лопту и на крају мрежицу. Када лопта дође до дна екрана (када јој y координата постане 0), на средини екрана ћемо приказати два логотипа.

Угао испуцавања лопте је 52 степена, а ти покушај да погодиш почетну брзину тако да лопта „без коске” прође кроз кош.

75
 
1
import math
2
import pygame as pg
3
import pygamebg
4
5
(sirina, visina) = (800, 480) # otvaramo prozor
6
prozor = pygamebg.open_window(sirina, visina, "PyGame")
7
8
kos = pg.image.load('kos.png')
9
lopta = pg.image.load('lopta.png')
10
mrezica = pg.image.load('mrezica.png')
11
petlja = pg.image.load('petlja_logo.png')
12
pygame = pg.image.load('pygame_logo.png')
13
14
g     = 9.81     # gravitaciona konstanta - 9.81 metara u sekundi po sekundi
15
t     = 0        # đule se ispucava u trenutku t = 0 sekundi
16
v0    = 9.2      # pocetna brzina u metrima po sekundi
17
alpha = 52       # ugao ispucavanja u stepenima
18
H = 3            # visina kosa u metrima
19
h = 1.95         # visina igraca u metrima
20
d = 7.2          # udaljenost linije slobodnih bacanja u metrima
21
22
(x, y) = (x0, y0) = (0, h)  # početni položaj je na mestu ispucavanja
23
v0x  = v0 * math.cos(math.radians(alpha)) # horizontalna brzina
24
v0y  = v0 * math.sin(math.radians(alpha)) # vertikalna brzina
25
dt = 0.01  # vremenski interval između dva susedna frejma
26
27
def crtaj():
28
    prozor.fill(pg.Color("white"))  # bojimo pozadinu u belo
29
30
    ppm = 90 # broj piksela po metru
31
32
    # ekranske koordinate centra kosa
33
    kos_xe = ppm * d
34
    kos_ye = visina - ppm * H
35
36
    # koordinate gornje leve ivice slike kosa
37
    kos_x0 = kos_xe - (1/3) * kos.get_width()
38
    kos_y0 = kos_ye - (2/3) * kos.get_height()
39
40
    # crtamo kos
41
    prozor.blit(kos, (kos_x0, kos_y0))
42
43
    # ekranske koordinate centra lopte
44
    lopta_xe = ppm * x
45
    lopta_ye = visina - ppm * y
46
47
    # koordinate gornje leve ivice centra lopte
48
    lopta_x0 = lopta_xe - lopta.get_width() / 2
49
    lopta_y0 = lopta_ye - lopta.get_height() / 2
50
51
    # crtamo loptu
52
    prozor.blit(lopta, (lopta_x0, lopta_y0))
53
54
    # crtamo mrezicu
55
    prozor.blit(mrezica, (kos_x0, kos_y0))
56
57
    # ako je lopta pala na zemlju
58
    if y < 0:
59
        # prikazujemo logo petlje i logo pygame
60
        prozor.blit(petlja, (sirina / 2 - petlja.get_width() / 2,
61
                             visina / 2 - petlja.get_height()))
62
        prozor.blit(pygame, (sirina / 2 - pygame.get_width() / 2,
63
                             visina / 2))
64
65
def novi_frejm():
66
    global t, x, y  # menjaćemo ove globalne promenljive
67
    t += dt         # uvećavamo vreme
68
    if x < x0 + d:    # ako lopta nije udarila u tablu
69
        x = x0 + v0x * t  # pomeramo je nadesno
70
    y = y0 + v0y * t - g*t**2 / 2  # pomeramo je nadole
71
    crtaj()
72
73
# pokrećemo animaciju
74
pygamebg.frame_loop(round(1/dt), novi_frejm)
75

(slobodno_bacanje)

Кошаркашка лопта која губи енергију

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

Када се лоптица пусти са почетне висине h0 она пада под утицајем гравитације. Слободан пад представља равномерно убрзано кретање тако да је пређени пут у слободном паду после времена t једнак gt22, где је g гравитационо убрзање. Висина на којој ће се лоптица налазити након времена t биће једнака h=h0gt22.

Када лоптица удари у земљу (када је h=0), тада се кретање мења. Можемо претпоставити да се у том тренутку лоптица испаљује навише са почетног положаја h0=0, при чему је почетна брзина негативна и једнака је 75 процената позитивне брзине коју је лоптица имала у тренутку удара о подлогу (заиста, у тренутку удара брзина је усмерена вертикално наниже, док је након одбијања брзина усмерена вертикално навише, па им је знак супротан). Приликом првог удара о подлогу, брзина ће бити једнака gt, где је t време које је било потребно да лоптица удари у земљу. Када се лоптица одбије навише, њено кретање је комбинација два кретања. Једно је равномерно и усмерено је навише и одређено је почетном брзином у тренутку одбијања, а друго је слободни пад наниже, под утицајем гравитације. Ако је почетна брзина негативна, тада се пређени пут одбијене лоптице може описати формулом v0t+gt22, па се након времена t она налази на висини h=(v0t+gt22).

Приметимо да се почетно испуштање лоптице и свако одбијање лоптице заправо могу описати истим формулама. Наиме, у почетку можемо сматрати да се лоптица налази на задатој висини h0, и да јој је почетна брзина v0=0, а у наредним одбијањима можемо претпоставити да је почетна висина h0=0, а да је почетна брзина једнака оној преосталој после одбијања тј. да је једнака v0=kv, где је k коефицијент задржавања енергије (k=0.75 у нашем случају), а v је тренутна брзина у тренутку одбијања и једнака је v=v0+gt, где је v0 почетна брзина претходног кретања, g гравитациона константа, а t време протекло од почетка претходног кретања до тренутка удара о подлогу (оно се може експлицитно израчунати, али за тим нећемо имати потребе јер ћемо током симулације време одржавати у променљивој t, тако да ћемо ту вредност већ имати на располагању у тренутку када приметимо да је h0). Када знамо почетну брзину и висину сваког новог кретања, знамо да ће висина на којој ће се лоптица налазити након времена t бити једнака h=h0(vt+gt22).

Симулацију организујемо тако што на почетку постављамо вредност h0=2 (јер је у првом кретању лопта на висини од два метра), v0=0 (јер лопта нема почетну брзину) и t = 0. Након тога, у телу петље време t увећавамо за по једну стотинку (уједно помоћу pg.time.wait(10) чекамо једну стотинку), израчунавамо висину h на којој се лоптица налази, исцртавамо лоптицу и проверавамо да ли је лоптица додирнута подлогу (да ли је h0). Када лоптица додирне подлогу, започињемо ново кретање тако што постављамо h=h0=0, v0=k(v0t+gt) и тако што враћамо t=0 (јер започиње ново кретање и време меримо из почетка).

Приметимо да је цео рачун у програму био изражен у стандардним мерним јединицама (висине h0 и h су изражене у метрима, време t у секундама, а брзине v0 и v у метрима у секунди за секунду). Генерално је веома добар обичај да се у свим физичким симулацијама управо тако ради. Међутим, тада нам остаје проблем прерачунавања координата из стварног света у екранске координате. Наиме, висина од 2 метра не може бити изражена као 2 пиксела, већ је потребно видети како се она преводи у неки број пиксела који је у вези са висином прозора. Лопту на висини од 2 метра желимо да представимо тако да се налази на самом врху екрана тј. тако да јој горња ивица додирује горњу ивицу прозора. Дакле за h=2 желимо да важи да је y=r. Лопту на висини од 0 метара желимо да представимо тако да јој доња ивица додирује доњу ивицу екрана. Дакле, за h=0 желимо да важи да је y=visinar. Потребно је пронаћи линеарну функцију која пресликава h у y која задовољава ова два услова. Једноставно (на пример, постављањем облика y=ah+b, уврштавањем ова два услова и решавању добијеног система по непознатим коефицијентима a и b) добијамо да је y=2rvisina2h+visinar.

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

38
 
1
import pygame as pg
2
import pygamebg
3
4
(sirina, visina) = (400, 400) # otvaramo prozor
5
prozor = pygamebg.open_window(sirina, visina, "Кошаркашка лопта")
6
7
g  = 9.81  # gravitaciona konstanta - 9.81 metara u sekundi po sekundi
8
k  = 0.75  # koeficijent elastičnosti
9
h0 = 2     # početna visina sa koje se baca lopta - 2 metra
10
v0 = 0     # nema početne brzine
11
h  = h0    # tekuća visina (položaj lopte)
12
t = 0      # lopta se baca u trenutku t = 0 sekundi
13
dt = 0.01  # promena vremena nakon kog se lopta pomera i ponovo crta
14
15
def crtaj():
16
    # boje koje cemo koristiti
17
    BELA = (255, 255, 255)
18
    NARANDZASTA = (255, 120, 0)
19
20
    prozor.fill(BELA)   # bela pozadina
21
    r = 40              # poluprečnik lopte
22
    # lopta se nalazi horizontalno na sredini prozora, a
23
    # visina se odredjuje tako da za h=2 vazi y=r, a za h=0 vazi y=visina-r
24
    (x, y) = (sirina / 2, (2 * r - visina) / 2 * h + visina - r)
25
    pg.draw.circle(prozor, NARANDZASTA, (round(x), round(y)), r)  # crtamo loptu
26
27
def novi_frejm():
28
    global t, h, h0, v0
29
    t += dt                     # ažuriramo proteklo vreme
30
    h = h0 - (v0*t + g*t*t/2)   # izracunavamo novu visinu lopte
31
    if h <= 0:                  # ako je lopta dodirnula zemlju
32
        v0 = -k*(v0 + g*t)      # izračunavamo novi vektor brzine
33
        if v0 > -0.2: v0 = 0    #    ako je brzina premala, zaustavljamo odbijanje
34
        h0 = h = 0              #    započinjemo novi hitac
35
        t = 0                   #    vreme kreće iz početka
36
37
pygamebg.frame_loop(round(1/dt), novi_frejm)
38

(kosarkaska_lopta)

Клатно

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

Математичко клатно је објекат занемариво мале масе окачен о канап које се клати под дејством гравитационе силе. Клатно се креће дуж кружног лука. Вектор брзине кретања клатна је увек усмерен дуж тангенте на тај кружни лук. Претпоставимо да у неком тренутку клатно заклапа угао θ са вертикалном осом. Клатно једноставно можемо нацртати на основу дужине конца l и угла θ. Наиме, на основу ових величина лако можемо елементарном тригонометријом израчунати координате клатна, ако знамо координате тачке за коју је оно окачено. Ако су те координате (cx,cy), тада се координате могу израчунати са x=cx+lsinθ, y=cy+lcosθ (јер екранска координата y расте навише).

На клатно делује гравитациона сила, вертикално у смеру подлоге, чији је интензитет mg, где је m маса клатна, а g гравитационо убрзање. Та сила се може разложити на компоненту која делује у правцу конопца (под углом θ у односу на вертикалу) и на компоненту која делује дуж нормале на тај правац. Прва компонента гравитационе силе се поништава силом затезања конопца тако да се клатно не креће горе доле дуж правца конопца. За клаћење је релевантна друга компонента силе која покреће клатно лево-десно и делује дуж брзине његовог кретања (тангенцијално у односу на кружни лук дуж ког се клатно креће). Интензитет те компоненте гравитационе силе је mgsinθ. На основу другог Њутновог закона важи да је укупна сила која делује на неки објекат једнака производу његове масе и убрзања, одакле следи да је убрзање клатна a=gsinθ. Знак минус је потребан због тога што је убрзање увек усмерено супротно од угла θ (заиста, ако је клатно на левој страни, јасно је да га убрзање вуче постепено на десно и обратно).

../_images/klatno.png

Претпоставимо да је θ дат у радијанима. Промени угла од dθ радијана одговара пређени пут клатна у дужини од ds=ldθ. Угаона брзина клатна vθ мери промену угла у јединици времена. На основу претходног, важи да је vθ=lv. Слично, угаоно убрзање клатна aθ мери промену угаоне брзине у јединици времена и на основу претходног важи да је aθ=la. Одатле следи да је laθ=gsinθ. Ово је једначина која прецизно описује кретање нашег клатна и на основу ње се може извршити прецизна симулација кретања тог клатна. Пошто се у једначини истовремено јављају и нека непозната функција (у нашем случају функција која описује угао θ у зависности од времена) и брзине њене промене, тзв. изводи (у нашем случају то је функција која описује угаоно убрзање aθ у зависности од времена), у питању је диференцијална једначина (мада представљају основу физике, о њима ћеш, нажалост, учити тек нешто мало у вишим разредима гимназије).

У сваком тренутку знамо тренутни угао које клатно заузима и знамо тренутну угаону брзину (у почетку можемо претпоставити да је клатно испуштено са неког угла θ0, без почетне угаоне брзине). На основу угла, можемо израчунати угаоно убрзање као aθ=glsinθ. На основу тог убрзања можемо одредити нову угаону брзину. Наиме, ако је време dt у ком се мери промена мало, можемо претпоставити да ће веза бити линеарна, тј. да ће се угаона брзина променити за aθdt. Слично, када знамо угаону брзину, ако је је време dt мало, можемо претпоставити да ће веза између промене угла и угаоне брзине такође бити линеарна, па добијамо да се угао мења за vθdt. На основу тога израчунавамо нови положај клатна (једнозначно одређен углом), цртамо клатно и даље симулацију настављамо по потпуно истом принципу. Овакав начин одређивања решења се обично приписује чувеном математичару Ојлерову и назива се Ојлерова метода.

Иако је претходни приступ сасвим довољан да се направи симулација кретања клатна (што је dt мање, то је симулација прецизнија, а постоје и нумеричке методе, попут фамилије метода Рунге-Кута, да се кретање још прецизније процени), физичари су трагали за формулама којима би се кретање клатна експлицитно описало. Нажалост, диференцијална једначина клатна се не може решити тако да се пронађе елементарна веза између угла и времена. Ипак, може се употребити мали трик који упрошћава једначину и омогућава њено експлицитно решавање. Наиме, ако је угао θ мали (по апсолутној вредности не већи од 15 степени), важи да је sinθ приближно једнако θ. Заменом прве величине другом добијамо да је aθ=glθ. Овим се добија једначина која се се прилично једноставно може решити и добија се решење θ=θ0cosglt. Заиста, за t=0 важи да је θ=θ0, тј. клатно се налази у почетном положају. Угаона брзина се тада израчунава као vθ=θ0glsinglt. Угаоно убрзање се тада израчунава као aθ=θ0glglcosglt, тј. као aθ=glθ0cosglt=glθ, тако да је упрошћена једначина задовољена.

Упрошћену једначину можемо решавати и нумерички (симулацијом, на потпуно исти начин на који смо решавали и праву једначину), а можемо и просто само исцртавати њено решење. Тако у програму добијамо три клатна - једно, црно, које стварно одговара кретању клатна у природи и два, црвено и зелено, која то раде само приближно. Покретањем симулације може се јасно видети разлика између правог кретања клатна и његове апроксимације. Видимо и да постоји мала разлика између експлицитног решења упрошћене једначине (зеленог) и оног добијеног нумеричком симулацијом (црвеног), међутим, да су та два решења доста блиска, тј. да грешка симулације није велика, иако је коришћена најједноставнија могућа Ојлерова метода.

90
 
1
import math
2
import pygame as pg
3
import pygamebg
4
5
(sirina, visina) = (400, 400) # otvaramo prozor
6
prozor = pygamebg.open_window(sirina, visina, "Клатно")
7
8
# mesto gde je klatno zakaceno
9
(cx, cy) = (sirina / 2, 0)
10
# gravitaciona konstanta u (m/s^2)
11
g = 9.81
12
# duzina klatna (u m)
13
l = 0.2
14
# pocetno vreme (u s)
15
t = 0
16
# promena vremena (u s)
17
dt = 0.01
18
19
# početni ugao otklona klatna (ujedno i maksimalni)
20
theta_max = math.radians(15)
21
# trenutni ugao kada se izračunava po stvarnim formulama
22
klatno_theta = theta_max
23
# trenutni ugao kada se izračunava po uproscenim formulama
24
klatno_uprosceno_theta = theta_max
25
# trenutni ugao kada se izračunava po eksplicitnim formulama
26
klatno_eksplicitno_theta = theta_max
27
28
# pocetna brzina
29
v0 = 0
30
# trenutna brzina kada se izračunava po stvarnim formulama
31
klatno_v_theta = v0
32
# trenutna brzina kada se izračunava po uproscenim formulama
33
klatno_uprosceno_v_theta = v0
34
35
# crtanje klatna u datoj boji, na datom uglu
36
def nacrtaj_klatno(theta, boja):
37
    # broj piksela po metru (faktor zumiranja)
38
    ppm = 1000
39
    # poluprečnik loptica u pikselima
40
    r = 15
41
    # polozaj tačke izračunavamo na osnovu ugla
42
    x = cx + ppm*l*math.sin(theta)
43
    y = cy + ppm*l*math.cos(theta)
44
    # crtamo crno klatno
45
    pg.draw.line(prozor, boja, (cx, cy), (x, y), 1)
46
    pg.draw.circle(prozor, boja, (round(x), round(y)), r)
47
48
def crtaj():
49
    # bojimo pozadinu prozora u belo
50
    prozor.fill(pg.Color("white"))
51
52
    nacrtaj_klatno(klatno_theta, pg.Color("black"))
53
    nacrtaj_klatno(klatno_uprosceno_theta, pg.Color("red"))
54
    nacrtaj_klatno(klatno_eksplicitno_theta, pg.Color("green"))
55
56
def novi_frejm():
57
    global t
58
    global klatno_a_theta, klatno_v_theta, klatno_theta
59
    global klatno_uprosceno_a_theta, klatno_uprosceno_v_theta, klatno_uprosceno_theta
60
    global klatno_eksplicitno_theta
61
62
    # vreme se menja na osnovu datog priraštaja
63
    t += dt
64
65
    # klatno izračunato na osnovu stvarnih formula
66
67
    # ugaono ubrzanje - stvarna formula
68
    klatno_a_theta = -(g/l) * math.sin(klatno_theta)
69
    # ugaona brzina se menja na osnovu ugaonog ubrzanja
70
    klatno_v_theta += klatno_a_theta * dt
71
    # ugao se menja na osnovu ugaone brzine
72
    klatno_theta += klatno_v_theta * dt
73
74
    # klatno izračunato na osnovu uprošćenih formula
75
76
    # ugaono ubrzanje - uprošćena formula (sin(theta) je približno theta)
77
    klatno_uprosceno_a_theta = -(g/l) * klatno_uprosceno_theta
78
    # ugaona brzina se menja na osnovu ugaonog ubrzanja
79
    klatno_uprosceno_v_theta += klatno_uprosceno_a_theta * dt
80
    # ugao se menja na osnovu ugaone brzine
81
    klatno_uprosceno_theta += klatno_uprosceno_v_theta * dt
82
83
    # klatno na osnovu eksplicitne jednace kretanja koja se dobija
84
    # uprošćavanjem formula
85
86
    # ugao izračunat na osnovu eksplicitne formule
87
    klatno_eksplicitno_theta = theta_max * math.cos(math.sqrt(g/l)*t)
88
89
pygamebg.frame_loop(round(1/dt), novi_frejm)
90

(klatno)