Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 6th, 2012  |  syntax: PHP  |  size: 5.12 KB  |  hits: 19  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
This paste has a previous version, view the difference. Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. %---------------GLAVNI PROGRAM------------------
  2. zacetneTocke=[1 1.5 2 3 4 5 4; 1 1.5 2 2.5 3 2 0.5] %Zgornja vrstica so x koordinate spodnja pa y
  3. %Narisemo zacetne tocke
  4. %plot(zacetneTocke(1,:),zacetneTocke(2,:),['o','b'])
  5. hold on
  6. %Osi grafa dolocimo tako, da bo na grafu  vidna celotna funkcija
  7. axis([min(zacetneTocke(1,:))-3 max(zacetneTocke(1,:))+3 min(zacetneTocke(2,:))-3 max(zacetneTocke(2,:))+3])
  8.  
  9. kT=[1 0 2 3; 1 4 4 0]
  10. X=bezier(kT,200,0)
  11. %aD=avgDistance(zacetneTocke,X)
  12. %hold off
  13. %l=bezierGetControlPoints([1 2 5 4; 1 4 5 1],[0.001 1-0.001],1)
  14. %hold on
  15. %X=bezier(l,200,1)
  16. %hold on
  17. [pl,gh]=nextControlPoint(kT,4,Inf);
  18. %plot(gh(1,:),gh(2,:),['-o','r'])
  19. newKont=[gh,[4,6; -1 0.5]]
  20. X=bezier(newKont,200,0)
  21.  
  22. %---------------------------------
  23. %Funkcija izracuna povprecno razdaljo med danimi tockami in bezierjevo krivuljo
  24. %Sprejme 2 argumenta:
  25. %tocke = zacetne tocke, okoli katerih moramo zgraditi bezierjevo krivuljo
  26. %X = tocke, ki predstavljajo bezierjevo krivuljo
  27. %Obe matriki sta sestavljeni iz 2 vrstic, zgornja so vse x koordinate, spodnja vse y (X=[x;y])
  28. function avgDist = avgDistance(tocke,X)
  29.         stTock=length(tocke(1,:));      %Stevilo danih tock
  30.         avgDist=0;
  31.         for k=1:stTock
  32.                 tocka=tocke(:,k)';
  33. %----------------!!!PREVERI CE JE PRAVILNO, mislim da nekaj ne stima!!!-------------
  34.                 [dist,i]=min(sqrt((X(1,:)-tocka(1)).^2 + (X(2,:)-tocka(2)).^2));        %Racunanje minimalne razdalje (evklidove)
  35.                 avgDist+=dist/stTock;   %Utezena vsota
  36.         end
  37.  
  38.         %plot([tocka(1),X(1,i)],[tocka(2),X(2,i)],['-o','r']); %
  39. endfunction
  40.  
  41. %Funkcija izracuna Bezierjevo krivuljo, ne nujno da 3. reda in jo vrne v obliki N tock
  42. %Podamo ji 4 parametre:
  43. %kTocke = kontrolne tocke: 1. vrstica x koordinate, 2. y koordinate
  44. %N = "resolucija", s koliko tockami bomo predstavili krivuljo
  45. %poligon = Ce je enak 1, potem narisemo poligon, drugace samo krivuljo
  46. function X = bezier(kTocke,N,poligon)
  47.         if(poligon==1)
  48.                 plot(kTocke(1,:), kTocke(2,:), ['-o','g']); %Narisemo poligon
  49.                 hold on;
  50.         end
  51.         n=length(kTocke(1,:));    %Izracunamo stevilo kontrolnih tock
  52.         a=linspace(0,1,N);       %Izracunamo x koordinate tock na krivulji  
  53.         I=(0:(n-1))'*ones(1,N);    %toliko kot je tock tolikokrat indeks i postavimo od 0-stopnje,
  54.                                                                 %ponavadi 0-3, da ne bomo potrebovali for zanke
  55.                                                                
  56.         P=ones(n,1)*a;           %Matrika verjetnosti za binomsko porazdelitev
  57.         B=binopdf(I,n-1,P);  %Izracunamo B kar nad matriko, binopdf vrne binomsko porazdelitev
  58.         X=kTocke*B;                       %Točke na krivulji, računane po
  59.         X(:,1)=[kTocke(1,1),kTocke(2,1)]';
  60.         X(:,N)=[kTocke(1,n),kTocke(2,n)]';
  61.  
  62.         plot(X(1,:), X(2,:));   %Narisemo se krivuljo
  63.        
  64. endfunction
  65.  
  66. %Pridobivanje kontrolnih točk s pomočjo "reverse engineeringa" -> imamo 4 točke neke krivulje
  67. %Če podamo funkciji 4 točke na krivulji, nam rekonstruira kontrolne točke, s tem da sta prva in zadnja začetna oz. končna
  68. %Drugi argument so verjetnosti. Če definiramo 4 točke iz neke krivulje, še vedno lahko skozi te 4 točke potegnemo
  69. %neskončno mnogo krivulj, verjetnosti pa nam povej položaj na krivulji, seštevek danih verjetnosti mora biti 1
  70. function controls = bezierGetControlPoints(tocke,verjetnost,izris)
  71.         %imamo tocke t0, t1, t2 in t3 v vektorju tocke
  72.         %POMOC: http://polymathprogrammer.com/2007/06/27/reverse-engineering-bezier-curves/
  73.        
  74.         t0=tocke(:,1); t1=tocke(:,2); t2=tocke(:,3); t3=tocke(:,4);
  75.         k0=t0, k3=t3 %Začnemo in končamo krivuljo v začetni oz. končni točki
  76.         if(izris>0)     %Izrisemo tocke skozi katere mora krivulja
  77.                 plot(tocke(1,:),tocke(2,:),['o','r']);  %Narisemo tocke
  78.         end
  79.         razd=tocke(1,1)+tocke(length(tocke))
  80.         a=[0 1/5 4/5 1]
  81.         u=verjetnost(1); v=verjetnost(2);
  82.         %Kontrolni tocki k0=t0 in k3=t3 imamo ze, rabimo se k1 in k2
  83.         %Uporabimo de Casteljejevo formulo
  84.         %t1=(1-u)^3*k0 + 3*(1-u)^2*u*k1 + 3*(1-u)*u^2*k2 + u^3*k3
  85.         %Ce damo k1 in k2 na eno stran, kar iščemo, dobimo sistem 2 neznank k1 in k2:
  86.         %3*(1-u)^2*u*k1 + 3*(1-u)*u^2*k2 = t1 - (1-u)^3*k0 - u^3*k3
  87.         %3*(1-v)^2*v*k1 + 3*(1-v)*v^2*k2 = t2 - (1-v)^3*k0 - v^3*k3
  88.         %Sistem lahko zapisemo v matricni obliki, leva stran:
  89.         c=t1-(1-u)^3*k0-u^3*k3
  90.         d=t2-(1-v)^3*k0-v^3*k3
  91.         L=[3*(1-u)^2*u, 3*(1-u)*u^2; 3*(1-v)^2*v, 3*(1-v)*v^2]'
  92.         D=[c'; d'];
  93.         per=L\D;
  94.         controls=[t0,per',t3];
  95.  
  96. endfunction
  97.  
  98. %Funkcija izracuna prvi 2 kontrolni tocki naslednje bezierjeve krivulje in jih vrne
  99. %Kot argumente ji podamo prejsnje kontrolne tocke in pa x ali y 2. kontrolne tocke
  100. %Iz prejsnjih kontrolnih tock poiscemo premico, ki gre skozi zadnji dve kontrolni tocki
  101. %iz premice pa glede na podan x ali y izracunamo tocko
  102. %kaj je podano x ali y povemo tako, da je ena vrednost razlicna od Inf (neskoncno)
  103. function [kont,tocki] = nextControlPoint(kontrole,x,y)
  104.         %koeficient premice: Potrebujemo zadnji dve kontrolni tocki z indeksoma 3 oz. 4
  105.         %k=(y2-y1)/(x2-x1)
  106.         kX3=kontrole(1,3); kY3=kontrole(2,3);
  107.         kX4=kontrole(1,4); kY4=kontrole(2,4);
  108.        
  109.         k=(kY4-kY3)/(kX4-kX3);
  110.         %izracunamo se n iz formule za premico y=k*x+n  -> n=y-k*x
  111.         n=kY4-k*kX4;
  112.         n1=kY3-k*kX3;
  113.         if(n==n1)
  114.                 "n-ja sta enaka, vse je kul"
  115.         endif
  116.         if(x!=Inf)
  117.                 y=k*x+n;
  118.         elseif(y!=Inf)
  119.                 x=(y-n)/k;
  120.         else
  121.                 "NAPAKA"
  122.         endif
  123.         tocki=[kX4,x;kY4,y];
  124.         kont=[kX3,kX4;kY3,kY4];
  125. endfunction