matlab实现管道铺设四阶段的三维立体完成透视图

本文希望将某处管道铺设的四个阶段的完成情况通过hold on完成三维叠加,生成工程的三维完成透视图。效果类似于这样子:
在这里插入图片描述管道铺设四阶段的三维立体完成透视图:
1.使用hold on命令,完成图形的三维叠加尝试过程;
2.完成各个阶段新修建管线的高亮和放大显示,并标注
阶段名称和图标各种信息。

一.mian函数

%% 使用邻接矩阵和hold on命令实现某处管道施工中的四阶段实现
adress1=[300,650;400,720;100,470;300,500;400,470;500,600;700,470;150,300;350,260;500,350;750,300;200,100;500,200;600,150]
% plot(adress1(:,1),adress1(:,2),'b*-','linewidth',3);
%1-6的管线铺设图的邻接矩阵,邻接矩阵的书写,遵循行优先原则来做填充即可。
adj_m1=[0,0,0,1,0,0,0,0,0,0,0,0,0,0; 
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,1,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,1,0,0,1,0,0,0,0,0;
            0,0,0,0,0,0,1,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            ];
%7-9的管线铺设图
adj_m2=[0,0,0,1,0,0,0,0,0,0,0,0,0,0; 
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,1,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,1,0,0,1,0,0,0,0,0;
            0,0,0,0,0,0,1,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,1,0,0,1,0,0;
            0,0,0,0,0,0,0,0,0,1,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            ];
%10-11的管线铺设图
adj_m3=[0,0,0,1,0,0,0,0,0,0,0,0,0,0; 
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,1,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,1,0,0,1,0,0,0,0,0;
            0,0,0,0,0,0,1,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,1,0,0,1,0,0;
            0,0,0,0,0,0,0,0,0,1,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,1,0,1,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            ];
%12-14的管线铺设图
adj_m4=[0,0,0,1,0,0,0,0,0,0,0,0,0,0; 
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,1,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,1,0,0,1,0,0,0,0,0;
            0,0,0,0,0,0,1,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,1,0,0,1,0,0;
            0,0,0,0,0,0,0,0,0,1,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,1,0,1,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,1;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            ];
% 画图,直线段之间的连接, 通过邻接矩阵+plot()来完成。
% 三维空间中的叠加:邻接矩阵从不完善到完善的过程。
% plot3(node_AP(:,1),node_AP(:,2),node_AP(:,3),'b*-','linewidth',3);
% node_AP是多行三列的坐标值。

%{
figure;
for k=1:4  %图层数目
     hold on;
     adress1(:,3)=100*(k-1);
     deplot1(adress1,adj_m);
end
%}
duixiang=[adj_m1;adj_m2;adj_m3;adj_m4];
color1={'b*-','r*-','g*-','k*-'}
figure;
for k=1:4  %图层数目
     hold on;
     adress1(:,3)=100*(k-1);
     deplot1(adress1,duixiang,k,color1);
end
title('某处管道施工四阶段完成施工图')
xlabel('横坐标/km')
ylabel('纵坐标/km')
zlabel('z坐标/km')

二.function deplot1(adress1,duixiang,k,color1)代码:

function deplot1(adress1,duixiang,k,color1)
    adj_m=duixiang((k-1)*14+1:14*k,:); %将对应的矩阵截取出来
    [m,n]=size(adj_m);
     for i=1:m
        for j=1:n
             if adj_m(i,j)==1
                zhou=[]
                zhou=[zhou;adress1(i,:);adress1(j,:)];
                hold on;
                %plot3(zhou(:,1),zhou(:,2),zhou(:,3),'b*-','linewidth',3);
                plot3(zhou(:,1),zhou(:,2),zhou(:,3),color1{k},'linewidth',3);
            end
        end
    end
end

三.实现完成效果:
在这里插入图片描述
四.做代码改进
改进代码主要功能:突出当前阶段的施工管道,并标注好阶段名称。
1.mian.m

