notes

/Home ....
....

piektdiena, 2014. gada 12. decembris

Kā uzzīmēt splainu čaiņikiem

Uzdevums:Jāuzraksta programma, kas zīmē splainu.
Tas būtu lokana līnija caur dotiem punktiem plaknē. Punktus liekam secīgi. Protams, teorijā pastāv dažādi splainu tipi, bet mēs zīmēsim vienkāršu un puslīdz vizuāli pieņemamu. Nelietosim kubiskos vai Bezier. Mūsu splains būs tipa B-spline (bāzes). Nepretendējam uz izcilāko.

Sadalam uzdevumu divās daļās

1.daļa Izveidojam kurvi.
Daram tā: caur katru punktu, sākot no otrā, velkam zaļu nogrieznīti-pieskari paraleli taisnei, kas ietu caur blakus esošiem punktiem (pirms un pēc). Sanāks labs liekums punktā. Garumu nogrieznim samazinam, tik garu nevajag. Var mainīt arī leņķi, ja tā labāk izskatās.
Savienojam nogriežņus (oranžā līnija).
Tagad par kurvi nodefinējam visus sazīmētos nogriežņus (zilos), sadalot 4 daļās starp punktiem. Pirmo un pēdējo var atstāt 2 daļās, lai tik pāra skaits.


2.daļa Zīmējam liekto līniju.
Ik pa 2 kurvja nogriežņiem zīmējam līniju. Skatīt zīm.1 lejā. Nogriežņi palīdz matemātiski rēķinot punktu koordinātas.
Ja nepieciešams kas sarežģītāks, kā funkcijas interpolācija, skatīt teoriju
Zemāk piedāvāta matemātiska metode.

zīm1.
zīm2.


Lagranža metode

Ir vienkāršs veids kā uzzīmēt līniju caur punktiem - ļoti matemātisks. Vajag zināt funkciju katrā intervālā starp blakus esošiem punktiem, un šai funkcijas līknei "jāturpinās". Zinātne apraksta kā šīs funkcijas izrēķināt. Metodes ir daudz ar visādu koeficientu aprēķināšanu, var sanākt milzu skaitļi un vienādojumi. Atšķiras arī zīmējumi.
Bet Lagranža metode ir ļoti vienkārša un īsa. Sekojošā programma darbojas kā melnā kaste, padod tik punktus un beisiks uzzīmēs.


const Xmax = 640
const Ymax = 480

' Definējam 10 punktus plaknē, vilksim cauri splainu
N=10
' punktu (x,y)
dim Px(N), Py(N)
for i=1 to N
  ' vienmērīgi izlīdzinām punktus plaknē
  Px(i)=Xmax/N * i
  ' piemeklējam kaut kādu Y katram
  Py(i)=Ymax/2 + (1-(rnd*2)) * sin(i*5)* Ymax/4
  ' uzzīmējam punktu 
  Circle Px(i),Py(i),2
next i

'---------
' Tagad vilksim splainu caur mūsu punktiem
' ar Lagranža metodi
'---------
' Ņemsim visus x plaknē starp visiem punktiem
' un interpolēsim punktu Y 
'
for X=Px(1) to Px(N) step 0.02

  Y=0
  for k=1 to N
   F=1
   for j=1 to N
     if j<>k then F *= (x-Px(j))/(Px(k)-Px(j))
   next j
   Y += F*Py(k)
  next k

  ' zīmējam punktu
  Pset X,Y,2
  
next X




Autobraucēja metode

Šī ir manis piedavātā metode, gluži kā auto brauc pa trasi. Sasniedzot punktus, sabremzējas un izņem līkumus, piedod gāzi un dodas uz nākamo kontrolpunktu. Tomēr tas nav oficiāls splains, kaut arī līdzīgs.



Nav komentāru:

Ierakstīt komentāru