点在多边形内的判断(射线法)

刚进acm没几天,今天刷了zoj的1081题,是关于点在多边形内的判断的,在网上查了很多资料,最后觉得用“射线法”感觉是比较适合我的,所以在这里和大家分享一下。(我知道网上已经有很多人写了关于点在多边形内判断的博文,自己写这篇博文无疑是在各位大师面前班门弄斧,在这里只希望从一个新手的角度给其他和我差不多的新手分享一下感想,也许同样是新手会有很多共鸣。本篇若有哪些地方讲的不对或者不准确,欢迎大家指正微笑


射线法,顾名思义,就是用射线去判断点是否在多边形内。射线从哪来呢?

在这里先设要判断的点为p(x,y),多边形构成的点用一个 v[maxn](x,y)数组保存(其中maxn是该多边形的顶点数);

射线是从p(x,y)开始,水平向右(平行于 x 轴)引出,当然,这条射线只是虚拟的,想象出来就行了。射线引出来后有可能会穿过多边形的边,分两种情况:

1.引出来的射线没穿过多边形的边,那么p(x,y)必定是在多边形外的,若设该射线穿过多边形的边数为 tot,那么 tot = 0;

2.引出来的射线穿过了多边形的边,那么当穿过的边数为奇数时,p(x,y)在多边形内,为偶数时,就穿出多边形了,就在多边形外(在这里,若射线与多边形的某条边重合了,是不加 tot 的,当射线穿过的点是多边形的顶点(也就是两条边的交点)时,我们只加一次 tot )

这样,用射线法判断的大体思路就出来了,现在是怎么判断射线穿过了多边形的边,以及统计射线穿过的边数 tot;

首先我们想,射线是向右的,枚举多边形的每一条边,若边在p(x,y)的右边,而且p点的纵坐标 y 在这条边的纵坐标范围内(也就是 p.y 大于等于这条边纵坐标最小的点的 y,小于这条边纵坐标最大的点的 y)那么这条射线就会穿过该边,然后 tot++就行;

判断p点的纵坐标在一条边的纵坐标范围内很容易,这里不多说;

接着就是怎样判断一条边在一个点的右边。因为上一步已经判断过p点的纵坐标在这条边的纵坐标范围内了,那么这条边绝对不会平行 x轴,读者可以从上述红色字体部分找原因。既然这条边不是平行 x 轴,那么必定是竖的或斜的!这样,我们就可以用利用向量的叉积判断了!首先设两个向量 v1,v2;

就按照如图的方向给v1和v2赋值。(右边的竖线是多边形的一条边,p点在左边标注的地方,图画的有点挫,将就一下吧...)

若 v1和 v2的叉积大于零(即 v1× v2>0),那么p点就在这条边的左边。


好吧,我想说的就是这些了,具体还是要自己实践,用这个去试试 zoj 的1081题吧,理解了应该能过吧!




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值