判断指定点与凸多边形的位置关系

采用面积法判断指定点是否在凸多边形内部

以五边形为例,点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
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值