Bezierkurve m. Bernsteinpolyn. < Matlab < Mathe-Software < Mathe < Vorhilfe
 
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Frage) reagiert/warte auf Reaktion    |    | Datum: |  16:20 Fr 27.07.2007 |    | Autor: |  Ladylai |   
	   
	   Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt. 
 
 
Hallo, 
 
ich bekomme einfach nicht heraus wie ich folgendes in Matlab eingeben kann.  Es geht darum, dass man Punkte vorgibt, und durch diese mittels Bernsteinpolynomen eine Bezierkurve legt. Das Programm um die Punkte per Mausklick einzugeben habe ich:
 
 
x0=[]; y0=[]; n=length(x0); 
 
salir=0;
 
cla                         
 
xlim([0,1]); ylim([0,1]);
 
while salir==0              
 
    [xi,yi,b]=ginput(1);
 
    if b==3                 
 
        cla
 
        if n>0              
 
            x0(n)=[]; y0(n)=[];
 
            plot(x0,y0,'ro')
 
            xlim([0,1]); ylim([0,1])
 
            n=n-1;
 
        end
 
    elseif isempty(b)       
 
        salir=1;
 
    elseif b==2             
 
        salir==1;
 
    else                    
 
        x0=[x0 xi]; y0=[y0 yi];
 
        plot(x0, y0, 'o')
 
        n=n+1;
 
        axis([0 1 0 1])
 
    end
 
end
 
 
aber ich weiss nicht wie ich die Formeln der Bernsteinpolynome handhaben muss, so sehen sie aus:
 
 
[mm] B_{j}^{n}(t)=\vektor{n \\ j}*t^j*(1-t)^(n-j) , j=0,1,...,n [/mm]
 
 
dann die Formel der Kurve:
 
 
[mm] S(t)= \summe_{j=0}^{n}B_{j}^{n}(t)*x_j, t \in[0,1] [/mm]
 
 
Würde mich freuen, wenn jemand weiterhelfen kann, vielen Dank!!
 
 
      | 
     
    
   | 
  
 |          | 
 
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Mitteilung) Reaktion unnötig    |    | Datum: |  16:53 Fr 27.07.2007 |    | Autor: |  rainerS |   
	   
	   Hallo!
 
 
 
Willst du eine Bezierkurve durch alle Punkte legen, also [mm]y=S(x)[/mm], oder soll das eine parametrische Bezierkurve [mm]S(t) = \left(\begin{matrix} x(t) \\ y(t) \end{matrix} \right) [/mm] sein?
 
 
Grüße
 
  Rainer
 
 
      | 
     
    
   | 
  
 
 |   
|                  | 
  
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Mitteilung) Reaktion unnötig    |    | Datum: |  17:06 Fr 27.07.2007 |    | Autor: |  Ladylai |   
	   
	   es soll eine parametrische Bezierkurve sein!
 
 
      | 
     
    
   | 
  
 
 |   
|          | 
 
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Antwort) fertig    |    | Datum: |  17:25 Fr 27.07.2007 |    | Autor: |  rainerS |   
	   
	   Hallo,
 
 
schau dir mal  diese Ausarbeitung an, da ist es für 4 Punkte vorgerechnet (in Abschnitt 3).
 
 
 Grüße
 
   Rainer
 
 
      | 
     
    
   | 
  
 
 |   
|                  | 
  
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Frage) überfällig    |    | Datum: |  15:04 Do 23.08.2007 |    | Autor: |  Ladylai |   
	   
	   Hallo Rainer, 
 
 
ich melde mich jetzt erst wieder da ich mir jetzt nocheinmal Zeit nehmen will um mich zum (wiederholten) mal mit dem Problem zu beschäftigen... Vielen Dank für den Tipp! Aber ich war quasi auch schon soweit, mein Problem dabei ist dass mann ja eigentlich je nach dem wieviele Stützstellen man hat, ein Polynom aufstellt. Aber ich glaube um mein Problem richtig zu lösen müsste ich die Polynome für beliebig viele Stützstellen aufstellen.. da gibts ja diese allgemeine Formel, aber wie kann ich die in Matlab eingeben? oder ist es wirklich nur möglich eine Formel für eine bestimmte Stützstellen anzahl einzugeben, und man muss dann eben die Stückstellenzahl begrenzen, zb das n höchstens =4 sein darf, dann gibt man halt die formeln für n=1,2,3 und 4 an.
 
