判断矩形是否相交(包含,点相交,边相交)

矩形的相交问题也是一个常用的问题,最近碰到的有点多,连续碰到了三四题了,每次都要重新写,不如直接总结出来,直接写成一个板子,以后就能抄了;

目前只考虑没有角度的矩形相交

首先是矩形的相交问题:矩形的相交分为好几种相交:即

我们设两个矩形的点分别为:

第一个矩形A:ax1,ay1,ax2,ay2              第二个矩形B:bx1,by1,bx2,by2

方法一:

矩形相交的结果仍是矩形,因此构成相交矩形C的左下和右上就是:cx1,cy1,cx2,cy2;

cx1=max(ax1,bx1)         //左下x为最大的左下x集合

cy1=max(ay1,by1)         //左下y为最大的左下y集合

cx2=min(ax2,bx2)         //右上x为最小的右上x集合

cy2=min(ay2,by2)         //右上y为最小的右上y集合

如果两个矩形不相交,那么的出来的相交矩形C满足:(cx1>cx2)||(cy1>cy2),就是左下不是左下点了。

根绝这个方法,可以得出,1.矩形是否相交,2.相交的面积。

写成代码就是:

int get_sum(){//判断和求和一起出来
	if(cx1>cx2)
		return 0;
	if(cy1>cy2)
		return 0;
	return (cx2-cx1)*(cy2-cy1);
}

方法二:

两个矩形相交的条件:两个矩形的重心距离在x轴y轴上都小于两个矩形长或宽的一半之和。

就是判断:

重心距离在x轴上的投影长度<两个矩形的在x轴的长度之和/2

重心距离在y轴上的投影长度<两个矩形在y轴上的宽度之和/2

换成代码就是:

int judge(Rect r1,RECT r2){
	if(abs((r1.x1+r1.x2)/2-(r2.x1+r2.x2)/2)<((r1.x2+r2.x2-r1.x1-r2.x1)/2)
	&& abs((r1.y1+r1.y2)/2-(r2.y1+r2.y2)/2)<((r1.y2+r2.y2-r1.y1-r2.y1)/2))
		return 1;
	return 0;
}

多边形相交

参考评论区的一位聚聚的思路:

判断二维多边形相交 只需要判断

        图形1有任意顶点在图形2的内部 || 图形2有任意顶点在图形1的内部

update2021-9-10补充思路(多边形相交):

在看评论的时候,突然想起,可以用半平面交的思路解决点在多边形内的判断问题.

结合之前的半平面交博客(计算几何基础--半平面求交 ))原博客中使用半平面交求多边形面积,我们可以修改一下,使用向量法,依次判断一个多边形的边是否在一个点的一侧.

例如下面的图(随手一画)

 

判断 多边形FGHI 是否在 多边形ABCDE 内,

Step1:选择点F

Step2:遍历边AB,BC,CD,DE,EA,用向量点乘判断是否在左边.

Step:如果点F都在多边形的左边,那么我们就能判断你点f在多边形ABCDE内,同理判断GHI点.

若点都在多边形内部,则说明 多边形FGHI 在 多边形ABCDE 内.

当然,这种思路只适合凸多边形,如果是凹的话,就会出现问题.

现在对于凹多边形还是没有思路.

 

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值