Krivulje


Uvod

Krivulje prikazujejo preme črte med točkami. Če so točke dovolj blizu, imamo občutek gladke krivulje. Poleg prikazovanja krivulj lahko uporabljamo objekt "curve" še v druge namene, na primer za risanje funkcij.

Nekateri atributi, kot na primer pos (položaj) ali color (barva) se od točke do točke na krivulji lahkom razlikujejo. Te atribute hranimo v številčnih poljih (Numeric arrays). Učinkovito delo z njimi omogoča Pythonov modul "Numeric". Tako lahko cela polja sočasno seštevamo. števila v takih poljih lahko dostopamo z naslavljanjem n-tega elementa v zaporedju (na primer seq[0] je prvi element polja seq, seq[1] je drugi, seq[2] je tretji itd.). Tako je , primerKrivulje.pos[0] položaj prve točke v krivulji "primerKrivulje".

Krivuljo lahko podamo z eksplicitnim zaporedjem koordinat, vpisanih med oklepaji, tako kot pri vseh Pythonovih seznamih. Tu je primer kvadrata:

kvadrat = curve(pos=[vector(0,0,0),vector(0,1,0),vector(1,1,0),vector(1,0,0),vector(0,0,0)])

Krivulje imajo lahko debelino (thickness), ki jo določa polmer preseka krivulje (debelina je dvakrat večja od polmera):

curve(pos=[vector(0,0,0), vector(1,0,0), vector(2,1,0), vector(2,2,0), vector(2,3,0)], radius=0.05)

Privzeti radius je 0, kar pomeni risanje tenke krivulje. Polmer, različen od nič, pa pomeni "debelo" krivuljo. 



Atributi krivulj

pos[] Polje pozicij točk na krivulji: pos[0], pos[1], pos[2]....
The current number of points is given by len(curve.pos)

x[ ], y[ ], z[ ] Komponente pos; privzeto [0,0,0,0,...]

color[ ] Barva točk na krivulji

red[ ], green[ ], blue[ ] Barvne komponente točk na krivulji

radius Polmer preseka krivulje. Privzeti radius=0 pomeni tenko krivuljo
 

Dodajanje točk krivulji

Krivulje lahko tvorimo inkrementalno s pomočjo funkcije append(). Nova točka privzeto uporablja lastnosti predhodne točke.

helix = curve( color = color.cyan )
for t in arange(0, 2*pi, 0.1):
    helix.append( pos= vector(t,sin(t),cos(t)) )

Ena od mnogih uporab krivulj je puščanje sledi za premikajočimi se telesi. Primer, kako dodamo sled za premikajočo se kroglo:

GlowScript 3.0 VPython
krogla=sphere(pos=vector(-10,0,10), radius=0.5)
sled=curve() #sled bo prikazovala gibanje krogle
krogla.hitrost=vector(5,0,0) #hitrost je tudi vektor. Zacetna hitrost je v smeri +x

dt=.01

while krogla.pos.x<10:
rate(1/dt)
krogla.pos+=krogla.hitrost*dt #osvezi polozaj krogle z upostevanjem hitrosti
sled.append(pos=krogla.pos) #risi sled za kroglo


Interpolacija

Interpolacija poteka med posameznimi točkami. Vzemimo primer, da imamo tri rdeče točke, tem pa sledi četrta, modra. Črte, ki povezujejo prve tri točke, bodo rdeče, barva črte med tretjo in četrto točko pa bo prehajala od rdeče k modri.

c = curve( pos=[(0,0,0), (1,0,0)], color=color.red )
c.append( pos=vector(1,1,0) ) # dodaj rdeco tocko
c.append( pos=vector(0,1,0), color=color.blue) # dodaj modro tocko

Če hočeš prekiniti spremembo v barvi ali debelini, preprosto dodaj še eno točko na isto lokacijo. V naslednjem primeru dodamo modro točko na isto lokacijo, kjer je že tretja, zato bo zadnji segment povsem moder

c = curve( pos=[(0,0,0), (1,0,0)], color=color.red )
c.append( pos=(1,1,0) ) # dodaj rdeco tocko
c.append( pos=(1,1,0), color=color.blue) # ista lokacija, modra t.
c.append( pos=(0,1,0) ) # dodaj modro tocko