Aber in meiner Aufgabenstellung heisst es immer nur von Stützstellen 1 bis n und es sind auch Bilder von Kurven an bis zu 18 Stützstellen dabei...
 
oder habe ich grundsätzlich die Bezierformel falsch verstanden.... irgendwo hakts aber ich finde es nicht heraus :-(
 
 
      | 
     
    
   | 
  
 
 |   
|                          | 
   
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Mitteilung) Reaktion unnötig    |    | Datum: |  16:06 Do 23.08.2007 |    | Autor: |  Ladylai |   
	   
	   ok, jetzt habe ich herausgefunden was die Klammer mit n über i in der allgemeinen Formel heißt, nämlich n!/i!(n-i)! ...
 
 
folgendes habe ich jetzt in Matlab geschrieben aber es funktioniert noch nicht (die Formel für S ist nur mal so prinzipiell hingeschrieben):
 
 
%   x0,y0.........Koordinaten der Punkte, x0=[x0 xi]
 
%   n.............Anzahl Punkte/Schnittstellen
 
%
 
%   i.............Laufindex der Punkte geht von 0 bis n-1 (da erster Punkt=x0 ?)
 
%   t.............geht von 0 bis 1, bei 0 Startpunkt, bei 1 Endpunkt
 
%
 
% 
 
 
t=linspace(0,1,1000);
 
 
[mm] Bni(t)=(factorial(n)/(factorial(i)*factorial(n-i)))*(t^i))*(1-t)^{n-i}
 [/mm] 
 
%S(t)=( Summe(über j=0..n)von Bni(t)*x0, Summe(über j=0...n) von Bni(t)*y0 )
 
 
die Punkte x0 und y0 kommen aus dem in der Aufgabenstellung schon beschriebenen, fertigen programm
 
 
      | 
     
    
   | 
  
 
 |   
|                                  | 
    
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Mitteilung) Reaktion unnötig    |    | Datum: |  20:16 Do 23.08.2007 |    | Autor: |  rainerS |   
	   
	   Hallo,
 
 
> ok, jetzt habe ich herausgefunden was die Klammer mit n 
 
> über i in der allgemeinen Formel heißt, nämlich n!/i!(n-i)! 
 
 
Da haben wir ja ein wenig aneinander vorbei geredet!
 
 
> folgendes habe ich jetzt in Matlab geschrieben aber es 
 
> funktioniert noch nicht (die Formel für S ist nur mal so 
 
> prinzipiell hingeschrieben):
 
>  
 
> %   x0,y0.........Koordinaten der Punkte, x0=[x0 xi]
 
>  %   n.............Anzahl Punkte/Schnittstellen
 
>  %
 
>  %   i.............Laufindex der Punkte geht von 0 bis n-1 
 
> (da erster Punkt=x0 ?)
 
>  %   t.............geht von 0 bis 1, bei 0 Startpunkt, bei 
 
> 1 Endpunkt
 
>  %
 
>  % 
 
> 
 
> t=linspace(0,1,1000);
 
>  
 
> [mm]Bni(t)=(factorial(n)/(factorial(i)*factorial(n-i)))*(t^i))*(1-t)^{n-i}[/mm]
 
>  
 
> %S(t)=( Summe(über j=0..n)von Bni(t)*x0, Summe(über 
 
> j=0...n) von Bni(t)*y0 )
 
>  
 
> die Punkte x0 und y0 kommen aus dem in der Aufgabenstellung 
 
> schon beschriebenen, fertigen programm 
 
 
Ich nehme an, du meinst das so:
 
[mm] S(t)= \summe_{j=0}^{n}B_{j}^{n}(t)*\vektor{x_j\\y_j}, t \in[0,1] [/mm]
 
 
Du solltest auf jeden Fall die eingebenen Punkte nach x sortieren.
 
 
Die Kurve S(t) geht aber nicht durch die Punkte [mm] \vektor{x_j\\y_j} [/mm], nur durch den ersten und letzten.
 
Schau mal auf  diese Seite, da siehst du, wie die Kontrollpunkte die Kurve bestimmen.
 
 
Damit die Kurve durch die Punkte geht, musst du neue Kontrollpunkte bestimmen.
 
 
 Viele Grüße
 
   Rainer
 
 
 
 
      | 
     
    
   | 
  
 
 |   
