本文主要实现简单块体、球体模型和界面位置变化的显示
生成效果如图
代码
clc;
clear;
%%绘制模型位置示意图
%研究区范围 横、纵、深度方向范围
x_min = -15;
x_max = 15;
y_min = -15;
y_max = 15;
z_min = -5;
z_max = 5;
%模型参数设置
%———————————界面模型———————————
%%*********************界面类型1**********************
%同一水平高度界面(Z值一致)
surface_x_min = -15; %界面的左边界位置
surface_x_max = 0; %界面的右边界位置
dx = 1; %横向生成界面数据间隔
surface_y_min = -15; %界面的下边界位置
surface_y_max = 15; %界面的上边界位置
dy = 1; %纵向生成界面数据间隔
depth = 0; %界面深度位置
% [X,Y] = meshgrid(surface_x_min:dx:surface_x_max,surface_y_min:dy:surface_y_max);
for i = 1:((surface_x_max-surface_x_min)/dx)+1
for j = 1:((surface_y_max-surface_y_min)/dy)+1
X(i,j) = surface_x_min + dx*(i-1);
Y(i,j) = surface_y_min + dy*(j-1);
Z(i,j) = depth;
C(i,j) = 1; %界面数值可调整
end
end
surf(X,Y,Z,C);
%%*********************界面类型2**********************
hold on
%横向垂直界面(X值一致)
position_X = 0; % 【界面在X轴的位置】
surface_y_min = -15; %界面的下边界位置
surface_y_max = 15; %界面的上边界位置
dy = 1; %纵向生成界面数据间隔
surface_z_min = -5; %界面的深度下边界位置
surface_z_max = 0; %界面的深度上边界位置
dz = 1; %横向生成界面数据间隔
for i = 1:((surface_z_max-surface_z_min)/dz)+1
for j = 1:((surface_y_max-surface_y_min)/dy)+1
X1(i,j) = position_X;
Y1(i,j) = surface_y_min + dy*(j-1);
Z1(i,j) = surface_z_min + dz*(i-1);
C1(i,j) = 1;
end
end
surf(X1,Y1,Z1,C1);
%%*********************界面类型3**********************
hold on
%纵向垂直界面(Y值一致)
surface_x_min = -15; %界面的左边界位置
surface_x_max = 15; %界面的右边界位置
dx = 1; %横向生成界面数据间隔
position_Y = 0; % 【界面在Y轴的位置】
surface_z_min = -5; %界面的深度下边界位置
surface_z_max = 0; %界面的深度上边界位置
dz = 1; %横向生成界面数据间隔
for i = 1:((surface_z_max-surface_z_min)/dz)+1
for j = 1:((surface_x_max-surface_x_min)/dx)+1
X2(i,j) = surface_x_min + dx*(j-1);
Y2(i,j) = position_Y;
Z2(i,j) = surface_z_min + dz*(i-1);
C2(i,j) = 1;
end
end
surf(X2,Y2,Z2,C2);
%———————————块体模型———————————
%%*********************模型1**********************
p1=[0 0 0]; %%%%%%%模型【左下顶点】位置
cube_x=1; %模型块体横向宽度
cube_y=1; %模型块体纵向宽度
cube_z=1; %模型块体深度方向厚度
[x1,y1,z1] = plotcube( p1, cube_x, cube_y, cube_z );
patch(x1,y1,z1,'red'); % 'red'可根据情况更改颜色
%%*********************模型2**********************
hold on
p2=[1 1 1]; %模型【左下顶点】位置
cube_x=2; %模型块体横向宽度
cube_y=2; %模型块体纵向宽度
cube_z=1; %模型块体深度方向厚度
[x2,y2,z2] = plotcube( p2, cube_x, cube_y, cube_z );
patch(x2,y2,z2,'blue');
%%*********************模型3**********************
hold on
p3=[2 2 2]; %模型【左下顶点】位置
cube_x=3; %模型块体横向宽度
cube_y=3; %模型块体纵向宽度
cube_z=1; %模型块体深度方向厚度
[x3,y3,z3] = plotcube( p3, cube_x, cube_y, cube_z );
patch(x3,y3,z3,'black');
%一起画可以用这个
% x=[x1 x2 x3];
% y=[y1 y2 y3];
% z=[z1 z2 z3];
% patch(x,y,z,'red');
%———————————球体模型———————————
%%*********************模型1**********************
radiu = 2; %球体半径
x1 = 5; %球体中心点X坐标
y1 = 5; %球体中心点Y坐标
z1 = 5; %球体中心点Z坐标
[x,y,z] = plotspheroid(radiu, x1, y1, z1); %生成球体数据
% 绘制球体
c = ones(size(x)); %生成 M×N 的全 1 矩阵,用于控制球体颜色
surf(x, y, z, c);
view(3);
hold on
axis([x_min x_max y_min y_max z_min z_max]);
xlabel('X');
ylabel('Y');
zlabel('Z');
plotcube函数引自
绘制立方体的函数
function [x,y,z] = plotcube( p1, cube_x, cube_y, cube_z )
%% p1: 立方体左下角顶点坐标
%% cube_x, cube_y, cube_z 是立方体三个方向边长
v = zeros(8,3);
v(1,:)=p1;
v(2,:)=p1+[0 0 cube_z];
v(3,:)=p1+[0 cube_y 0];
v(4,:)=p1+[0 cube_y cube_z];
v(5,:)=p1+[cube_x 0 0];
v(6,:)=p1+[cube_x 0 cube_z];
v(7,:)=p1+[cube_x cube_y 0];
v(8,:)=p1+[cube_x cube_y cube_z];
x=[v(1,1) v(1,1) v(6,1) v(8,1) v(2,1) v(1,1);
v(2,1) v(2,1) v(5,1) v(7,1) v(4,1) v(3,1);
v(4,1) v(6,1) v(7,1) v(3,1) v(8,1) v(7,1);
v(3,1) v(5,1) v(8,1) v(4,1) v(6,1) v(5,1)];
y=[v(1,2) v(1,2) v(6,2) v(8,2) v(2,2) v(1,2);
v(2,2) v(2,2) v(5,2) v(7,2) v(4,2) v(3,2);
v(4,2) v(6,2) v(7,2) v(3,2) v(8,2) v(7,2);
v(3,2) v(5,2) v(8,2) v(4,2) v(6,2) v(5,2)];
z=[v(1,3) v(1,3) v(6,3) v(8,3) v(2,3) v(1,3);
v(2,3) v(2,3) v(5,3) v(7,3) v(4,3) v(3,3);
v(4,3) v(6,3) v(7,3) v(3,3) v(8,3) v(7,3);
v(3,3) v(5,3) v(8,3) v(4,3) v(6,3) v(5,3)];
end
plotspheroid函数
绘制球体的函数
function [x,y,z] = plotspheroid(radiu, x1, y1, z1)
% 定义球体的半径和中心点坐标
radius = radiu;
center = [x1, y1, z1];
% 生成球体的网格数据
[x, y, z] = sphere(50);
% 缩放和平移网格数据以匹配半径和中心点
x = radius * x + center(1);
y = radius * y + center(2);
z = radius * z + center(3);
end