matlab练习程序(射线法判断点与多边形关系)

依然是计算几何。

射线法判断点与多边形关系原理如下:

从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内。

原理虽是这样,有些细节还是要注意一下,比如射线过多边形顶点或射线与多边形其中一边重合等情况还需特别判断。

这里就不特别判断了,因为我只是熟悉原理,并不是实际运用。

好吧,我实际是太懒了,不想判断了。

结果如下:

结果图和线性分类器的组合有几分相似。

matlab代码如下:

clear all;close all;clc;

polyn=20;
poly=rand(polyn,2);
poly=createSimplyPoly(poly);  %创建简单多边形

ployn=polyn+1;                %连线方便,把第一个点添加到最后一个点后面
poly(polyn,:)=poly(1,:);

pn=500;
p=rand(pn,2);

hold on;
for i=1:pn

    flag=0;
    for j=2:polyn
        x1=poly(j-1,1);         %多边形前后两个点
        y1=poly(j-1,2);
        x2=poly(j,1);
        y2=poly(j,2);

        k=(y1-y2)/(x1-x2);      %多边形一条边直线
        b=y1-k*x1;
        x=p(i,1);               %过当前点直线和多边形交点
        y=k*x+b;          

        if min([x1 x2])<=x && x<=max([x1 x2]) && ...        %点同时在射线和多边形边上
           min([y1 y2])<=y && y<=max([y1 y2]) &&  y>=p(i,2)
               flag=flag+1;
        end
    end

    if mod(flag,2)==0               %偶数则在外部
        plot(p(i,1),p(i,2),‘r.‘);
    else                            %奇数则在内部
        plot(p(i,1),p(i,2),‘g.‘);
    end
end

plot(poly(:,1),poly(:,2));

其中createSimplyPoly函数在这里可以找到。

时间: 2024-08-02 11:01:24

matlab练习程序(射线法判断点与多边形关系)的相关文章

【模板】计几 射线法判断点是否在简单多边形内

1 // 2 //线段交点个数 3 int SegCross(Segment a,Segment b){ 4 double x1 = a.s.cross(a.e,b.s); 5 double x2 = a.s.cross(a.e,b.e); 6 double x3 = b.s.cross(b.e,a.s); 7 double x4 = b.s.cross(b.e,a.e); 8 if( b.e.OnLine(a.s,a.e) && b.s.OnSeg(a.s,a.e) || 9 b.s.O

hlg1306再遇攻击--射线法判断点是否在多边形内部

再遇攻击 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 313(40 users) Total Accepted: 91(32 users) Rating:  Special Judge: No Description Dota中英雄技能攻击会有一个范围,现在释放一个技能给出他的攻击范围和目标英雄的位置,问是否能攻击到.攻击范围保证是一个多边型. Input 有多组测试数据 第一行输入1个整数n, 期中n代表攻击范围是给出的n个点

判断点与多边形关系

以前上学就学过,现在工作又遇到了,拿出来复习一下(看的很老的博客讲的都比较细了,不知道最近又有没有新方法) 引射线法:从被判断的点发射一条射线,与多边形有奇数个交点则在多边形内 面积和法:从多边形一顶点出发,计算被判断的点和相邻两点组成的三角形的面积和(可用1/2*向量叉乘求),面积和与多边形面积相等则在多边形内 夹角和法:从多边形一顶点出发,计算被判断的点和多边形相邻两顶点的夹角和(可用向量点积推出的夹角公式求),夹角和为360则在多边形内部 遮罩法:生成多边形的位图(多边形内部区域置为指定的

LightOj1190 - Sleepwalking(判断点与多边形的位置关系--射线法模板)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1190 题意:给你一个多边形含有n个点:然后又m个查询,每次判断点(x, y)是否在多边形的内部; 射线法判断即可适用于任何(凸或凹)多边形;时间复杂度为O(n); 判断一个点是在多边形内部,边上还是在外部,时间复杂度为O(n):射线法可以正确用于凹多边形: 射线法是使用最广泛的算法,这是由于相比较其他算法而言,它不但可以正确使用在凹多边形上,而且不需要考虑精度误差问题.该算法思想是从

Cupid&#39;s Arrow---hdu1756(判断点与多边形的位置关系 模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1756 题意:中文题,套模板即可: /* 射线法:判断一个点是在多边形内部,边上还是在外部,时间复杂度为O(n): 射线法可以正确用于凹多边形: 射线法是使用最广泛的算法,这是由于相比较其他算法而言,它不但可以正 确使用在凹多边形上,而且不需要考虑精度误差问题.该算法思想是从点出 发向右水平做一条射线,计算该射线与多边形的边的相交点个数,当点不在 多边形边上时,如果是奇数,那么点就一定在多边形内部,否

用射线法实现判断点是否在多边形内部

最近工作中遇到了这个问题,检索之后发现这种实现方式挺有意思的,无论是凸多边形还是凹多边形都可以判断. 射线法是用被测点向任意方向(通常为了好算,使其射向右侧)做一条射线,判断射线与多边形的交点.如果交点的数量为奇数,则被测点在多边形内:如果交点的数量为偶数,则被测点在多边形以外. 期间,有些特殊情况需要判断,比如: 1. 射线刚好经过凸多边形两条相邻边的交点上的情况会导致重复判断: 2.射线和多边形的边重合的情况. 先上js代码. function isDotInPolygon(point, p

枚举法判断某天是否为2015年节假日或周末

枚举法判断某天是否为2015年节假日或周末 1.节假日枚举类 /** *功能说明:节假日枚举类 * *创建人:Gansuper * *创建时间:2015-2-6 上午10:32:17 * *修改人 修改时间 修改描述 * */ public enum HolidayEnum { HOLIDAY(new String[]{"2015-01-01","2015-01-02","2015-01-03", "2015-02-18",&

matlab练习程序(生成黑白网格)

提供了两种生成方法,一个是自己编程实现,比较灵活:另一个是调用系统的checkerboard函数,似乎只能生成8*8网格. 至于用途,也许可以用来下国际象棋. 自己函数生成: 系统函数生成: 代码如下: clear all;close all;clc h=256; w=256; n=8; img=zeros(h,w); flag=1; for y=1:h for x=1:w if flag>0 img(y,x)=255; end if mod(x,int8(w/n))==0 flag=-flag

matlab练习程序(旋转、径向模糊)

还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 1.求当前处理点和图像中心点之间的距离r与角度ang; 2.通过对r的修改得到径向模糊. 3.通过对ang的修改得到旋转模糊. 一看代码就能全部明白,不仔细解释了. 原图如下: 处理后效果: matlab代码如下: clear all;close all;clc img=imread('lena.jpg'); [h w]=size(img); imshow(img) imgn=zeros(h,w); for y=