|                                          | 
     
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Frage) beantwortet    |    | Datum: |  09:06 Fr 24.08.2007 |    | Autor: |  Ladylai |   
	   
	   ja, so meine ich S   wie das mit den Summen in Matlab geht weiss ich eigentlich, ich habs nur mal auf die schnelle so hingeschrieben. Dass die Kurve nicht direkt durch die Punkte geht, ist mir eigentlich auch klar, da hab ich mich falsch ausgedrückt. Also eigentlich ist mir die ganze theorie klar, ich bekomme es nur nicht in Matlab richtig programmiert.
 
 
Bevor ich S ausrechnen kann, müsste ich ja erstmal B(n,i) ausrechnen, und das klappt schon nicht.... momentan sieht mein "Programm" so aus aber es funktioniert nicht so ganz:
 
 
 
%   x0,y0.........Koordinaten der Punkte, x0=[x0 xi]
 
%   n.............Anzahl Punkte/Schnittstellen
 
%
 
%   i.............Laufindex der Punkte geht von 0 bis n-1 (da erster Punkt=x0 ?)
 
%   t.............geht von 0 bis 1, bei 0 Startpunkt, bei 1 Endpunkt
 
%
 
% 
 
 
t=linspace(0,1,10);
 
 
i=1;
 
while i<n
 
    Bni=(factorial(n)./(factorial(i).*factorial(n-i))).*(t.^i).*((1-t).^(n-i))
 
    i+1;
 
end
 
   
 
das mit dem i ist mir auch noch unklar, eigentlich müsste es mit 0 starten aber dann kann Matlab die Formel scheinbar nicht berechnen? 
 
aber ich kann es auch von 1 bis n laufen lassen, und muss dann bei der Berechnung von S aufpassen, dass die Punkte von 0 bis n-1 indiziert sind. 
 
 
Aber trotzdem stimmt nochmehr an der Formel nicht, kann mir jemand helfen?
 
 
 
      | 
     
    
   | 
  
 
 |   
|                                                  | 
      
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Antwort) fertig    |    | Datum: |  11:09 Fr 24.08.2007 |    | Autor: |  rainerS |   
	   
	   Hallo,
 
 
> Bevor ich S ausrechnen kann, müsste ich ja erstmal B(n,i) 
 
> ausrechnen, und das klappt schon nicht.... momentan sieht 
 
> mein "Programm" so aus aber es funktioniert nicht so ganz:
 
 
Wie wär's denn hiermit (ohne es in Matlab ausprobiert zu haben):
 
 
| 1: |  
 |   | 2: |  % Intervall 0..1 im Abstand 0.1
 |   | 3: |  t=linspace(0,1,11)
 |   | 4: |  
 |   | 5: |  % Anfang und Ende der Summation speziell behandeln weil x.^0 Probleme macht
 |   | 6: |  Bni=[(1-t).^n] 
 |   | 7: |  for i=1:(n-1) , Bni=[Bni; (factorial(n)./(factorial(i).*factorial(n-i))).*(t.^i).*((1-t).^(n-i))];end
 |   | 8: |  Bni=[Bni;t^n] 
 |    
 
 
Dann müsstest du Bni mit den Vektoren x0 und y0 multiplizieren.
 
 
 Grüße
 
   Rainer
 
 
      | 
     
    
   | 
  
 
 |   
|                                                          | 
       
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Frage) beantwortet    |    | Datum: |  16:10 Fr 24.08.2007 |    | Autor: |  Ladylai |   
	   
	   Super, vielen Dank!!! Es klappt wirklich, ich bin mir jetzt nur noch nicht so sicher ob ich das S richtig berechnet habe, weil ich auch den Plot noch nicht so hinbekomme wie ich es möchte (dh S wird nicht in das erste koordinatensystem eingezeichnet, in dem man die Punkte vorgegeben hat, sondern es geht ein neues Fenster auf). Ich probiere mal weiter, wenn du oder noch jm einen Tipp hat, gerne melden  
 
im moment sieht das Programm so aus: 
 
 
n=n-1;          % weil n die Anzahl ist, im Folgenden aber bei 0 gestartet wird
 
B=[(1-t).^n];   % Anfang und Ende der Summation speziell behandeln weil x.^0 Probleme macht  
 
for i=1:(n-1)
 
    B=[B; (factorial(n)./(factorial(i).*factorial(n-i))).*(t.^i).*((1-t).^(n-i))];
 
