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