Verfasst am: 19.08.2008, 18:32
Titel: 3d Plot von kleinen Cuben
Hallo zusammen,
ich habe ein Problem bei der Umsetzung folgender Darstellung.
Ich habe eine Liste mit 50 Einträgen (jeweils x y und z Wert der Raumpunkte).
Diese 50 Punkte entsprechen den Mittelpunkten von kleinen Würfeln der Kantenlänge 21. Diese Würfel möchte ich in einem Raum mit überlappungen anzeigen. Vielleicht ist es möglich Überlappungen mit einer Art Farbskala intensiver anzuzeigen?
for f=1:list_size
x = this_CoordList(f,1);
y = this_CoordList(f,2);
z = this_CoordList(f,3);
k = x-floor(this_EdgeLength/2):x+floor(this_EdgeLength/2);
l = y-floor(this_EdgeLength/2):y+floor(this_EdgeLength/2);
m = z-floor(this_EdgeLength/2):z+floor(this_EdgeLength/2);
das ist eine nette Aufgabe. Ich habe die Würfel mit patch erzeugt. Dann kann man die Flächen über die Eigenschaft FaceAlpha halbtransparent machen. Überlappungen sind durch die Kanten und die intensivere Farbe gut zu sehen.
Die Liste der Ecken (vertices) und Flächen (faces) hab ich aus der Matlab-Hilfe ("Multifaceted Patches"). Wenn Dir die Farben der Flächen zu bunt sind, kannst Du statt 'FaceVertexCData',hsv(6) mal 'FaceVertexCData',ones(6,1)*[0,1,1] ausprobieren.
% Zeichnen der Mittelpunkte plot3(x,y,z,'.');
hold on
% Ecken der Würfel, siehe Hilfe zu patch und Multifaceted Patches
this_EdgeLength = 21;
d = this_EdgeLength/2;
vertices(:,1,:)=[x-d;x+d;x+d;x-d;x-d;x+d;x+d;x-d];
vertices(:,2,:)=[y-d;y-d;y+d;y+d;y-d;y-d;y+d;y+d];
vertices(:,3,:)=[z-d;z-d;z-d;z-d;z+d;z+d;z+d;z+d];
% Flächen der Würfel, siehe Hilfe zu patch und Multifaceted Patches
faces = [1265;2376;3487;4158;1234;5678];
% Zeichnen der Würfel for k = 1:length(x) patch('Vertices',vertices(:,:,k),'Faces',faces,'FaceAlpha',0.5,...
'FaceColor','flat','FaceVertexCData',hsv(6)) end axis equal
hold off
danke für deine schnelle Hilfe! Die Patch-Funktikon ist ja wirklich super und erspart viel Arbeit...
Ich habe noch einmal eine Frage zur zufälligen Matrixerzeugung.
Wie kann ich eine Matrix mit z.B. (100x3) Einträgen ereugen, deren Werte in Spalte 1 zwischen 50 und 150 in Spalte 2 zwischen 30 und 200 usw. variieren?
Habe das bisher immer total umständlich mit
rand(100,3) *obere Grenze
gemacht und dann die zu kleinen WErte mit einer if-Abfrage rausgenommen, aber das geht doch bestimmt auch einfacher oder?
hatte mich nur gefragt ob matlab eine art "range"-Funktion für den rand- Befehl integriert hat...
so gehts natürlich auch ein wenig einfacher.
Siptar
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 14.05.2014, 20:07
Titel: Würfel in kleinere Würfel unterteilen und darstellen
Hallo, ich möchte mal an diesen Thread anschließen. Und zwar habe ich ein relativ ähnliches Problem wie oben.
Und zwar möchte ich z.B einen 10x10x10 Würfel in lauter kleine Würfel (z.B 1x1x1) unterteilen und diese dann plotten.
Mit Folgendem Code erhalte ich bloß 5 kleine Würfel deren Mittelpunkte in x,y und z verschoben sind.
Code:
x=[1:2:9];
y=[1:2:9];
z=[-1:-2:-9];
this_EdgeLength = 2;
d = this_EdgeLength/2;
vertices(:,1,:)=[x-d;x+d;x+d;x-d;x-d;x+d;x+d;x-d];
vertices(:,2,:)=[y-d;y-d;y+d;y+d;y-d;y-d;y+d;y+d];
vertices(:,3,:)=[z-d;z-d;z-d;z-d;z+d;z+d;z+d;z+d];
end % Flächen der Würfel, siehe Hilfe zu patch und Multifaceted Patches
faces = [1265;2376;3487;4158;1234;5678];
% Zeichnen der Würfel for k = 1:length(x) patch('Vertices',vertices(:,:,k),'Faces',faces,'FaceAlpha',0.5,...
'FaceColor','flat','FaceVertexCData',hsv(6)) end axis equal
grid on
hold off
Wenn ich nun die Mittelpunktskoordinaten der einzelnen Würfel rechnen möchte bräuchte ich ja theoretisch 3 forschleifen über x(i),y(j), z(j)
z.B:
Code:
for i=1:length(z) for j=1:length(y) for k=1:length(x)
vertices(:,1,:)=[x(k)-d;x(k)+d;x(k)+d;x(k)-d;x(k)-d;x(k)+d;x(k)+d;x(k)-d];
vertices(:,2,:)=[y(j)-d;y(j)-d;y(j)+d;y(j)+d;y(j)-d;y(j)-d;y(j)+d;y(j)+d];
vertives(:,3,:)=[z(i)-d;z(i)-d;z(i)-d;z(i)-d;z(i)+d;z(i)+d;z(i)+d;z(i)+d] end end end
Das heißt also ich würde Koordinaten für alle Mittelpunkte der 1000 Würfel (bei diesem Beispiel) kleinen Würfel erhalten. Zuerst würde die Mittelpunktskoordinaten also immer um 1 in x Richtung verschoben werden. Danach dann +1 in y usw. bis alle 1000 Würfel abgearbeitet sind.
Allerdings ist der Code noch fehlerhaft, denn ich weiß nicht wie ich diese entstehenden Koordinaten speicher kann und dann im Anschluss darstellen kann.
Funktioniert das überhaupt noch mir Arrays dann?!
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.