end  
 
B=[B;t.^n]   % B(t,i)
 
 
u=x0*B;
 
v=y0*B;
 
S=[u;v]
 
 
 
plot(u,v)
 
 
 
      | 
     
    
   | 
  
 
 |   
|                                                                  | 
        
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Mitteilung) Reaktion unnötig    |    | Datum: |  18:25 Fr 24.08.2007 |    | Autor: |  Ladylai |   
	   
	   Hm scheinbar kann ich auf meine Frage nicht selbst "antworten"?
 
hab das mit den plots so gelöst: 
 
 
plot(x0,y0,'bo',u,v,'r.')
 
axis([0 1 0 1])
 
 
ich möchte jetzt noch ein bisschen rumprobieren und noch ein paar "extras" einbauen, hab ein paar grafische spielerein und bin jetzt gerade am schauen ob ich eine/oder weitere andere Interpolationen zum vergleich einbauen kann, hat jemand noch ideen oder tipps?
 
 
 
      | 
     
    
   | 
  
 
 |   
|          | 
 
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Frage) beantwortet    |    | Datum: |  12:04 So 26.08.2007 |    | Autor: |  Ladylai |   
	   
	   So, ich habe jetzt ein wunderschönes Programmchen, mittlerweile hab ich festgestellt dass es dazu jedoch noch eine Zusatzaufgabe gibt... nämlich dass man, wenn Bezierkuve durch die vorgegebenen Punkte gezeichnet ist, nochmal die Punkte ändern kann 
 
a) man löscht einen Punkt
 
b) man versetzt einen Punkt
 
c) man gibt einen zusätzlichen Punkt an. 
 
 
a) und b) habe ich schon gelöst, bei c) hakt es, das Problem ist ja dass man den neuen Punkt an einer sinnvollen stelle zwischen die anderen Punkte einsortieren muss. Dazu wird vorgegeben dass man den Winkel der vektoren von neuem Punkt zu zwei aufeinanderfolgenden "alten" punkten berechnen soll. Wo der Winkel am kleinsten ist, dort wird der winkel am größten ist (ahh ich hab mich vertan und "am kleinsten" ins programm geschrieben fällt mir da auf...) dort wird der neue Punkt eingereiht. Formel für den Winkel ist prinzipiell klar,
 
[mm] |cos(\alpha)|=\bruch{|(u*v)|}{||u||*||v||}
 [/mm] 
 
in matlab hab ich dazu diese Formel:
 
phi=abs(acos(abs(a.*b)/(norm(a)*norm(b))))
 
 
aber ich glaube nicht so ganz dass die richtig ist... 
 
a und b werden so berechnet: (ai,bi sind koord. des neuen Punkts)
 
a=[x0(i)-ai;y0(i)-bi]       
 
b=[x0(i+1)-bi;y0(i+1)-bi] 
 
 
Die einordnung des neuen Punktes könnte auch falsch sein: 
 
    for i=y:n              % es gilt für alle Punkte die an oder nach dem index des neuen Punktes (y)stehen
 
        x0(i+1)=x0(i)           % sie werden um eine Stelle weitergeschoben
 
        y0(i+1)=y0(i)
 
        end
 
        n=n+1;                    % n erhöht sich da ein Punkt mehr
 
        x0(y)=ai;               % Der neue Punkt wird eingeordnet  
 
        y0(y)=bi;
 
wobei das weiterschieben der Punkte ja falsch sein müsste, da ja der x0(i)-wert im endeffekt allen stellen i zugeordnet wird, oder liege ich falsch?
 
 
Irgendwas muss falsch sein, denn es funktioniert ja nicht, vielleciht hat jm ne idee?
 
 
Das restliche Programm hier mal zum ausprobiern (das englisch is nur so auf die schnelle hingeklatscht glaube das is teilweise mist  , insgesamt sind die berschreibungen auch noch nicht perfektioniert):
 
 
% Curvas Bezier
 
%
 
% linke Maustaste: b==1 , rechte b==3, mitte: b==2
 
% Enter drücken: isempty(b)
 
%
 
%   x0,y0.........Koordinaten der Punkte, x0=[x0 xi]
 
%   n.............Anzahl Punkte/Schnittstellen
 
%
 
%   i.............Laufindex der Punkte geht von 0 bis n-1 (da erster Punkt=x0 ?)
 
