栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

检测两个矩形相交的算法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

检测两个矩形相交的算法?

标准方法是进行 分离轴测试 (对此进行Google搜索)。

简而言之:

  • 如果可以找到将两个对象分开的线,则两个对象不会相交。例如,对象/对象的所有点都在直线的不同侧。

有趣的是,仅检查两个矩形的所有边缘就足够了。如果矩形不重叠,则边缘之一将成为分隔轴。

在2D模式下,您无需使用坡度即可执行此操作。边简单定义为两个顶点之间的差,例如

  edge = v(n) - v(n-1)

您可以通过将其旋转90°来获得垂直于此的角度。在2D中,这很容易,因为:

  rotated.x = -unrotated.y  rotated.y =  unrotated.x

因此,不涉及三角函数或斜率。也不需要将向量归一化为单位长度。

如果要测试点是否在直线的一侧或另一侧,则可以使用点积。标牌会告诉您您在哪一边:

  // rotated: your rotated edge  // v(n-1) any point from the edge.  // testpoint: the point you want to find out which side it's on.  side = sign (rotated.x * (testpoint.x - v(n-1).x) +     rotated.y * (testpoint.y - v(n-1).y);

现在,针对矩形B的边缘测试矩形A的所有点,反之亦然。如果找到分离的边缘,则对象不相交(假设B中的所有其他点都在要测试的边缘的另一侧-
请参见下图)。如果找不到分隔边,则两个矩形相交,或者另一个矩形中包含一个矩形。

该测试适用于所有凸多边形btw ..

修正:
要确定分隔边缘,仅将一个矩形的所有点与另一个矩形的每个边缘进行对比测试是不够的。由于A中的所有点都在E的同一半平面中,因此候选边E(如下)将被标识为分离边。但是,它不是分离边,因为B的顶点Vb1和Vb2也在那个半平面内
如果不是这种情况,那只会是一个分离的边缘
。http://www.iassess.com/collision.png



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/609300.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号