%% 使用邻接矩阵和hold on命令实现某处管道施工中的四阶段实现
adress1=[300,650;400,720;100,470;300,500;400,470;500,600;700,470;150,300;350,260;500,350;750,300;200,100;500,200;600,150]
% plot(adress1(:,1),adress1(:,2),'b*-','linewidth',3);
%1-6的管线铺设图
adj_m1=[0,0,0,1,0,0,0,0,0,0,0,0,0,0; 
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,1,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,1,0,0,1,0,0,0,0,0;
            0,0,0,0,0,0,1,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            ];
%7-9的管线铺设图
adj_m2=[0,0,0,1,0,0,0,0,0,0,0,0,0,0; 
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,1,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,1,0,0,1,0,0,0,0,0;
            0,0,0,0,0,0,1,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,1,0,0,1,0,0;
            0,0,0,0,0,0,0,0,0,1,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            ];
%10-11的管线铺设图
adj_m3=[0,0,0,1,0,0,0,0,0,0,0,0,0,0; 
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,1,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,1,0,0,1,0,0,0,0,0;
            0,0,0,0,0,0,1,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,1,0,0,1,0,0;
            0,0,0,0,0,0,0,0,0,1,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,1,0,1,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            ];
%12-14的管线铺设图
adj_m4=[0,0,0,1,0,0,0,0,0,0,0,0,0,0; 
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,1,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,1,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,1,0,0,1,0,0,0,0,0;
            0,0,0,0,0,0,1,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,1,0,0,1,0,0;
            0,0,0,0,0,0,0,0,0,1,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,1,0,1,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0,0,0,0,0,0,1;
            0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            ];
% 画图,直线段之间的连接, 通过邻接矩阵+plot()来完成。
% 三维空间中的叠加:邻接矩阵从不完善到完善的过程。
% plot3(node_AP(:,1),node_AP(:,2),node_AP(:,3),'b*-','linewidth',3);
% node_AP是多行三列的坐标值。

%{
figure;
for k=1:4  %图层数目
     hold on;
     adress1(:,3)=100*(k-1);
     deplot1(adress1,adj_m);
end
%}
duixiang=[adj_m1;adj_m2;adj_m3;adj_m4];
color1={'b*-','c*-','g*-','k*-'}
jiedian_num=[1,6;7,9;10,11;12,14] %阶段施工的线路编号区间
phrase_time={'阶段1','阶段2','阶段3','阶段4'}
figure;
for k=1:4  %图层数目
     hold on;
     adress1(:,3)=100*(k-1)+50;
     deplot1(adress1,duixiang,k,color1,jiedian_num);
     text(55,553,100*(k-1)+70,phrase_time{k});
end
title('某处管道施工四阶段完成施工图')
xlabel('横坐标/km')
ylabel('纵坐标/km')
zlabel('z坐标/km')
view(-45,45)

2.function deplot1(adress1,duixiang,k,color1)代码:

function deplot1(adress1,duixiang,k,color1,jiedian_num)
    adj_m=duixiang((k-1)*14+1:14*k,:); %将对应的矩阵截取出来
    % jiedian_num(k,:); %两个数
    [m,n]=size(adj_m);
     for i=1:m
        for j=1:n
            %不是当前修建的
             if (adj_m(i,j)==1) 
                  if  (i>( jiedian_num(k,1)-1))&&(i<( jiedian_num(k,2)+1))
                        zhou=[]
                        zhou=[zhou;adress1(i,:);adress1(j,:)];
                        hold on;
                        %plot3(zhou(:,1),zhou(:,2),zhou(:,3),'b*-','linewidth',3);
                        plot3(zhou(:,1),zhou(:,2),zhou(:,3),'r*-','linewidth',3);
                  %当前修建的
                  else
                        zhou=[]
                        zhou=[zhou;adress1(i,:);adress1(j,:)];
                        hold on;
                        %plot3(zhou(:,1),zhou(:,2),zhou(:,3),'b*-','linewidth',3);
                        plot3(zhou(:,1),zhou(:,2),zhou(:,3),color1{k},'linewidth',3);
                  end
            end
        end
    end
end

3.效果
红色部分是各个阶段新修建的管道路径编号。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/jp_zhou256/article/details/87892703