%   t.............geht von 0 bis 1, bei 0 Startpunkt, bei 1 Endpunkt
 
%
 
% 
 
 
disp('Mark Points in the field with the left mouse button.')
 
disp('The last Point can be deleted by clicking the right button.')
 
disp('You need at least 2 Points')
 
disp('Clicking Enter or the middle Mouse button finishs introducing points and shows the Bezier Polygon')
 
x0=[]; y0=[]; n=length(x0);
 
salir=0;
 
cla
 
%xlim([0,1]); ylim([0,1]);
 
while salir==0
 
    [xi,yi,b]=ginput(1);
 
    if b==3                 % boton derecho del raton
 
        cla
 
        if n>2  % borramos el ultimo punto
 
            %cla
 
            x0(n)=[]; y0(n)=[];
 
            n=n-1;
 
            plot(x0,y0,'ro')
 
            xlim([0,1]); ylim([0,1])
 
            for i=1:n
 
                text(x0(i)+0.02,y0(i)+0.02,strcat('P_',num2str(i)));
 
            end
 
            %else
 
            %disp('Its not possible to delete more Points')
 
        end
 
    elseif isempty(b)       % Se ha pulsado return: finalizamos lectura
 
        salir=1;
 
    elseif b==2             % boton central:finalizamos la lectura
 
        salir==1;
 
    else                    % introducimos el punto
 
        x0=[x0 xi]; y0=[y0 yi];
 
        n=n+1;
 
        plot(x0, y0, 'o')
 
        xlim([0,1]); ylim([0,1])
 
        for i=1:n
 
            text(x0(i)+0.02,y0(i)+0.02,strcat('P_',num2str(i)));
 
        end
 
    end
 
end
 
fill(x0,y0,'y')     %Zeichnen des Kontrollpolygons
 
xlim([0,1]); ylim([0,1])
 
hold on
 
plot(x0, y0, 'o')       %nochmal zeichnen damit Punkte über dem ausgefüllten Polygon liegen
 
for i=1:n
 
    text(x0(i)+0.02,y0(i)+0.02,strcat('P_',num2str(i)));   
 
end
 
hold off
 
legend('gegebene Punkte','Kontrollpolygon',1)
 
disp('Click any button to show the Bezier curve and the Spline curve')
 
pause
 
t=linspace(0,1,1000);
 
n=n-1;                  % weil n die Anzahl ist, im Folgenden aber bei 0 gestartet wird
 
B=[(1-t).^n];           % Anfang und Ende der Summation speziell behandeln weil x.^0 Probleme macht  
 
for i=1:(n-1)
 
    B=[B; (factorial(n)./(factorial(i).*factorial(n-i))).*(t.^i).*((1-t).^(n-i))];  
 
end  
 
B=[B;t.^n];     % B(t,i)
 
u=x0*B;         % S=[u;v]; %unnötig?
 
v=y0*B;
 
 
%g=interp1(x0,y0,t,'cubic');
 
%h=interp1(x0,y0,t,'spline');
 
R=[x0;y0];              % Splineberechnung
 
w=1:n+1;
 
ws=1:0.1:n+1;
 
g=spline(w,R,ws);
 
hold on 
 
plot(g(1,:),g(2,:), 'b-',u,v,'r.')
 
hold off
 
for i=1:(n+1)
 
    text(x0(i)+0.02,y0(i)+0.02,strcat('P_',num2str(i)));
 
end
 
legend('gegebene Punkte','Spline', 'Bezier-Kurve','Kontrollpolygon',1)
 
disp('Now its possible to move or delete Points, but there must be at least 2 Points left')
 
disp('Click a Point with the right Mouse Button to delete it.')
 
disp('To move a Point, click it with the left Mouse Button, and click where you want to move it.')
 
disp('Click Enter (or the middle Mouse button) to finish')
 
%
 
% Programm für Abänderungen
 
%
 
salir=0;
 
%y=0;                    %Überprüfung ob neuer Punkt dazukommt, und wo
 
