Matlab生成多边形,并且判断多边形是否相交

生成多边形

随机生成若干个点,就可以生成多边形。

严格来说,是要判断产生的点是否共线的,但是这样概率太低,所以我就没有判断。生成的点不能直接连起来,因为点的顺序有可能是错乱的,所以首先要进行顺序判断,方法是计算角度。找到平面内某一点,计算多边形每一个点到这个点连线和x轴的夹角,对这个夹角进行排序,就可以得到点的顺序,把点依次连起来,就可以得到多边形。这里没有区分凹多边形和凸多边形。

%% 随机生成两个多边形
x1=rand(1,4);
y1=rand(1,4);
Px=[x1,x1(1)];
Py=[y1,y1(1)];
figure(1)
clf
ang=cart2pol((x1-mean(x1)),(y1-mean(y1)));
[sortang,sortindex]=sort(ang);
sx1=x1(sortindex);
sy1=y1(sortindex);
Sx1=[sx1,sx1(1)];
Sy1=[sy1,sy1(1)];
plot(Sx1,Sy1,'--')
hold on
x2=rand(1,4);
y2=rand(1,4);
ang=cart2pol((x2-mean(x2)),(y2-mean(y2)));
[sortang,sortindex]=sort(ang);
sx2=x2(sortindex);
sy2=y2(sortindex);
Sx2=[sx2,sx2(1)];
Sy2=[sy2,sy2(1)];
plot(Sx2,Sy2,'g-')

判断多边形是否相交

判断多边形是否相交,方法是判断是否存在相交的边。网上看到的方法,计算叉乘的只能用于判断直线是否相交,但不是适合判断线段。我想了好久,想到了也不是很简便的方法,就是求交点。对两条线段做插值,插值区间是两条线段取值范围的并集。matlab里面interp1函数对于样本点外的点,得到的值会是nan,这样插值后得到的相当于是一个分段函数,线段1得到分段函数的取值范围两个线段取值范围的并集,但是对于不包含在线段1本身的取值范围,得到的值使NAN。举例:

线段一端点:(2,3)和(3,4)

线段二端点:(1,4)和(2.5,3)

取值范围的并集是[1 3],插值后,代表线段1的函数,取值范围是[1,3],在x<2时,取值为nan,在x>2时,取值则为原来的线段上的值,这样就可以了。

function ifconter = findcounter(P1X,P1Y,P2X,P2Y)
    %% P1X,P1Y,P2X,P2Y分别是两个封闭图形的点
    ifconter=0;
    for i=1:length(P1X)-1
        for j=1:length(P2X)-1
            p1x=P1X(i:i+1)  ;
            p1y= P1Y(i:i+1)  ;
            p2x=P2X(j:j+1);
            p2y=  P2Y(j:j+1);
%             figure(2);
%             clf
%             plot(P1X(i:i+1),P1Y(i:i+1));hold on
%             plot(P2X(j:j+1),P2Y(j:j+1))
            AllX=linspace(min([p1x p2x]),max([p1x p2x]),100);    
            %% 插值
             Int1 = interp1(p1x,p1y,AllX);
             Int2 = interp1(p2x,p2y,AllX);
             intersec=Int1-Int2;
            if(max(intersec)*min(intersec)<0)
                ifconter=1;%有交点 返回1
            end
        end
    end
end

通过调用以上的函数,就可以判断两个多边形是否相交了。

代码没有对时候包含进行判断,想要判断也很简答,只要调用inpolygon函数就可以了,这里就不赘述了。

这个是我自己昨天接单子的时候遇到的实际问题,搜索了挺久也没有解决方法,自己想了一下,写出来了,于是就在这里分享一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值