matlab 判断网络是在多边形之内,之外还是边界上。papa的儿子

时间:2022-03-25 05:21:25

matlab 判断网络是在多边形之内,之外还是边界上。

别人问的一个问题,蛮好。

总结一下。

在matlab中,有一个inpolygon函数,可以判断点是否在多边形之内,

如果一个网格在多边形内,则它的四个顶点都在多边形内。
如果一个网格在多边形外,则它的四个顶点都在多边形外。
如果一个网格在多边形边上,则它的四个顶点有的在多边形内,有的在多边形外。
通过此条件,判断网格是否是in, out,bd.这个过程,可以通过find函数实现。

matlab 判断网络是在多边形之内,之外还是边界上。papa的儿子

clc
clf

%% main
np=10;
x=[0:np];
y=[0:np];

%
bound points
xv=[1.2 7.6 4.5 1.2];
yv=[4.7 2.8 7.8 4.7];


[X,Y]=meshgrid(x,y);

% which points are in the range
[ind]=inpolygon(X,Y,xv,yv);


% find the in, out, bd
flg_ind=double(ind);
tm=flg_ind(1:np,:)+flg_ind(2:(np+1),:);
tm2=tm(:,1:np)+tm(:,2:(np+1));

[ind_in_x,ind_in_y]=find(double(tm2==4));
[ind_out_x,ind_out_y]=find(double(tm2==0));
[ind_bd_x,ind_bd_y]=find(double(tm2>0) & double(tm2<4));



% for output z value
Z=zeros(size(X));
Z_in=ones(size(Z)); % in part
Z_in(~ind)=NaN;
Z_out=zeros(size(Z)); % out part
Z_out(ind)=NaN;

%% output results
%
plot grid
mesh(X,Y,zeros(size(X)),'edgecolor','k')
hold on
% plot in part
h_in=surf(X,Y,Z_in);
% alpha(h_in,0.7);
% plot out part
h_out=surf(X,Y,Z_out);
alpha(h_out,0.2);
% plot bd line
plot(xv,yv,'r','linewidth',2)
view(0,90)

% plot in points
plot(X(ind),Y(ind),'bo','MarkerFaceColor','b')
hidden off

% plot in, out, bd grid
plot3(x(ind_in_y)+0.5,y(ind_in_x)+0.5,2*ones(size(ind_in_x)),'gs','MarkerFaceColor','g')
plot(x(ind_out_y)+0.5,y(ind_out_x)+0.5,'yo','MarkerFaceColor','y')
plot(x(ind_bd_y)+0.5,y(ind_bd_x)+0.5,'ms','MarkerFaceColor','m')

axis equal
axis tight