while salir==0
 
    [ai,bi,b]=ginput(1);    % weiterer Klick im Plot 
 
    if isempty(b)           % Se ha pulsado return: finalizamos lectura
 
        salir=1;
 
    elseif b==2             % boton central:finalizamos la lectura
 
        salir==1;
 
    else
 
        i=1;
 
        while i<n+2
 
            c=abs(ai-x0(i));    % Abstand ai zu den x0 punkten
 
            d=abs(bi-y0(i));    % Abstand bi zu den y0 Punkten
 
            if c<0.1&d<0.1      % ist Abstand beider Koordinaten kleiner 0.1 wird alter Punkt gewählt
 
                if b==3 & n>1           % wenn rechte Maustaste geklickt
 
                    x0(i)=[]; y0(i)=[];     % dieser Punkt wird gelöscht
 
                    n=n-1;                  % weil ein Punkt gelöscht
 
                elseif b==1             % wenn linke Maustaste geklickt
 
                    [a2i,b2i]=ginput(1);     % neuer Punkt wird eingegeben
 
                    x0(i)=a2i;              % alter Punkt wird auf neuen verschoben
 
                    y0(i)=b2i;
 
                end
 
            end
 
            i=i+1;
 
        end
 
        t=linspace(0,1,1000);
 
        B=[(1-t).^n];           % Anfang und Ende der Summation speziell behandeln weil x.^0 Probleme macht  
 
        for i=1:(n-1)
 
            B=[B; (factorial(n)./(factorial(i).*factorial(n-i))).*(t.^i).*((1-t).^(n-i))];  
 
        end  
 
        B=[B;t.^n];  
 
        u=x0*B;
 
        v=y0*B;
 
        R=[x0;y0];              % Splineberechnung
 
        w=1:n+1;
 
        ws=1:0.1:n+1;
 
        g=spline(w,R,ws);
 
        fill(x0,y0,'y')
 
        xlim([0,1]); ylim([0,1])
 
        hold on
 
        plot(x0, y0, 'o',g(1,:),g(2,:),'b-',u,v,'r.')
 
        hold off
 
        for i=1:(n+1)
 
            text(x0(i)+0.02,y0(i)+0.02,strcat('P_',num2str(i)))
 
        end
 
        legend('gegebene Punkte','Spline', 'Bezier-Kurve','Kontrollpolygon',1)   
 
    end
 
end
 
 
Viel Spass  
 
 
 
      | 
     
    
   | 
  
 
 |   
|                  | 
  
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Mitteilung) Reaktion unnötig    |    | Datum: |  16:10 So 26.08.2007 |    | Autor: |  Ladylai |   
	   
	   Tja, also wiederum kann ich meine Frage leider nicht selbst beantworten  
 
Denn ich habs jetz doch komplett hingekriegt, also hier mal das komplette Programm, wer mal damit rumspielen mag... ist nicht schön kommentiert, das muss ich jetzt auf spanisch machen, und das würde euch wahrscheinlich nicht viel helfen :-D aber wenn jemand Fragen hat, kann er sich gerne melden!
 
 
 
 
%
 
%   x0,y0.........Koordinaten der Punkte, x0=[x0 xi]
 
%   n.............Anzahl Punkte/Schnittstellen
 
%
 
%   i.............Laufindex der Punkte geht von 0 bis n-1 (da erster Punkt=x0 ?)
 
%   t.............geht von 0 bis 1, bei 0 Startpunkt, bei 1 Endpunkt
 
%
 
% 
 
 
disp('Mark Points in the field with the left mouse button.')
 
disp('The last Point can be deleted by clicking the right button.')
 
disp('You need at least 2 Points')
 
disp('Clicking Enter or the middle Mouse button finishs introducing points and shows the Bezier Polygon')
 
x0=[]; y0=[]; n=length(x0);
 
salir=0;
 
cla
 
while salir==0
 
    [xi,yi,b]=ginput(1);
 
    if b==3                 % boton derecho del raton
 
        cla
 
        if n>2  % borramos el ultimo punto
 
            %cla
 
            x0(n)=[]; y0(n)=[];
 
            n=n-1;
 
            plot(x0,y0,'ro')
 
            xlim([0,1]); ylim([0,1])
 
            for i=1:n
 
                text(x0(i)+0.02,y0(i)+0.02,strcat('P_',num2str(i)));
 
            end
 
        end
 
    elseif isempty(b)       % Se ha pulsado return: finalizamos lectura
 
        salir=1;
 
    elseif b==2             % boton central:finalizamos la lectura
 
        salir=1;            % geändert! vorher salir==1
 
    else                    % introducimos el punto
 
        x0=[x0 xi]; y0=[y0 yi];
 
        n=n+1;
 
        plot(x0, y0, 'o')
 
        xlim([0,1]); ylim([0,1])
 
        for i=1:n
 
            text(x0(i)+0.02,y0(i)+0.02,strcat('P_',num2str(i)));
 
        end
 
    end
 
