采用面积法判断指定点是否在凸多边形内部
以五边形为例,点Q为任意给定点,当点Q位于多边形之外时,点Q与所有顶点构成的三角形面积之和大于多边形的面积。
当点Q在多边形内部时,可以发现点Q与多边形所有顶点构成的三角形面积之和等于多边形面积之和。
其他多边形的判断方法相同。
不管是几边形,将面积计算转化为三角形面积的计算会大大简化问题,calc_triangle函数即是计算三角形面积,具体公式推导原理采用梯形面积相加减,如下图所示。
function S=calc_triangle(Q,W1,W2)%计算三角形面积——利用构成的梯形面积相加减计算三角形面积
S=0.5*abs(Q.x*W1.y+W1.x*W2.y+W2.x*Q.y-Q.x*W2.y-W1.x*Q.y-W2.x*W1.y);
end
利用三角形分割计算指定点与多边形顶点构成的三角形面积
function in_out=isinPolygon(Q,varargin)%判断一个点是否在凸多边形之外——利用目标点与多边形各顶点构成的面积与多边形面积进行计算判断
%输入:凸多边形的顶点坐标,目标点的坐标 最大边数为五边形 输入的多边形顶点按逆时针或顺时针顺序输入
%输出:判断结果
switch nargin
case 4
S1=calc_triangle(Q,varargin{1},varargin{2});
S2=calc_triangle(Q,varargin{2},varargin{3});
S3=calc_triangle(Q,varargin{1},varargin{3});
S = calc_triangle(varargin{1},varargin{2},varargin{3});
if S==S1+S2+S3
in_out=true;
else
in_out=false;
end
case 5
S1=calc_triangle(Q,varargin{1},varargin{2});
S2=calc_triangle(Q,varargin{2},varargin{3});
S3=calc_triangle(Q,varargin{3},varargin{4});
S4=calc_triangle(Q,varargin{1},varargin{4});
S = calc_triangle(varargin{1},varargin{2},varargin{3})+calc_triangle(varargin{1},varargin{3},varargin{4});
if S==S1+S2+S3+S4
in_out=true;
else
in_out=false;
end
case 6
S1=calc_triangle(Q,varargin{1},varargin{2});
S2=calc_triangle(Q,varargin{2},varargin{3});
S3=calc_triangle(Q,varargin{3},varargin{4});
S4=calc_triangle(Q,varargin{4},varargin{5});
S5=calc_triangle(Q,varargin{1},varargin{5});
S = calc_triangle(varargin{1},varargin{2},varargin{3})+calc_triangle(varargin{1},varargin{3},varargin{4})+calc_triangle(varargin{1},varargin{4},varargin{5});
if S==S1+S2+S3+S4+S5
in_out=true;
else
in_out=false;
end
otherwise
disp('error');
end