Verfasst am: 13.04.2023, 08:31
Titel: Fläche basierend auf Geraden zwischen 2 Kurvenzügen
Zuerst Hallo - ich bin neu hier im Forum und suche für eine Matlab-Aufgabe eine Hilfestellung.
Kurz gefasst, zwischen 2 Kurvenzügen soll eine Fläche erzeugt werden, deren Erzeugenden Geraden sind. Ein Kurvenzug ist ein Kreis, der zweite besteht aus einem Halbkreis und 3 Strecken, die rechtwinkelig zueinander angeordnet sind.
Die Kurvenzüge als Begrenzungen oben/unten habe ich erstellt und das sieht wie im Anhang aus. Nun sollen diese verbunden werden.
Dazu habe ich eine Funktion gefunden, die das erledigen soll.
Code:
function[X, Y, Z] = ErzeugeStrahlflaeche(kreis_k1, halbkreis_oben, m)
u = transpose(linspace(0,1,m));
X = (1-u)*kreis_k1(1,:) + u*halbkreis_oben(1,:);
Y = (1-u)*kreis_k1(2,:) + u*halbkreis_oben(2,:);
Z = (1-u)*kreis_k1(3,:) + u*halbkreis_oben(3,:);
end
ich kann das ganze noch nicht ganz nachvollziehen.
Wie entstehen z.B. bei den plot3-Befehlen die Variablen x1, y1, z1?
Welche Zeile erzeugt den genannten Fehler?
In welcher Form soll denn die Verbindung erfolgen? Soll das eine Art Zylinder werden?
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
ich kann das ganze noch nicht ganz nachvollziehen.
Wie entstehen z.B. bei den plot3-Befehlen die Variablen x1, y1, z1?
Welche Zeile erzeugt den genannten Fehler?
In welcher Form soll denn die Verbindung erfolgen? Soll das eine Art Zylinder werden?
Grüße,
Harald
Diese Variablen parametrisieren den Halb-Kreis in der XY-Ebene (z=0)
Ich habe (zwischenzeitlich) viel Herumprobiert sowie gesucht und eine Anleitung für eine Verbindungsfläche von Kreis zu Ellipe gefunden.
Code:
clearall closeall clc
n = 70;
r = 100; %Radius des Halbkreises
c = 100; %Mittelpunktversatz des Halbkreises
%linke Hälfte des Halbkreises erzeugen
t = linspace(pi/2,0,n);
Kreis1=[r*cos(t);-c+r*sin(t);0*t];
%rechte Hälfte des Halbkreises erzeugen
t = linspace(pi, pi/2,n);
Kreis2 = [r*cos(t);-c+r*sin(t);0*t];
%Geraden generieren
u = linspace(-100,100,n);
G=[u;-r+0*u;0*u];
b=40; c=60;
%Rechte Hälfte der Ellipse erzeugen
z=linspace(0,pi,n);
Ellipse1 = [b*sin(z);60*cos(z);c-c*cos(z)];
%Linke Hälfte der Ellipse erzeugen
w=linspace(pi,2*pi,n);
Ellipse2 = [b*sin(w);60*cos(w);c-c*cos(w)];
%Punkte erzeugen
p = [b*sin(pi);60*cos(pi);c-c*cos(pi)];
%Mantelfläche aus Ellipse + Kreis + Punkte bilden
m=30;
[X, Y, Z] = createRuledSurfaceMesh (Kreis1, Ellipse1,m);
[X1, Y1, Z1] = createRuledSurfaceMesh (Kreis2, Ellipse2,m);
[X2, Y2, Z2] = createRuledSurfaceMesh (p, G,m);
s = surf(X, Y, Z);
hold on
s1 = surf(X1, Y1, Z1);
hold on
s2 = surf(X2, Y2, Z2);
view([-30,30,20]);
axis equal;
Dabei ist die Funktion createRuledSurfaceMesh definiert als:
Code:
function[X, Y, Z] = createRuledSurfaceMesh(P1, P2, m)
u = transpose(linspace(0,1,m));
X = (1-u)*P1(1,:) + u*P2(1,:);
Y = (1-u)*P1(2,:) + u*P2(2,:);
Z = (1-u)*P1(3,:) + u*P2(3,:);
end
Ein Bild habe ich auch angefügt, was das Skript ergibt. Das sieht schon ganz passend aus für meine Bedürfnisse. Jedoch, ich versuche es abzuändern auf mein Problem, schaffe es aber nicht.
und wie hast du bis jetzt versucht, das abzuändern?
Zitat:
Die beiden Kurvenzüge sollen einfach durch Geraden verbunden werden, sodass eine zylindrische Figur entsteht.
Dann würde ich auf der einen Kurve n Punkte berechnen lassen, ebenso auf der anderen, und dann n Geraden erstellen. Wichtig dürfte sein, alle Teile der beiden Kurvenzüge jeweils zusammenzufassen, so dass jeder Kurvenzug durch 3 Vektoren x, y, z beschrieben wird.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
und wie hast du bis jetzt versucht, das abzuändern?
Zitat:
Die beiden Kurvenzüge sollen einfach durch Geraden verbunden werden, sodass eine zylindrische Figur entsteht.
Dann würde ich auf der einen Kurve n Punkte berechnen lassen, ebenso auf der anderen, und dann n Geraden erstellen. Wichtig dürfte sein, alle Teile der beiden Kurvenzüge jeweils zusammenzufassen, so dass jeder Kurvenzug durch 3 Vektoren x, y, z beschrieben wird.
Grüße,
Harald
Ja, genau. Wie erstelle ich diese Punkte auf den Kurvenzügen bzw. die Vektoren dazu? Ich denke, da happert es. bzw. wie fasse ich die Kurvenzüge zusammen?
um dir dabei konkret weiterhelfen zu können wäre es gut, den kompletten Code in reproduzierbarer Form zu haben.
Allgemein:
Die Punkte hast du im Grunde schon - das ist das, was du plottest. Wenn es gewünscht ist, dass die Punkte gleichen Abstand zueinander haben, ist das eine kleine Herausforderung.
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
um dir dabei konkret weiterhelfen zu können wäre es gut, den kompletten Code in reproduzierbarer Form zu haben.
Pardon, habe ich nun eingefügt:
Meine Überlegung ist nun, Halbkreis mit Halbkreis zu verbinden und dann die 3 Strecken mit dem anderen Halbkreis. Daher habe ich den zuvor als kompletten unteren Kreis halbiert. Nur als Hinweis.
Code:
% Parametrisierung des oberen Halbkreises & Ausgabe
a=1; %Radius des Kreises vom oberen Kurvenzug (Halbkreis)
n=100; %Anzahl der Elemente auf dem Halb-Kreis bzw. den Geradenstücken
t1 = linspace(pi,2*pi,n); %gleichmäßige Unterteilung von Punkten auf dem Halbkreis
b=2; %Radius des Kreises vom oberen Kurvenzug (Halbkreis)
offset_z=-6; %Versatz vom Ursprung in z-Richtung
offset_y=5; %Versatz vom Ursprung y-Richtung
t3 = linspace(pi,2*pi,n); %gleichmäßige Unterteilung von Punkten auf dem Halbkreis
% Teil 1: x1,y1,z1 (erst mal nicht) % Teil 2: xCE;yCE;zCE % Teil 3: xHG, yHG,zHG % Teil 4: xEG, yEG,zEG
x = [xCE, xEG, xHG];
y = [yCE, yEG, yHG];
z = [zCE, zEG, zHG];
% n = Verfeinerung (Teiler von 100)
n = 1;
hold on
plot3([x(1:3*n:end); x2(1:n:end)], [y(1:3*n:end); y2(1:n:end)], [z(1:3*n:end); z2(1:n:end)], "k") hold off
Es kann sein, dass die Stücke in anderer Reihenfolge zusammengefügt oder mit
fliplr
gespiegelt werden müssen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
% Teil 1: x1,y1,z1 (erst mal nicht) % Teil 2: xCE;yCE;zCE % Teil 3: xHG, yHG,zHG % Teil 4: xEG, yEG,zEG
x = [xCE, xEG, xHG];
y = [yCE, yEG, yHG];
z = [zCE, zEG, zHG];
% n = Verfeinerung (Teiler von 100)
n = 1;
hold on
plot3([x(1:3*n:end); x2(1:n:end)], [y(1:3*n:end); y2(1:n:end)], [z(1:3*n:end); z2(1:n:end)], "k") hold off
nicht ganz. Hier werden die erzeugten Vektoren x, y, z mit x2, y2 und z2 verknüpft grafisch.
Jedoch, es werden nun der untere Halbkreis mit den Geraden verbunden, was falsch ist. Ich habe nun versucht, den unteren Halbkreis zu spiegeln (nach oben), sodass dieser von 0-PI verläuft, anstatt von PI bis 2xPI. Aber, dabei werden leider die Streckenteile falsch verbunden, siehe Anhang. Ansonsten passt es mal.
Jetzt müssen die restlichen beiden Halbkreise noch verbunden werden und das war's dann schon.
Jedoch, es werden nun der untere Halbkreis mit den Geraden verbunden, was falsch ist.
Dein Code enthielt ja nur den unteren Halbkreis. Oder ist an der Verbindung etwas falsch? Wenn ja, was?
Zitat:
Ich habe nun versucht, den unteren Halbkreis zu spiegeln (nach oben), sodass dieser von 0-PI verläuft, anstatt von PI bis 2xPI. Aber, dabei werden leider die Streckenteile falsch verbunden
Bitte poste deinen aktuellen Code. Durch Variieren der Reihenfolge oder Anwendung von fliplr auf Teile des Vektors sollte sich das Problem beheben lassen. Das sollte für dich einfacher sein als für mich, da du weißt, wie die Verbindung "richtig" sein muss.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Hallo,
Bitte poste deinen aktuellen Code. Durch Variieren der Reihenfolge oder Anwendung von fliplr auf Teile des Vektors sollte sich das Problem beheben lassen. Das sollte für dich einfacher sein als für mich, da du weißt, wie die Verbindung "richtig" sein muss.
Grüße,
Harald
Vorneweg, ich hab's durch viel Herumprobieren geschafft. Ergebnis siehe Grafik im Anhang.
Ich hätte noch ein paar Fragen zur Grafik/Darstellung:
kann ich diese Farben der Flächen ändern? Wie?
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Einstellungen und Berechtigungen
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.