Verfasst am: 27.07.2012, 09:56
Titel: Surf Funktion macht nicht das was ich möchte!
Hallo Matlaber,
ich bin gerade dabei ein Schulprojekt durchzuführen und komme einfach nicht mehr weiter. Es soll eine Schraubenkurve mit einen sie umgebenden Schlauch erstellt werden. Ist auch soweit alles i.O. nur den Schlauch bzw. die Röhre bekomme ich nicht als Fläche dargestellt. Ich habe es mi dem Plot- Befehl hinbekommen, dass ich einzelene Ringe um die Schraubenkurve habe. Wollte ab gerne eine Röhre als Fläche über mesh oder surf angezeigt bekommen. Ich bin jetzt schon seit drei Tagen am testen und weiß einfach nicht was ich falsch mache.
Ich hoffe das sich jemand erbarmt und mir einen Tip geben kann.
Hier auszugsweise der Code ohne die Animation mit Dreibein und Ringen um die Kurve.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0011]); % legt fest,dass die aktuelle Figur1 auf den ganzen Bildschirm campos([11.21.9])% legt die Kameraposition fest
%a: Radius Schraubenkurve
%r: Radius der Röhre der Schraubenkurve
%h: Steigung der Schraubenkurve
% Gesetzte Variablen
if ~exist('a','var')|isempty(u) a=1; end; % Fragt die Variablen ab! od diese vorhanden sind if ~exist('roh','var')|isempty(r) roh=a/10; end;
if ~exist('h','var')|isempty(steps) h=a/2; end;
% Darstellung der Kurve
t = [0:0.01:1]; % die 3 wegen 3*h. h für das Dreibein in reinform benötigt
x=a*cos(3*2*pi*t); % Beschreibt die Kurvenfunktion in Parameterform
y=a*sin(3*2*pi*t);
z=3*h*t;
plot3(x,y,z)% Zeichnet die obere Kurve in den entsprechenden Koordinaten grid on
hold on
%Festlegung Diagramm
ht = title('Schraubenkurve')% Überschriftentitel festgelen (Titel, Schriftgröße, Position) set(ht,'FontSize',15,'FontWeight','bold','Position',[002.2]) hold on
xl=xlabel('x- Achse','Fontsize',15)% x-Achsen Beschriftung set(xl,'Position',[0-1.90]);
yl=ylabel('y- Achse','Fontsize',15)% y-Achsen Beschriftung set(yl,'Position',[-1.900]);
zl=zlabel('z- Achse','Fontsize',15)% z-Achsen Beschriftung set(zl,'Position',[-1.71.60.75]);
xlim([-1.51.5])% limitiert die Achsen auf die eingetragenden Werte ylim([-1.51.5]) zlim([01.5]) hold on
% Flaeche Röhre
t3 = [0:0.01:1];
phi2 = [0:(2*pi)/100:2*pi];
R = sqrt(a^2 + h^2);
r = [a*cos(2*pi*t3);a*sin(2*pi*t3);h*t3];
B2 = (1/R)*[h*sin(2*pi*t3);-h*cos(2*pi*t3);h*t3]
N2 = (1/R)*[-cos(2*pi*t3);-sin(2*pi*t3);0*t3]
sin2 = sin(phi2)
cos2 = cos(phi2)
j2 = 1
Ja, es sind unerwartete Ergebnisse. Ich stelle nochmal den geamten code rein, da sieht man dann die Ringe, bei denen es schon klappt. Jedoch wollte ich keine Ringe sondern einen durchgehenden Schlauch darstellen. Und hierbei vertsehe ich nicht wo mein Fehler in der Surf Funktion liegt, da diese mir eine Fläche anzeigt, die nicht gewollt ist.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0011]); % legt fest,dass die aktuelle Figur1 auf den ganzen Bildschirm campos([11.21.9])% legt die Kameraposition fest
%a: Radius Schraubenkurve
%r: Radius der Röhre der Schraubenkurve
%h: Steigung der Schraubenkurve
% Gesetzte Variablen
if ~exist('a','var')|isempty(u) a=1; end; % Fragt die Variablen ab! od diese vorhanden sind if ~exist('roh','var')|isempty(r) roh=a/10; end;
if ~exist('h','var')|isempty(steps) h=a/2; end;
% Darstellung der Kurve
t = [0:0.01:1]; % die 3 wegen 3*h. h für das Dreibein in reinform benötigt
x=a*cos(3*2*pi*t); % Beschreibt die Kurvenfunktion in Parameterform
y=a*sin(3*2*pi*t);
z=3*h*t;
plot3(x,y,z)% Zeichnet die obere Kurve in den entsprechenden Koordinaten grid on
hold on
%Festlegung Diagramm
ht = title('Schraubenkurve')% Überschriftentitel festgelen (Titel, Schriftgröße, Position) set(ht,'FontSize',15,'FontWeight','bold','Position',[002.2]) hold on
xl=xlabel('x- Achse','Fontsize',15)% x-Achsen Beschriftung set(xl,'Position',[0-1.90]);
yl=ylabel('y- Achse','Fontsize',15)% y-Achsen Beschriftung set(yl,'Position',[-1.900]);
zl=zlabel('z- Achse','Fontsize',15)% z-Achsen Beschriftung set(zl,'Position',[-1.71.60.75]);
xlim([-1.51.5])% limitiert die Achsen auf die eingetragenden Werte ylim([-1.51.5]) zlim([01.5]) hold on
% Animation
pan % Bewirkt das zu beginn die Verschiebefunktion angewählt ist pause(2)% Pausenzeit von 5 Sekunden
pan off % Schaltet die Verschiebfunktion ab
w=msgbox('Animation starten?'); % erzeugt ein Messagebox set(w, 'Position', [2044012050])% Beschreibt die Massagebox
uiwait(w)% Stellt die Massagebox in der Figur dar
%Kurve
x=a*cos(3*2*pi*t); % Beschreibt die Kurvenfunktion in Parameterform
y=a*sin(3*2*pi*t);
z=3*h*t;
p = plot3(x(1),y(1),z(1),'*','EraseMode','none','MarkerSize',6); % Erzeugt einen 3 D Plot mit entsprechenden Festlegungen
j = 0; % Festlegung der Startbedingungen i und j
t1 = 0;
while(t1<=1)% Einfügen der Whileschhleife um die Animation ablaufen zu lassen
% Begleitendes Dreibein
j = j + 1% erhöht die Laufvariable um eins
k = [a*cos(3*2*pi*t1);a*sin(3*2*pi*t1);3*h*t1]; % Funtion die die Raumkurven beschreibt
b = [-6*pi*a*sin(3*2*pi*t1);6*pi*a*cos(3*2*pi*t1);3*h]; % 1. Ableitung nach t
c = [-36*pi*a*cos(3*2*pi*t1);-36*pi*a*sin(3*2*pi*t1);0]; % 2. Ableitung nach t
b_betrag = sqrt(dot(b,b)); % Betrag des Vektors a'
T = b/b_betrag; % Tangenteneinheitsvektor
B1 = cross(b,c); % Kreuzprodukt der Vektoren (b und c)
B1_betrag = sqrt(dot(B1,B1));
B = B1/B1_betrag; % Binormaleneinheitsvektor
N = cross(B,T); % Binormaleneinheitsvektor
e = quiver3(x(j),y(j),z(j),T(1,1),T(2,1),T(3,1),'g','Linewidth',1); % erzeugt einen Vektorpfeil im 3 D mit entsprechenden Bedingungen
f = quiver3(x(j),y(j),z(j),N(1,1),N(2,1),N(3,1),'y','Linewidth',1); % Die ersten drei werte stellen den Startpunkt auf der Kurve dar,
g = quiver3(x(j),y(j),z(j),B(1,1),B(2,1),B(3,1),'k','Linewidth',1); % die folgenden drei Werte sind die Endwerte des Vektors
p = plot3(x(j),y(j),z(j),'*','EraseMode','none','MarkerSize',6);
F(j)= getframe; % Gibt die Animation aus delete(e); % Löscht den jeweils letzten Datenpunkt delete(f);
delete(g);
delete(p);
t1 = t1 + 0.01;
Also bei mir funktioniert der Code nicht richtig
Variable u ist bspw. unbekannt.
Ich glaube der Code erschlägt alle Interessierten erstmal.
Wichtig ist doch für dich die Darstellung von Surf. Nur ich weiß gar nicht ob du mit Surf einen 3D-Schlauch darstellen kannst!
Surf ist ja - wieder der Name vermuten lässt - nur für eine Z-Oberfläche als Matrixform. Einen 3D Schlauch kannst du damit ja gar nicht darstellen.
Dafür wären andere Funktionien vielleicht sinnvoller.
Ein Schlauchabschnitt würde ja durch 2 Kreise approximiert werden. Diese beiden Kreise könntest du durch Linien miteinander verbinden und das wiederrum würden dann viele Rechtecke ergeben. Diese Rechecke bestehen aus 4 Punkte und das könntest du dann ausfüllen mit "patch":
SURF kann Schläuche aller Art sehr gut darstellen. Z.B. Kugeln (siehe SPHERE) und Zylinder (siehe CYLINDER).
Der Name SURF kommt von Surface: Es kann alle möglichen "Oberflächen" erzeugen.
Ein PATCH-Objekt ist dazu equivalent, man kann also beide Objekte ineinander umwandeln.
Ich habe es jetzt nochmal drei Tage lang probiert aber ich bekomme es einfach nicht hin. Evtl. hat ja doch jemand Lust sich mit dem Code zu beschäftigen und mir eine Lösung vorzuschlagen. Ich bin echt am verzweifeln.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0011]); % legt fest,dass die aktuelle Figur1 auf den ganzen Bildschirm campos([11.21.9])% legt die Kameraposition fest
%a: Radius Schraubenkurve
%r: Radius der Röhre der Schraubenkurve
%h: Steigung der Schraubenkurve
% Gesetzte Variablen
if ~exist('a','var')|isempty(u) a=1; end; % Fragt die Variablen ab! od diese vorhanden sind if ~exist('roh','var')|isempty(r) roh=a/10; end;
if ~exist('h','var')|isempty(steps) h=a/2; end;
% Darstellung der Kurve
t = [0:0.01:1]% die 3 wegen 3*h. h für das Dreibein in reinform benötigt
x=a*cos(3*2*pi*t); % Beschreibt die Kurvenfunktion in Parameterform
y=a*sin(3*2*pi*t);
z=3*h*t;
plot3(x,y,z)% Zeichnet die obere Kurve in den entsprechenden Koordinaten grid on
hold on
%Festlegung Diagramm
ht = title('Schraubenkurve')% Überschriftentitel festgelen (Titel, Schriftgröße, Position) set(ht,'FontSize',15,'FontWeight','bold','Position',[002.2]) hold on
xl=xlabel('x- Achse','Fontsize',15) %x-Achsen Beschriftung
set(xl,'Position',[0-1.90]);
yl=ylabel('y- Achse','Fontsize',15) %y-Achsen Beschriftung
set(yl,'Position',[-1.900]);
zl=zlabel('z- Achse','Fontsize',15) %z-Achsen Beschriftung
set(zl,'Position',[-1.71.60.75]);
xlim([-1.51.5])% limitiert die Achsen auf die eingetragenden Werte ylim([-1.51.5]) zlim([01.5]) hold on
% Animation
pan % Bewirkt das zu beginn die Verschiebefunktion angewählt ist pause(2)% Pausenzeit von 5 Sekunden
pan off % Schaltet die Verschiebfunktion ab
w=msgbox('Animation starten?'); % erzeugt ein Messagebox set(w, 'Position', [2044012050])% Beschreibt die Massagebox
uiwait(w)% Stellt die Massagebox in der Figur dar
%Kurve
x=a*cos(3*2*pi*t); % Beschreibt die Kurvenfunktion in Parameterform
y=a*sin(3*2*pi*t);
z=3*h*t;
p = plot3(x(1),y(1),z(1),'*','EraseMode','none','MarkerSize',6); % Erzeugt einen 3 D Plot mit entsprechenden Festlegungen
j = 0; % Festlegung der Startbedingungen i und j
t1 = 0;
while(t1<=1)% Einfügen der Whileschhleife um die Animation ablaufen zu lassen
% Begleitendes Dreibein
j = j + 1% erhöht die Laufvariable um eins
k = [a*cos(3*2*pi*t1);a*sin(3*2*pi*t1);3*h*t1]; % Funtion die die Raumkurven beschreibt
b = [-6*pi*a*sin(3*2*pi*t1);6*pi*a*cos(3*2*pi*t1);3*h]; % 1. Ableitung nach t
c = [-36*pi*a*cos(3*2*pi*t1);-36*pi*a*sin(3*2*pi*t1);0]; % 2. Ableitung nach t
b_betrag = sqrt(dot(b,b)); % Betrag des Vektors a'
T = b/b_betrag; % Tangenteneinheitsvektor
B1 = cross(b,c); % Kreuzprodukt der Vektoren (b und c)
B1_betrag = sqrt(dot(B1,B1));
B = B1/B1_betrag; % Binormaleneinheitsvektor
N = cross(B,T); % Binormaleneinheitsvektor
e = quiver3(x(j),y(j),z(j),T(1,1),T(2,1),T(3,1),'g','Linewidth',1); % erzeugt einen Vektorpfeil im 3 D mit entsprechenden Bedingungen
f = quiver3(x(j),y(j),z(j),N(1,1),N(2,1),N(3,1),'y','Linewidth',1); % Die ersten drei werte stellen den Startpunkt auf der Kurve dar,
g = quiver3(x(j),y(j),z(j),B(1,1),B(2,1),B(3,1),'k','Linewidth',1); % die folgenden drei Werte sind die Endwerte des Vektors
p = plot3(x(j),y(j),z(j),'*','EraseMode','none','MarkerSize',6);
F(j)= getframe; % Gibt die Animation aus delete(e); % Löscht den jeweils letzten Datenpunkt delete(f);
delete(g);
delete(p);
t1 = t1 + 0.01 % Flaeche Röhre
Wenn du dir den Code angeschaut hast, wirst du gesehen haben, dass ich momentan nur Kreise abbilden kann. Ich habe schon die ganze Zeit versucht diese Kreise durch längslinien miteinander zu verbinden, so dass ein Schlauch entsteht. Hat leider nicht funktioniert. Im Anschluss habe ich versucht die daten in eine Matrix schreiben zu lassen und diese mittels surf auswerten zu lassen. Es ergab sich jedoch nie der gewünschte Schlauch.
Ging ganz gut. Habe Aus deinem Code "R" einfach ein R1 und ein R2 abgespeichert.
Natürlich dauert das ein wenig bis der Patch komplett ausgefüllt ist, aber es wäre ein Anfang:
plot3(R1(1,i),R1(2,i),R1(3,i),'b.'), hold on
plot3(R2(1,i),R2(2,i),R2(3,i),'r.') plot3(R1(1,i+1),R1(2,i+1),R1(3,i+1),'bx') plot3(R2(1,i+1),R2(2,i+1),R2(3,i+1),'rx')
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.