end
 
fill(x0,y0,'y')
 
xlim([0,1]); ylim([0,1])
 
hold on
 
plot(x0, y0, 'o')       %nochmal zeichnen damit Punkte über dem ausgefüllten Polygon liegen
 
for i=1:n
 
    text(x0(i)+0.02,y0(i)+0.02,strcat('P_',num2str(i)));   
 
end
 
hold off
 
legend('gegebene Punkte','Kontrollpolygon',1)
 
disp('Click any button to show the Bezier curve and the Spline curve')
 
pause
 
 
t=linspace(0,1,1000);
 
n=n-1;                  % weil n die Anzahl ist, im Folgenden aber bei 0 gestartet wird
 
B=[(1-t).^n];           % Anfang und Ende der Summation speziell behandeln weil x.^0 Probleme macht  
 
for i=1:(n-1)
 
    B=[B; (factorial(n)./(factorial(i).*factorial(n-i))).*(t.^i).*((1-t).^(n-i))];  
 
end  
 
B=[B;t.^n];     % B(t,i)
 
u=x0*B;
 
v=y0*B;
 
%S=[u;v]; %unnötig?
 
 
R=[x0;y0];              % Splineberechnung
 
w=1:n+1;
 
ws=1:0.1:n+1;
 
g=spline(w,R,ws);
 
 
hold on 
 
plot(g(1,:),g(2,:), 'b-',u,v,'r.')
 
hold off
 
 
for i=1:(n+1)
 
    text(x0(i)+0.02,y0(i)+0.02,strcat('P_',num2str(i)));
 
end
 
legend('gegebene Punkte','Spline', 'Bezier-Kurve','Kontrollpolygon',1)
 
 
disp('Now its possible to move or delete Points, but there must be at least 2 Points left')
 
disp('Click a Point with the right Mouse Button to delete it.')
 
disp('To move a Point, click it with the left Mouse Button, and click where you want to move it.')
 
disp('Click Enter (or the middle Mouse button) to finish')
 
%
 
% Programm für Abänderungen
 
%
 
 
salir=0;
 
y=0;                    %Überprüfung ob neuer Punkt dazukommt, und wo
 
m=0;
 
 
while salir==0
 
    [ai,bi,b]=ginput(1);    % weiterer Klick im Plot 
 
    if isempty(b)           % Se ha pulsado return: finalizamos lectura
 
        salir=1;
 
    elseif b==2             % boton central:finalizamos la lectura
 
        salir=1;            % geändert! vorher salir==1
 
    else
 
        i=1;
 
        while i<n+2
 
            c=abs(ai-x0(i));    % Abstand ai zu den x0 punkten
 
            d=abs(bi-y0(i));    % Abstand bi zu den y0 Punkten
 
            if c<0.05&d<0.05      % ist Abstand beider Koordinaten kleiner 0.1 wird alter Punkt gewählt
 
                if b==3 & n>1           % wenn rechte Maustaste geklickt
 
                    x0(i)=[]; y0(i)=[];     % dieser Punkt wird gelöscht
 
                    n=n-1;                  % weil ein Punkt gelöscht
 
                elseif b==1             % wenn linke Maustaste geklickt
 
                    m=1;
 
                    [a2i,b2i]=ginput(1);     % neuer Punkt wird eingegeben
 
                    x0(i)=a2i;              % alter Punkt wird auf neuen verschoben
 
                    y0(i)=b2i;
 
                end
 
            end
 
            i=i+1;
 
        end
 
        if (c>0.05|d>0.05)&b==1&m==0
 
          i=1;
 
          phi0=0; % Grundwert für phi0
 
          x0=[x0, x0(1)];
 
          y0=[y0, y0(1)];
 
            while i<n+2 % für 1 bis n reicht, da i+1=n+1  
 
                a=[x0(i)-ai;y0(i)-bi]       % Vektor von neuem Punkt zu altem Punkt i
 
                b=[x0(i+1)-ai;y0(i+1)-bi]   % Vektor von neuem Punkt zu nächstem alten Punkt i+1
 
                phi=abs(acos(dot(a,b)/(norm(a)*norm(b))))   % Winkel zwischen Vektoren         
 
                if phi>phi0                 % Wenn winkel zwischen Vektoren kleiner phi0 
 
                   phi0=phi                % wird dieser als neues phi0 gesetzt               
 
                   z=i+1;                    % Stelle z an der Punkt reinmuss
 
               end
 
               i=i+1
 
            end
 
            x0=[x0(1:(z-1)),ai,x0(z:n+1)] % oder z:(length(x0)-1)
 
            y0=[y0(1:(z-1)),bi,y0(z:n+1)]
 
            n=n+1;
 
      end
 
        t=linspace(0,1,1000);
 
        B=[(1-t).^n];           % Anfang und Ende der Summation speziell behandeln weil x.^0 Probleme macht  
 
        for i=1:(n-1)
 
            B=[B; (factorial(n)./(factorial(i).*factorial(n-i))).*(t.^i).*((1-t).^(n-i))];  
 
        end  
 
        B=[B;t.^n];  
 
        u=x0*B;
 
        v=y0*B;
 
        R=[x0;y0];              % Splineberechnung
 
        w=1:n+1;
 
        ws=1:0.1:n+1;
 
        g=spline(w,R,ws);
 
        fill(x0,y0,'y')
 
        xlim([0,1]); ylim([0,1])
 
        hold on
 
        plot(x0, y0, 'o',g(1,:),g(2,:),'b-',u,v,'r.')
 
        hold off
 
        for i=1:(n+1)
 
            text(x0(i)+0.02,y0(i)+0.02,strcat('P_',num2str(i)))
 
        end
 
        legend('gegebene Punkte','Spline', 'Bezier-Kurve','Kontrollpolygon',1)   
 
        m=0;
 
    end
 
