生成多边形
随机生成若干个点,就可以生成多边形。
严格来说,是要判断产生的点是否共线的,但是这样概率太低,所以我就没有判断。生成的点不能直接连起来,因为点的顺序有可能是错乱的,所以首先要进行顺序判断,方法是计算角度。找到平面内某一点,计算多边形每一个点到这个点连线和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函数就可以了,这里就不赘述了。
这个是我自己昨天接单子的时候遇到的实际问题,搜索了挺久也没有解决方法,自己想了一下,写出来了,于是就在这里分享一下。