www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Matlab" - Bezierkurve m. Bernsteinpolyn.
Bezierkurve m. Bernsteinpolyn. < Matlab < Mathe-Software < Mathe < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Bezierkurve m. Bernsteinpolyn.: aufgabenstellung
Status: (Frage) reagiert/warte auf Reaktion Status 
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!!

        
Bezug
Bezierkurve m. Bernsteinpolyn.: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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

Bezug
                
Bezug
Bezierkurve m. Bernsteinpolyn.: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 17:06 Fr 27.07.2007
Autor: Ladylai

es soll eine parametrische Bezierkurve sein!

Bezug
        
Bezug
Bezierkurve m. Bernsteinpolyn.: Antwort
Status: (Antwort) fertig Status 
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

Bezug
                
Bezug
Bezierkurve m. Bernsteinpolyn.: Frage (überfällig)
Status: (Frage) überfällig Status 
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 :-(

Bezug
                        
Bezug
Bezierkurve m. Bernsteinpolyn.: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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

Bezug
                                
Bezug
Bezierkurve m. Bernsteinpolyn.: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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



Bezug
                                        
Bezug
Bezierkurve m. Bernsteinpolyn.: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?


Bezug
                                                
Bezug
Bezierkurve m. Bernsteinpolyn.: Antwort
Status: (Antwort) fertig Status 
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

Bezug
                                                        
Bezug
Bezierkurve m. Bernsteinpolyn.: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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)


Bezug
                                                                
Bezug
Bezierkurve m. Bernsteinpolyn.: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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?


Bezug
                                                                
Bezug
Bezierkurve m. Bernsteinpolyn.: Antwort
Status: (Antwort) fertig Status 
Datum: 19:55 Fr 24.08.2007
Autor: rainerS

Hallo,

> 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?

Schau mal in den []Wikipediaartikel zur Interpolation, da stehen am Ende Links zu Seiten mit Java-Applets. Mir hat []http://www.ads.tuwien.ac.at/docs/lva/mmgdv/k1___004.htm gut gefallen (sobald ich den Start-Button gefunden hatte ;-))

[]Hier gibt's ein schönes Java-Applet für B-Splines.

Viele Grüße
  Rainer

Bezug
        
Bezug
Bezierkurve m. Bernsteinpolyn.: Winkel zw Vektoren,...
Status: (Frage) beantwortet Status 
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 :-)


Bezug
                
Bezug
Bezierkurve m. Bernsteinpolyn.: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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


Bezug
                        
Bezug
Bezierkurve m. Bernsteinpolyn.: Spline-Interpolation
Status: (Frage) überfällig Status 
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

Bezug
                                
Bezug
Bezierkurve m. Bernsteinpolyn.: Antwort
Status: (Antwort) fertig Status 
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

Bezug
                                
Bezug
Bezierkurve m. Bernsteinpolyn.: Fälligkeit abgelaufen
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 08:20 Do 30.08.2007
Autor: matux

$MATUXTEXT(ueberfaellige_frage)
Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]