Visual Python


Animacija

Animacija krogle

Pri risankah dosežemo animacijo tako, da vrsto sličic dovolj hitro zamenjujemo, da dobimo vtis gibanja. Podobno je v Vpythonu. Vzpostaviti moramo zanko, v kateri spreminjamo nekatere atribute objektov (verjetno njihov položaj) in zanko ponavljamo dovolj hitro (tipično nekaj 10 krat v sekundi).

Funkcija rate() pove programu, kako pogosto mora osveževati prikaz. Na primer  rate(1) bi osveževala prikaz vsako sekundo, rate(1000), pa bi ga osveževala 100 krat na sekundo.

Kot primer si poglejmo spodnji program:

from visual import * #uvoz vizualne knjiznice

planet =sphere(color=color.orange, radius=1) #ni vazno, kako damo krogli ime
planet.hitrost=vector(.01,0,0) #hitrost je usmerjena, je vektor

dt=0.01 #casovni korak (Eulerjeve integracije)

rate(1/dt) #kolikokrat naj bo slika osvezevana (100 krat na sekundo)

#Primer zanke v Pythonu:
while planet.pos.x<10: #ponavljamo, dokler ne dosežemo te oddaljenosti
planet.pos+=planet.hitrost*dt #zamik stavkov v bloku
if planet.pos.x > 9.0:
print "Se malo do konca potovanja"
#zakljuci animacijo
print "Opravljeno"



Koda programa je v datoteki animacija.pyw

Za animacijo planeta smo uporabili hitrost (velocity), ki je časovni odvod položaja. Za majhne časovne korake  Dt, velja

Dx = v Dt
kar pomeni, da moramo osveževati  položajmplaneta po naslednji formuli
x(novi)=x(stari)+Dx = x(stari) + vDt

Zanka in s tem animacija se zaključi, ko položaj planeta v smeri x preseže 10.

Domača naloga: Predelaj program tako, da se bo planet premikal v smeri osi y in to s pospeškom  -10 m /s2.


Krogla med dvema stenama

Steni ponazorimo z dvema zelo tankima kvadroma. Pri trku z njima mora krogla spremeniti smer oziroma hitrost.

from visual import *
krogla = sphere(pos=(-5,0,0), radius=0.5, color=color.red)
desnaStena = box(pos=(6,0,0), size=(0.2,4,4), color=color.green)
levaStena = box(pos=(-6,0,0), size=(0.2,4,4), color=color.green)
dt = 0.05
krogla.hitrost = vector(2,0,0)
while (1==1):      #neskoncna zanka
    rate(100)
    krogla.pos = krogla.pos + krogla.hitrost*dt
    if krogla.x > desnaStena.x:
        krogla.hitrost.x = -krogla.hitrost.x
    if krogla.x < levaStena.x:
        krogla.hitrost.x = -krogla.hitrost.x 

Krogla v škatli


Za konec še bolj zanimiv in poučen primer, ki že kar meji na igrico . Oglej si kodo (bounce2.pyw)