multiple 3D plane plotting

12 visualizzazioni (ultimi 30 giorni)
BeeTiaw
BeeTiaw il 1 Apr 2024
Risposto: Adam Danz il 4 Ott 2024
Hi I have the following code to plot a 2D plane in 3D space.
the plane is describe by their dip angle and azimuth and the center point is at [x,y] = [0,0]
I intend to modify this code so that it can plot 3 planes in the same axis. However, the location for each plane will be varies depending on the x and y location.
planedip = 30;
planeazim = 120;
% Convert angles to radians
dip_angle_rad = deg2rad(planedip);
dip_azimuth_rad = deg2rad(360 - planeazim); % rotate from CCW to CW
% Define normal vector of plane
normal = [sin(dip_angle_rad)*cos(dip_azimuth_rad), sin(dip_angle_rad)*sin(dip_azimuth_rad), cos(dip_angle_rad)];
% Define two vectors in plane
v1 = [1, 0, (-normal(1)/normal(3))];
v2 = cross(normal, v1);
% Plot plane
x = linspace(-1,1,10);
y = linspace(-1,1,10);
[X,Y] = meshgrid(x,y);
Z = (-normal(1)*X - normal(2)*Y)/normal(3);
surf(X,Y,Z,'FaceColor',[0.5,0.5,0.5],'FaceAlpha',0.5,'EdgeColor','none');
% Add annotations
hold on
quiver3(0, 0, 0, normal(1), normal(2), normal(3));
projection = [normal(1), normal(2), 0];
quiver3(0, 0, 0, projection(1), projection(2), projection(3));
% Add dashed line
plot3([normal(1), projection(1)], [normal(2), projection(2)], [normal(3), projection(3)], '--k');
view(45,30);
axis equal
xlabel('x');
ylabel('y');
zlabel('z');

Risposta accettata

Matt J
Matt J il 1 Apr 2024
Modificato: Matt J il 1 Apr 2024
Using this FEX download,
planedip = 30;
planeazim = 120;
% Convert angles to radians
dip_angle_rad = deg2rad(planedip);
dip_azimuth_rad = deg2rad(360 - planeazim); % rotate from CCW to CW
% Define normal vector of plane
normal = [sin(dip_angle_rad)*cos(dip_azimuth_rad), sin(dip_angle_rad)*sin(dip_azimuth_rad), cos(dip_angle_rad)];
ezplane([normal,0],'FaceColor','r'); grid on; hold on
ezplane([normal,+1],'FaceColor','g');
ezplane([normal,-1],'FaceColor','b'); hold off; axis auto; view(35,10)
  8 Commenti
BeeTiaw
BeeTiaw il 1 Apr 2024
Hi, thanks! this is not what I am looking for based on the original code.
In the original code, the location Z is determined from the following lines in the code:
% Plot plane
x = linspace(-1,1,10);
y = linspace(-1,1,10);
[X,Y] = meshgrid(x,y);
Z = (-normal(1)*X - normal(2)*Y)/normal(3);
surf(X,Y,Z,'FaceColor',[0.5,0.5,0.5],'FaceAlpha',0.5,'EdgeColor','none');
whereas now, I want Z to be fix at 0.
Matt J
Matt J il 1 Apr 2024
Modificato: Matt J il 1 Apr 2024
You cannot have Z=0 everywhere and also have the plane oriented according to freely chosen planedip and planeazim. Those things contradict each other. If Z=0 everywhere, then the plane normal must be [0,0,1].

Accedi per commentare.

Più risposte (2)

Adam Danz
Adam Danz il 4 Ott 2024
Starting in R2024b, you can use the constantplane function to generate planes based on their vector normals. Using Matt J's demo, here's the constantplane version.
planedip = 30;
planeazim = 120;
% Convert angles to radians
dip_angle_rad = deg2rad(planedip);
dip_azimuth_rad = deg2rad(360 - planeazim); % rotate from CCW to CW
% Define normal vector of plane
normal = [sin(dip_angle_rad)*cos(dip_azimuth_rad), sin(dip_angle_rad)*sin(dip_azimuth_rad), cos(dip_angle_rad)]
normal = 1×3
-0.2500 -0.4330 0.8660
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
constantplane(normal,0,'FaceColor','r'); grid on; hold on
constantplane(normal,+1,'FaceColor','g');
constantplane(normal,-1,'FaceColor','b'); hold off; axis auto; view(35,10)
xlim([-6 6])
ylim([-6 6])
zlim([-6 6])

Catalytic
Catalytic il 1 Apr 2024
Modificato: Catalytic il 1 Apr 2024
planedip = [30, 60 90]';
planeazim = [120, 90, 270]';
center=[2,3,0;
6,8,0;
10 15,0];
dip_angle_rad = deg2rad(planedip);
dip_azimuth_rad = deg2rad(360 - planeazim);
% Define normal vector of plane
Normals = [sin(dip_angle_rad).*cos(dip_azimuth_rad),...
sin(dip_angle_rad).*sin(dip_azimuth_rad),...
cos(dip_angle_rad)];
box=[-1 -1; -1 +1; +1 +1; +1 -1];
colors=["m","b","g"];
for i=1:numel(planedip)
P=box*null(Normals(i,:))' + center(i,:);
patch(P(:,1), P(:,2), P(:,3),colors(i));
end; hold off
axis auto; view(-65,40); grid on; axis equal
xlabel X; ylabel Y; zlabel Z;

Tag

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by