本人最近把毕设中管网部分做完了,正在忙水厂设计部分,趁着闲暇摸鱼时间琢磨起如何用matlab把给水管网的管线通过代码连接,当然,本代码只适用于想对管线进行模拟计算或者为了更好地展现的情况,若想真正实现一键生成节点和管段管线,可以考虑自学鸿业,据导师所言,其可以实现自动绘图的功能。
效果图
代码
clc;clear; warning off;
Data=readtable("test.xlsx");
%数据存取
Node=Data{:,1};
X=Data{:,2};
Y=Data{:,3};
Pipe=Data{:,4:6};
%归一化数据
x0=X-min(X);
y0=Y-min(Y);
%画坐标
figure(1);
set(gcf,'unit','centimeters','position',[1 1 32 20]);
hold on;
plot(x0,y0,'.r');
%画直线
for i=1:size(Pipe,1)
tmp=string(Data{i,5:6});
ibegin=find(string(Node)==tmp(1));
iend=find(string(Node)==tmp(2));
plot([x0(ibegin),x0(iend)],[y0(ibegin),y0(iend)],'k-');
end
%美化及保存
axis off;hold off;
saveas(gcf,'管线图','png');
代码解释
1、readtable函数用来读取xlsx数据,本案例中excel文件内容如下:
以上数据是通过EPANET软件导出并加以整理后得到的。
2、数据存取就是matlab特殊的语法,就是把第几列存放到变量当中;归一化是为了方便作图,画出来的图与坐标原点(0,0)相差不远。
3、画坐标里,fugure是设置画窗,set函数是设置画布,hold on是为了能同时画节点和管线以防覆盖,plot就是正式画点。
4、画直线的部分就是代码核心:
① tmp就是读取第五列和第六列数据,并将其对于的下标暂时存取在ibegin,iend里;
tmp=string(Data{i,5:6});
ibegin=find(string(Node)==tmp(1));
iend=find(string(Node)==tmp(2));
② 直接连线!
plot([x0(ibegin),x0(iend)],[y0(ibegin),y0(iend)],'k-');
结语
这只是本人摸鱼时想出来的,没有进行过多的修饰和美化,仅在此留作记录,然后还可以和contour()函数联用,有奇效。