end
 
 
 
      | 
     
    
   | 
  
 
 |   
|                          | 
   
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Frage) überfällig    |    | Datum: |  07:43 Di 28.08.2007 |    | Autor: |  Ladylai |   
	   
	   Hallo, 
 
 
ich bin mir irgendwie nicht sicher ob bei dem Programm der Spline richtig gezeichnet wird... er sieht zwar gut aus, aber ich habe folgende Formeln verwendet: 
 
R=[x0;y0];              
 
w=1:n+1; 
 
ws=1:0.1:n+1; 
 
g=spline(w,R,ws); 
 
 
(n+1 ist die Länge des Vektors x0 bzw y0, x0 und y0 sind Zeilenvektoren)
 
aber eigentlich heisst es immer man müsste die Berechnung des Splines mit "ppval" interpretieren. Ich habe schon die Hilfe zu spline gelesen aber ich durchblicke es nicht ganz. Kann mir jemand sagen ob die Berechnung und Zeichnung so richtig ist?
 
 
Viele Grüße
 
Ladylai
 
 
      | 
     
    
   | 
  
 
 |   
|                                  | 
    
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Antwort) fertig    |    | Datum: |  21:04 Di 28.08.2007 |    | Autor: |  rainerS |   
	   
	   Hi,
 
 
> ich bin mir irgendwie nicht sicher ob bei dem Programm der 
 
> Spline richtig gezeichnet wird... er sieht zwar gut aus, 
 
> aber ich habe folgende Formeln verwendet: 
 
> R=[x0;y0];              
 
> w=1:n+1; 
 
> ws=1:0.1:n+1; 
 
> g=spline(w,R,ws); 
 
> 
 
> (n+1 ist die Länge des Vektors x0 bzw y0, x0 und y0 sind 
 
> Zeilenvektoren)
 
>  aber eigentlich heisst es immer man müsste die Berechnung 
 
> des Splines mit "ppval" interpretieren. 
 
 
So wie ich das verstehe, ist spline mit drei Parametern 
 
 
spline(w,R,ws)
 
 
 
dasselbe wie
 
 
ppval(spline(w,R),ws)
 
 
 
So steht es zumindest  hier.
 
 
Ich kann es nicht ausprobieren, weil ich hier kein Matlab habe, nur Scilab.
 
 
 Viele Grüße
 
   Rainer
 
 
      | 
     
    
   | 
  
 
 |   
|                                  | 
    
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Mitteilung) Reaktion unnötig    |    | Datum: |  08:20 Do 30.08.2007 |    | Autor: |  matux |   
	   
	   $MATUXTEXT(ueberfaellige_frage) 
      | 
     
    
   | 
  
 
 |   
  
   |