基于分离轴定理的二维游戏碰撞检测算法

12 篇文章 3 订阅
10 篇文章 0 订阅

基于分离轴定理的碰撞检测算法


如图所示,如果两个图形在某条线上的投影重叠,那么这两个图形就相交(黄色部分表示重叠部分)。
这里写图片描述
读者可能立马想到下面的情况,投影相交但是图形不相交。
这里写图片描述
但是却一定至少存在一条线,使这两图形在这条线上的投影没有交集,如:
这里写图片描述
试比较这两种情况的区别。

如果两个图形不相交,必然至少存在一条线,使这两个图形在这条线上的投影没有交集。如果图形相交,那么这条线一定不存在。这就是算法的核心。要实现算法,枚举所有可能的线判断是否存在投影没有交集的情况。而在二维平面中,两个多边形的每条边的法向量包含了这条轴的所有可能性,所以我们只要枚举所有边的法向量即可。

  • 计算一条边的法向量
    如果多边形的一条边的向量是(x,y),这条边的法向量就是(-y,x)或(y,-x)。

  • 计算每条边在法向量(轴)上的投影,找出最大值和最小值
    如果法向量的坐标是(x1,y1),边的坐标是(x2,y2),边在法向量上的投影dot计算方法如下

    temp1=x2x2+y2y2
    temp2=x1x1+y1y1
    dot=temp2x2x2temp1+temp2y2y2temp1

    比较两个多边形的最大值和最小值是否有交集,如果没有,则两个多边形不相交,否则继续枚举法向量,求出投影,继续进行比较。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在MATLAB中,可以使用分离定理来实现自动泊车过程中的碰撞检测分离定理是一种用于检测两个凸多边形是否相交的方。它的基本思想是,如果两个凸多边形之间不存在分离,那么它们一定相交。 在自动泊车过程中,我们可以将车辆和障碍物都抽象为凸多边形。然后,使用MATLAB中的向量运算和凸多边形的相关函数,计算出车辆和障碍物的所有可能的分离,并检测它们是否存在相交。如果存在相交,则说明车辆会与障碍物碰撞。 以下是一个简单的示例代码,用于检测两个凸多边形是否相交: ```matlab function result = check_collision(polygon1, polygon2) % polygon1和polygon2分别为两个凸多边形的顶点坐标 % 返回值为0表示没有碰撞,返回值为1表示有碰撞 % 计算所有可能的分离 axes = [polygon1(2:end,:) - polygon1(1:end-1,:); polygon1(1,:) - polygon1(end,:)]; axes = [axes; polygon2(2:end,:) - polygon2(1:end-1,:); polygon2(1,:) - polygon2(end,:)]; axes = unique(axes, 'rows'); axes = axes ./ vecnorm(axes, 2, 2); % 检测每个分离是否存在相交 for i = 1:size(axes, 1) proj1 = polygon1 * axes(i,:)'; proj2 = polygon2 * axes(i,:)'; if max(proj1) < min(proj2) || max(proj2) < min(proj1) result = 0; return; end end % 如果所有分离都不存在相交,则说明存在碰撞 result = 1; end ``` 在实际使用中,我们可以将上述代码嵌入到自动泊车的程序中,每隔一定时间调用一次该函数,检测车辆和障碍物是否存在碰撞。如果存在碰撞,则及时停车或调整车辆方向,避免发生事故。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值