📄 myinregion.m
字号:
function flagCP=myInRegion(Px,Py,L)
% myInRegion(Px,Py,L)判断点P是否在多边形内
%
% Px,Py为要判断的点的坐标
% L为数组,存放了多边形所有的线段端点坐标 ,按列存一条线段,前两行为x坐标后两行为y坐标
%
% flagCP 是否在区域内的标记 0:不在区域内; 1:在区域内
length = size(L{1},1); % 线段条数数
crossN = 0; % 交点个数
% *** 判断1:线段不能组成一个多边形,返回不在区域内
if ( length < 3)
flagCP = 0;
return;
end
% *** 判断2:在最凸点之外则肯定不在多边形内
a = L{1}(1:2,1:length);
maxX = max(a(:)); % 取出多边形最大的x坐标
minX = min(a(:)); % 取出多边形最大的x坐标
b=L{1}(3:4,1:length);
maxY = max(b(:)); % 取出多边形最大的y坐标
minY = min(b(:)); % 取出多边形最大的y坐标
Mx = maxX; % 从PxPy做射线的最右端点
if (Px<minX) | (Px>maxX) | (Py<minY) | (Py>maxY)
flagCP = 0;
return;
end
% *** 判断3:对每条线段判断 1)点是否在该线段上;
% *** 判断4:对该点向右做射线判断 2)点是否在线段的右边上边或下边;3)判断是否相交
for li = 1:length
x1 = L{1}(1,li) ; x2 = L{1}(2,li);
y1 = L{1}(3,li) ; y2 = L{1}(4,li); y0=0; % 初始化线段上坐标为Px时的
% ** 1. 判断是否在线段边上
if x1==x2 & Px==x1 % 1)如果是垂直线段:则判断x坐标是否在垂线上
if (Py>y1 & Py>y2) | ((Py<y1 & Py<y2)) % 判断是否在垂直线段上
continue; % 不在垂直线段上,跳出本次循环,判断下一条线段
else
flagCP=1; % 在垂直线段上, 返回在内
return;
end
end
if x1~= x2
if y1==y2 % 2) 判断是否是水平线段
if (Px>x1 & Px>x2) | (Px<x1 & Px<x2)
continue; % 不在水平线段上,跳出本次循环,判断下一条线段
else
flagCP=1; % 在水平线段上,返回在内
return;
end
end
k=(y1-y2)/(x1-x2); b=y1-k*x2; % 3) 不是垂直线段,也不是水平,求出线段的直线方程
y0=k*Px+b;
if y0==Py
flagCP=1; % 在线段边上,返回在内
return;
end
end
% ** 2.判断交点个数 (包括端点的判断情况)
flagC = 0; % 初始化相交标记
if ( Px>x1 & Px>x2) | (Py>y1 & Py>y2) | ( Py<y1 & Py<y2 ) % 判断如果点PxPy在线段的右边,或者上边,或者下边肯定无交点;
flagC = 0;
else
flagC = myCrossL(Px,Mx,Py,Py,x1,x2,y1,y2); % 判断线段是否相交 参数:线段1的x1x2坐标、y1y2坐标,线段2的x1x2坐标、y1y2坐标
if flagC==1 & (Py==y1 | Py==y2) % 如果有交点且交点为端点
if Py==y1 % 则判断端点为高端则把端点视为一个交点,为线段低端则视为没有交点
if y1<y2
flagC = 0;
end
elseif Py==y2
if y2<y1
flagC = 0;
end
end
end
end
crossN = crossN + flagC;
end
flagCP = mod(crossN,2); % 交点为奇数,则在多边形内; 交点为偶数则在多边形外
a=1+1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -