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

Untitled

By: a guest on May 11th, 2012  |  syntax: ASP  |  size: 16.08 KB  |  hits: 32  |  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. function bezierjeviZlepki
  3.         %kont=[1 2 4 6;0 4 6 1]
  4.         %tic;
  5.         %narisiBezierCastel(kont,500000,1,1);
  6.         %toc
  7.         %figure(2)
  8.         %tic;
  9.         %narisiBezierCastel(kont,500000,1,1);
  10.         %toc
  11.         %return
  12.        
  13.         zi=linspace(-5,5,70);
  14.         zacetneTocke=[zi;zi.^3]
  15.  
  16.         %S crno barvo narisemo vse zacetne tocke, katerim se moramo prilagajati
  17.         plot(zacetneTocke(1,:),zacetneTocke(2,:),['.','k'])
  18.         hold on
  19.        
  20.         %Osi grafa dolocimo tako, da bo na grafu  vidna celotna funkcija
  21.         axis([min(zacetneTocke(1,:))-3 max(zacetneTocke(1,:))+3 min(zacetneTocke(2,:))-3 max(zacetneTocke(2,:))+3])
  22.  
  23.        
  24.         d=length(zacetneTocke); %stevilo zacetnih tock
  25.         raz=Inf;        %povprecna razdalja krivulje do tock
  26.         stKrivulj=7;    %najvecje stevilo krivulj, ki jih dopustimo da jih algoritem uporabi
  27.         toleranca=0.15; %maksimalna povprecna razdalja ki jo se dopustimo
  28.         stTockKrivulja=100;     %Stevilo tock ene bezierjeve krivulje
  29.         kontr=startControlPoints(zacetneTocke,[]);      %zacetneTocke
  30.         prejKont=[];    %kontrolne tocke iz prejsnjega koraka
  31.         vseKontr=[];    %vse kontrolne tocke, ki definirajo koncno krivuljo
  32.         prejTocke=[];   %zacetne tocke, ki "pripadajo" dani krivulji
  33.         X=[];   %tocke krivulje
  34.         steviloKrivulj=0;       %koliko krivulj smo uporabili, samo za izpis
  35.         o=1;
  36.         while raz>toleranca
  37.                 b=floor(length(zacetneTocke)/o);        %Razdelimo na o krivulj, o tock
  38.                 vseKontr=[];
  39.                 for g=0:o-1
  40.                         if(g*b+b<=length(zacetneTocke) && g!=o-1)       %Tocke razdelimo na o delov, o krivulj
  41.                                 tocke=zacetneTocke(:,g*b+1:g*b+b);
  42.                         else
  43.                                 tocke=zacetneTocke(:,g*b+1:length(zacetneTocke));
  44.                         end
  45.                         if( g>0 )
  46.                                 kontr=startControlPoints(tocke,prejKont);       %dolocimo zacetne tocke dane krivulje
  47.                                 spr=[0 0 1 0];
  48.                                
  49.                                 [kontr,d]=prilagodiKontrolneTocke(tocke,kontr,spr,0.2); %in jih prilagodimo
  50.                         else
  51.                                 kontr=startControlPoints(tocke,[]);
  52.                                 [kontr,d]=prilagodiKontrolneTocke(tocke,kontr,[0 1 1 0],0.2);
  53.                         end
  54.                         if(length(prejKont)>0)  %ce imamo ze vec kot eno krivuljo, potem lahko vmesne kontrolne tocke prilagajamo(tiste na stičiščih dveh krivulj)
  55.                                 [lK,dK]=prilagodiPovezovalneKontrolneTocke([prejTocke,tocke],prejKont,kontr,0.2);       %dobimo nove prejsnje in nove zdajsnje kontr. tocke
  56.                                 vseKontr=[vseKontr(:,1:length(vseKontr)-4),lK,dK];
  57.                                 X=[X(:,1:length(X)-stTockKrivulja),narisiBezierCastel(lK,stTockKrivulja,0,0),narisiBezierCastel(dK,stTockKrivulja,0,0)];        %tocke krivulje
  58.                         else    %v nasprotnem primeru imamo samo eno krivuljo
  59.                                 vseKontr=[vseKontr,kontr];
  60.                                 X=[X,narisiBezierCastel(kontr,stTockKrivulja,0,0)];     %tocke krivulje
  61.                         end
  62.                         prejTocke=tocke;
  63.                         prejKont=kontr;
  64.                 end
  65.                 dist=povpRazdalja(tocke,X);
  66.                 if(dist<raz)
  67.                         raz=dist
  68.                         kontrolneKrivulje=vseKontr;
  69.                         steviloKrivulj=o;
  70.                 end
  71.                 prejTocke=[];
  72.                 prejKont=[];
  73.                 X=[];
  74.                 if(o>=stKrivulj)
  75.                         break
  76.                 end
  77.                 o++;    %Povecamo stevilo krivulj
  78.         end
  79.         raz
  80.         steviloKrivulj
  81.         for i=1:4:length(kontrolneKrivulje)
  82.                 newKont=kontrolneKrivulje(:,i:i+3);
  83.                 X=narisiBezierCastel(newKont,stTockKrivulja,0,1);
  84.         end
  85.  
  86. endfunction
  87. %------------------FUNKCIJE----------------------------
  88. %Funkcija vrne zacetne kontrolne tocke krivulje, tako da zracuna povprecje danih tock, ce se ni prejsnje krivulje,
  89. %ce pa prejsnja krivulja ze obstaja, pa moramo paziti na zveznosti in odvedljivost
  90. %Podamo ji 2 argumenta:
  91. %tocke=tocke katerim se prilagajamo
  92. %prejKontr=kontrolne tocke prejsnje krivulje, ki je lahko prazen vektor, kar pomeni, da prejsnje krivulje ni
  93. function kontr=startControlPoints(tocke,prejKontr)
  94.         d=length(tocke); pol=d-floor(d/2);
  95.         avg1=[sum(tocke(1,1:floor(d/2)))/floor(d/2) ; sum(tocke(2,1:floor(d/2)))/floor(d/2)];
  96.         avg2=[sum(tocke(1,floor(d/2)+1:d))/pol ; sum(tocke(2,floor(d/2)+1:d))/pol];
  97.         if(length(prejKontr)==4)        %Imamo prejsnje kontrolne tocke, moramo dolociti odvedljiv zlepek
  98.                 %V tem delu funkcija precejkrat napise err, samo zaradi preglednosti, kaj je narobe, te izpise ustvarja funkcija naslednjiKotntrolniTocki
  99.                 %Program kljub tem izpisom deluje pravilno
  100.                 vmes=naslednjiKontrolniTocki(prejKontr,avg1(1,1),Inf);
  101.                 if(length(vmes)==0)    
  102.                         vmes=naslednjiKontrolniTocki(prejKontr,Inf,avg1(2,1));
  103.                         if(length(vmes)==0)    
  104.                                 vmes=naslednjiKontrolniTocki(prejKontr,Inf,Inf);       
  105.                         end
  106.                 end
  107.                 kontr=[vmes,tocke(:,length(tocke)-1),tocke(:,length(tocke))];
  108.         else
  109.                 kontr=[tocke(:,1),avg1,avg2,tocke(:,d)];
  110.         end
  111. endfunction
  112.  
  113. %Funkcija, ki prilagodi kontrolne tocke na sticiscu dveh krivulj, kjer moramo zagotavljati zveznost in odvodljivst krivulje
  114. %Dobi 3 parametre:
  115. %tocke=tocke, katerim se na tem odseku prilagajmo
  116. %leveK=kontrolne tocke leve krivulje
  117. %desneK=kontrolne tocke desne krivulje
  118. %korak=korak s katerim popravljamo kontrolne tocke
  119. function [kL,kD]=prilagodiPovezovalneKontrolneTocke(tocke,leveK,desneK,korak)
  120.         %Prilagajamo dve kontrolni tocki
  121.         %po obeh koordinatah
  122.         raz=Inf;
  123.         kL=leveK;
  124.         kd=desneK;
  125.         for k=1:2
  126.                 razlika=zeros(2,4);
  127.                 razlika(k,3)=korak;
  128.                 while(1==1)             %Vsaki tocki poiskusamo pristeti
  129.                         kontrD=fliplr(desneK)+razlika;
  130.                         kontrL=naslednjiKontrolniTocki(kontrD,leveK(1,3),Inf);  %podamo ji x, da poiscemo novo tocko
  131.                         if(length(kontrL)==0)
  132.                                 kontrL=naslednjiKontrolniTocki(kontrD,Inf,leveK(2,3));  %podamo ji x, da poiscemo novo tocko
  133.                                 if(length(kontrL)==0)
  134.                                         kontrL=naslednjiKontrolniTocki(kontrD,Inf,Inf);
  135.                                 end
  136.                         end
  137.                         kontrL=[leveK(:,1:2),fliplr(kontrL)];
  138.                         bL=narisiBezierCastel(kontrL,100,0,0);
  139.                         bD=narisiBezierCastel(kontrD,100,0,0);
  140.                         X=[bL,bD];
  141.                         k=povpRazdalja(tocke,X);
  142.                         if(k<raz)
  143.                                 raz=k;
  144.                                 kL=kontrL;
  145.                                 kD=kontrD;
  146.                         else
  147.                                 break;
  148.                         end    
  149.                 end
  150.                 while(1==1)     %oziroma odsteti
  151.                         kontrD=fliplr(desneK)-razlika;
  152.                         kontrL=naslednjiKontrolniTocki(kontrD,leveK(1,3),Inf);  %podamo ji x, da poiscemo novo tocko
  153.                         if(length(kontrL)==0)
  154.                                 kontrL=naslednjiKontrolniTocki(kontrD,Inf,leveK(2,3));  %podamo ji x, da poiscemo novo tocko
  155.                                 if(length(kontrL)==0)
  156.                                         kontrL=naslednjiKontrolniTocki(kontrD,Inf,Inf);
  157.                                 end
  158.                         end
  159.                         kontrL=[leveK(:,1:2),fliplr(kontrL)];
  160.                         bL=narisiBezierCastel(kontrL,100,0,0);
  161.                         bD=narisiBezierCastel(kontrD,100,0,0);
  162.                         X=[bL,bD];
  163.                         k=povpRazdalja(tocke,X);
  164.                         if(k<raz)
  165.                                 raz=k;
  166.                                 kL=kontrL;
  167.                                 kD=kontrD;
  168.                         else
  169.                                 break;
  170.                         end    
  171.                 end
  172.         end
  173. endfunction
  174.  
  175. %Funkcija, ki spreminja kontrolne tocke tam kjer nam ni treba skrbeti za odvodljivost krivulje
  176. %tocke=zunanje tocke, katerim se prilagajamo
  177. %kontrole=neke dane kotrolne tocke, ki jih bomo popravili
  178. %prilagodi=vektor kjer so nenicelne vrednosti na indeksih tistih tock, ki jih lahko prilagajamo.
  179. %recimo: Če imamo samo 1 krivuljo, lahko prilagajamo (ponavadi) samo 2. in 3. kontrolno tocko
  180. function [newKont,raz]=prilagodiKontrolneTocke(tocke,kontrole,prilagodi,korak)
  181.         pT=find(prilagodi);     %Dobimo ven katere tocke (na indeksih bomo prilagajali)
  182.         raz=povpRazdalja(tocke,narisiBezierCastel(kontrole,200,0,0));
  183.         newKont=kontrole;
  184.         for i=1:10
  185.                 for i=1:length(pT)
  186.                         for p=1:2       %koordinata x in y
  187.                                 razlika=zeros(2,4);
  188.                                 razlika(p,pT(i))=korak;
  189.                                 while(1==1)             %Vsaki tocki poiskusamo pristeti
  190.                                         kontrole=newKont+razlika;
  191.                                         k=povpRazdalja(tocke,narisiBezierCastel(kontrole,200,0,0));
  192.                                         if(k<raz)
  193.                                                 raz=k;
  194.                                                 newKont=kontrole;
  195.                                         else
  196.                                                 break;
  197.                                         end    
  198.                                 end
  199.                                 while(1==1)     %oziroma odsteti
  200.                                         kontrole=newKont-razlika;
  201.                                         k=povpRazdalja(tocke,narisiBezierCastel(kontrole,200,0,0));
  202.                                         if(k<raz)
  203.                                                 raz=k;
  204.                                                 newKont=kontrole;
  205.                                         else
  206.                                                 break;
  207.                                         end    
  208.                                 end
  209.                         end
  210.                 end
  211.                 korak=korak/2;
  212.         end
  213. endfunction
  214. %FUNKCIJA JE Z RAZVOJEM PROGRAMA "PROPADLA" IN SE V SAMEM PROGRAMU NE UPORABLJA VEC:
  215. %Pridobivanje kontrolnih točk s pomočjo "reverse engineeringa" -> imamo 4 točke neke krivulje
  216. %Č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
  217. %Drugi argument so verjetnosti. Če definiramo 4 točke iz neke krivulje, še vedno lahko skozi te 4 točke potegnemo
  218. %neskončno mnogo krivulj, verjetnosti pa nam povej položaj na krivulji, seštevek danih verjetnosti mora biti 1
  219. %Zadnji argument je nacin, ce je nacin enak 1 potem podamo 4 tocke na krivulji,
  220. %ce pa je nacin enak 2 potem podamo prvi dve kontrolni tocki in 2 tocki na krivulji (uporabno za nadaljnje krivulje, za zlepke)
  221. function controls = generirajKontrolneTocke(tocke,verjetnost,izris,nacin)
  222.         %imamo tocke t0, t1, t2 in t3 v vektorju tocke
  223.         %POMOC: http://polymathprogrammer.com/2007/06/27/reverse-engineering-narisiBezierCastel-curves/
  224.        
  225.         t0=tocke(:,1); t1=tocke(:,2); t2=tocke(:,3); t3=tocke(:,4);
  226.         k0=t0, k3=t3 %Začnemo in končamo krivuljo v začetni oz. končni točki
  227.         if(izris>0)     %Izrisemo tocke skozi katere mora krivulja
  228.                 plot(tocke(1,:),tocke(2,:),['o','r']);  %Narisemo tocke
  229.         end
  230.  
  231.         u=verjetnost(1); v=verjetnost(2);
  232.         %Kontrolni tocki k0=t0 in k3=t3 imamo ze, rabimo se k1 in k2
  233.         %Uporabimo de Castelauovo formulo
  234.         %t1=(1-u)^3*k0 + 3*(1-u)^2*u*k1 + 3*(1-u)*u^2*k2 + u^3*k3
  235.         %Ce damo k1 in k2 na eno stran, kar iščemo, dobimo sistem 2 neznank k1 in k2:
  236.         %3*(1-u)^2*u*k1 + 3*(1-u)*u^2*k2 = t1 - (1-u)^3*k0 - u^3*k3
  237.         %3*(1-v)^2*v*k1 + 3*(1-v)*v^2*k2 = t2 - (1-v)^3*k0 - v^3*k3
  238.         %Sistem lahko zapisemo v matricni obliki, leva stran:
  239.         if(nacin<2)
  240.                 c=t1-(1-u)^3*k0-u^3*k3;
  241.                 d=t2-(1-v)^3*k0-v^3*k3;
  242.                 L=[3*(1-u)^2*u, 3*(1-u)*u^2; 3*(1-v)^2*v, 3*(1-v)*v^2]'
  243.                 D=[c'; d'];
  244.                 per=L\D;
  245.                 controls=[t0,per',t3];
  246.         %V drugem nacinu imamo prakticno samo eno neznano kontrolno tocko, prvi dve dobimo iz funkcije naslednjiKontrolniTocki,
  247.         %da je zvezno odvedljiva krivulja, zadnja tocka na krivulji pa je zadnja kontrolna tocka, iscemo torej k2
  248.         elseif(nacin>1)
  249.                 k1=t1;
  250.                 k2=(t2-((1-v)^3*k0 + 3*(1-v)^2*v*k1 + v^3*k3))/(3*(1-v)*v^2);
  251.                 controls=[k0,k1,k2,k3];
  252.         endif
  253. endfunction
  254.  
  255. %Funkcija izracuna povprecno razdaljo med danimi tockami in bezierjevo krivuljo
  256. %Sprejme 2 argumenta:
  257. %tocke = zacetne tocke, okoli katerih moramo zgraditi bezierjevo krivuljo
  258. %X = tocke, ki predstavljajo bezierjevo krivuljo
  259. %Obe matriki sta sestavljeni iz 2 vrstic, zgornja so vse x koordinate, spodnja vse y (X=[x;y])
  260. function avgDist = povpRazdalja(tocke,X)
  261.         stTock=length(tocke(1,:));      %Stevilo danih tock
  262.         avgDist=0;
  263.         for k=1:stTock
  264.                 tocka=tocke(:,k)';
  265.                 [dist,i]=min(sqrt((X(1,:)-tocka(1)).^2 + (X(2,:)-tocka(2)).^2));        %Racunanje minimalne razdalje (evklidove)
  266.                 avgDist+=dist/stTock;   %Utezena vsota
  267.         end
  268. endfunction
  269.  
  270. %Funkcija izracuna Bezierjevo krivuljo, ne nujno da 3. reda in jo vrne v obliki N tock
  271. %DEFINIRANA Z BERNSTEINOVIM POLINOMOM
  272. %Podamo ji 4 parametre:
  273. %kTocke = kontrolne tocke: 1. vrstica x koordinate, 2. y koordinate
  274. %N = "resolucija", s koliko tockami bomo predstavili krivuljo
  275. %poligon = Ce je enak 1, potem narisemo poligon, drugace samo krivuljo
  276. function X = narisiBezier(kTocke,N,poligon,krivulj)
  277.        
  278.         n=length(kTocke(1,:));    %Izracunamo stevilo kontrolnih tock
  279.         a=linspace(0,1,N);       %Izracunamo x koordinate tock na krivulji  
  280.         I=(0:(n-1))'*ones(1,N);    %toliko kot je tock tolikokrat indeks i postavimo od 0-stopnje,
  281.                                                                 %ponavadi 0-3, da ne bomo potrebovali for zanke
  282.                                                                
  283.         P=ones(n,1)*a;           %Matrika verjetnosti za binomsko porazdelitev
  284.         B=binopdf(I,n-1,P);  %Izracunamo B kar nad matriko, binopdf vrne binomsko porazdelitev
  285.         X=kTocke*B;                       %Točke na krivulji, računane po
  286.         X(:,1)=[kTocke(1,1),kTocke(2,1)]';
  287.         X(:,N)=[kTocke(1,n),kTocke(2,n)]';
  288.        
  289.         if(krivulj>0)
  290.                 plot(X(1,:), X(2,:));   %Narisemo se krivuljo
  291.                 hold on;
  292.         end
  293.         if(poligon==1)
  294.                 plot(kTocke(1,:), kTocke(2,:), ['-o','g']); %Narisemo poligon
  295.         end
  296. endfunction
  297.  
  298.  
  299. %Funkcija izracuna Bezierjevo krivuljo, ne nujno da 3. reda in jo vrne v obliki N tock
  300. %DEFINIRANA Z DE CASTELJAUOVO METODO  -> Po merjenjih je vec kot 10x hitrejsa od funkcije z Bernsteinovim polinomom
  301. %Podamo ji 4 parametre:
  302. %kTocke = kontrolne tocke: 1. vrstica x koordinate, 2. y koordinate
  303. %N = "resolucija", s koliko tockami bomo predstavili krivuljo
  304. %poligon = Ce je enak 1, potem narisemo poligon, drugace samo krivuljo
  305. function X = narisiBezierCastel(kTocke,N,poligon,krivulj)
  306.         n=length(kTocke(1,:));    %Izracunamo stevilo kontrolnih tock
  307.         u=linspace(0,1,N);       %Izracunamo x koordinate tock na krivulji
  308.         %de Casteljauvova formula
  309.         Xx=(1-u) .^3 *kTocke(1,1) + 3*(1-u).^2.*u.*kTocke(1,2) + 3*(1-u).*u.^2.*kTocke(1,3) + u.^3.*kTocke(1,4);
  310.         Xy=(1-u) .^3 *kTocke(2,1) + 3*(1-u).^2.*u.*kTocke(2,2) + 3*(1-u).*u.^2.*kTocke(2,3) + u.^3.*kTocke(2,4);
  311.         X=[Xx;Xy];
  312.         if(krivulj>0)
  313.                 plot(X(1,:), X(2,:));   %Narisemo se krivuljo
  314.                 hold on;
  315.         end
  316.         if(poligon==1)
  317.                 plot(kTocke(1,:), kTocke(2,:), ['-o','g']); %Narisemo poligon
  318.         end
  319. endfunction
  320.  
  321. %Funkcija izracuna prvi 2 kontrolni tocki naslednje bezierjeve krivulje in jih vrne
  322. %Kot argumente ji podamo prejsnje kontrolne tocke in pa x ali y 2. kontrolne tocke
  323. %Iz prejsnjih kontrolnih tock poiscemo premico, ki gre skozi zadnji dve kontrolni tocki
  324. %iz premice pa glede na podan x ali y izracunamo tocko
  325. %kaj je podano x ali y povemo tako, da je ena vrednost razlicna od Inf (neskoncno)
  326. %V primeru napake, da podamo napacne argumente, sta oba vrnjena vektorja prazna
  327. %Parametra x in y se kontrolirata v bloku PREVERJANJE
  328. function [tocki] = naslednjiKontrolniTocki(kontrole,x,y)
  329.         %koeficient premice: Potrebujemo zadnji dve kontrolni tocki z indeksoma 3 oz. 4
  330.         %k=(y2-y1)/(x2-x1)
  331.         kX3=kontrole(1,3); kY3=kontrole(2,3);
  332.         kX4=kontrole(1,4); kY4=kontrole(2,4);
  333.        
  334.         if(kY4==kY3)    %Zaradi deljenja z 0, ce dobimo vodoravno premico
  335.                 k=0;
  336.         elseif(kX4==kX3) %Premica je navpična
  337.                 k=Inf;
  338.         elseif(1==1)
  339.                 k=(kY4-kY3)/(kX4-kX3);
  340.         endif
  341.         %izracunamo se n iz formule za premico y=k*x+n  -> n=y-k*x
  342.         n=kY4-k*kX4;
  343.         n1=kY3-k*kX3;
  344.         %---------------PREVERJANJE------------- "zaradi nadzora parametrov"
  345.         %seveda veljajo določene omejitve pri izbiri x-a oz. y-a
  346.         %Primer: če je k<0 -> premica pada -> v primeru da je 3. kontrolna točka višje od 4. na prejšnji krivulji:
  347.         %y mora biti manjši od zadnje kontrolne točke in x večji, če ne dobimo nesmiselno situacijo,
  348.         %Ne sme veljati niti enakost, ker sta potem prvi dve kontrolni točki nove krivulje enaki in spet ne dobimo odvedljive krivulje
  349.         dx=abs(kX3-kX4);
  350.         dy=abs(kY3-kY4);
  351.         if (k<0)
  352.                 if (kY3<kY4)    %oziroma kX3>kX4
  353.                         if(x==Inf&&y==Inf)
  354.                                 x=kX4-dx;
  355.                                 "1"
  356.                         elseif(x!=Inf && x >= kX4)
  357.                                 "Neveljavno izbran x, k<0, err 1"
  358.                                 return
  359.                         elseif(y!=Inf && y <= kY4)
  360.                                 "Neveljavno izbran y, k<0, err 2"
  361.                                 return
  362.                         endif
  363.                
  364.                 else
  365.                         if(x==Inf&&y==Inf)
  366.                                 x=kX4+dx;
  367.                                 "2"
  368.                         elseif (x!=Inf && x <= kX4)
  369.                                 "Neveljavno izbran x, k<0, err 3"
  370.                                 return
  371.                         elseif (y!=Inf && y >= kY4)
  372.                                 "Neveljavno izbran y, k<0, err 4"
  373.                                 return
  374.                         endif
  375.                 endif
  376.         elseif (k > 0 && k!=Inf)
  377.                 if (kY3<kY4)    %oziroma kX3<kX4
  378.                         if(x==Inf&&y==Inf)
  379.                                 x=kX4+dx;
  380.                                 "3"
  381.                         elseif (x!=Inf && x <= kX4)
  382.                                 "Neveljavno izbran x, k>0, err 5"
  383.                                 return
  384.                                
  385.                         elseif (y!=Inf && y <= kY4)
  386.                                 "Neveljavno izbran y, k>0, err 6"
  387.                                 return
  388.                         endif
  389.                
  390.                 else
  391.                         if(x==Inf&&y==Inf)
  392.                                 x=kX4-dx;
  393.                                 "4"
  394.                         elseif (x!=Inf && x >= kX4)
  395.                                 "Neveljavno izbran x, k>0, err 7"
  396.                                 return
  397.                         elseif (y!=Inf && y >= kY4)
  398.                                 "Neveljavno izbran y, k<0, err 8"
  399.                                 return
  400.                         endif
  401.                 endif
  402.         elseif(k==0)
  403.                 if(x==Inf&&y==Inf)
  404.                         if(kX3>kX4)
  405.                                 x=kX4-dx;
  406.                         else
  407.                                 x=kX4+dx;
  408.                         end
  409.                 elseif (y!=Inf) %Premica je vodoravna, k=0, ne moremo iskati x ker imamo neskončno rešitev, lahko pa iščemo y, trivialna rešitev, y=n
  410.                         "Premica je vodoravna, k=0, neznan x, err 9"
  411.                         return
  412.                 elseif(kX3<kX4 && x<=kX4)
  413.                         "vodoravna premica, k=0, slab x, err 10"
  414.                         return
  415.                 elseif(kX4<kX3 && x>=kX4)
  416.                         "vodoravna premica, k=0, slab x, err 11"
  417.                         return
  418.                 endif  
  419.                
  420.         elseif(k==Inf)  %k==Inf, navpična premica
  421.                 if(x==Inf&&y==Inf)
  422.                         if(kY4>kY3)
  423.                                 y=kY4+dy;
  424.                         else
  425.                                 y=kY4-dy;
  426.                         end
  427.                 elseif(x!=Inf)
  428.                         "Navpična premica, x mora biti nedefiniran err 12"
  429.                         return
  430.                 elseif(kY3<kY4 && y<=kY4)
  431.                         "navpična premica, k=0, slab y, err 10"
  432.                         return
  433.                 elseif(kY4<kY3 && y>=kY4)
  434.                         "navpična premica, k=0, slab y, err 11"
  435.                         return
  436.                 endif  
  437.                
  438.         endif
  439.         %--------------Konec PREVERJANJE-----------
  440.        
  441.         if(k==Inf)      %Če je premica navpična, velja enačba za premico x=...
  442.                 x=y;
  443.         elseif(x!=Inf) 
  444.                 y=k*x+n;
  445.         elseif (y!=Inf)
  446.                 x=(y-n)/k;
  447.         else
  448.                 "Napačni parametri!"
  449.         endif
  450.         tocki=[kX4,x;kY4,y];
  451. endfunction