圆和矩形的碰撞检测

两个矩形之间的碰撞检测:

先写上参考地址:http://hi.baidu.com/ncutlw/blog/item/f19ca245fa61a228cefca34b.html

这个算法说起来简单,想起来也不太容易,还不如搜索一下直接复制粘贴呢,代码如下:

if (x1 + w1 > x2 && x1 < x2 + w2 &&
y1 + h1 > y2 && y1 < y2 + h2)
{
return true;
}
else
{
return false;
}

解释是:

x1 + w1 > x2 限定 第一个矩形的右边线在第二个矩形的左边线右边
x1 < x2 + w2 限定 第一个矩形的左边线在第二个矩形的右边线左边
这样下来,就限定了两个矩形在X方向上投影必然相交。
同理,
y1 + h1 > y2 限定 第一个矩形的下边线在第二个矩形的上边线下面
y1 < y2 + h2 限定 第一个矩形的上边线在第二个矩形的下边线上边
这样下来,就限定了两个矩形在Y方向上投影必然相交。(winxos 2010-8-31)

两个圆之间的碰撞检测:

两个圆之间的碰撞检测很好想,就是两圆原点的距离小于两圆半径和,就是相交了。

代码如下:

if ((((圆1.原点.x-圆2.原点.x)^2 + (圆1.原点.y-圆2.原点.y)^2)^0.5)<(圆1.半径+圆2.半径))
{碰撞成功}
else
{没有碰撞}

圆和矩形之间的碰撞检测:

参考地址:http://hi.baidu.com/bcchaochao/blog/item/e85d86b180e8d4550823021b.html

以下贴上原文:

//下面是邪恶的伪代码:

矩形和圆形的碰撞检测,需要圆和矩形
{
   如果圆点的x坐标 小于 矩形的x坐标,并且圆点的y坐标 小于 矩形的y坐标
   {
      圆点就在矩形的左上方,这时候判断圆和矩形左上角是否碰撞。
      返回这个结果。
   }
   否则如果圆点的x坐标 小于 矩形的x坐标,并且圆点的y坐标 大于 矩形的y坐标+矩形的高
   {
      圆点就在矩形的左下方,这时候判断圆和矩形左下角是否碰撞。
      返回这个结果。
   }
   否则如果圆点的x坐标 大于 矩形的x坐标+矩形的宽,并且圆点的y坐标 小于 矩形的y坐标
   {
      圆点就在矩形的右上方,这时候判断圆和矩形右上角是否碰撞。
      返回这个结果。
   }
   否则如果圆点的x坐标 大于 矩形的x坐标+矩形的宽,并且圆点的y坐标 大于 矩形的y坐标+矩形的高
   {
      圆点就在矩形的右下方,这时候判断圆和矩形右下角是否碰撞。
      返回这个结果。
   }

//========================================================

//上半部分结束

//下半部分开始

//========================================================

   如果圆点的x坐标+圆的半径 小于 矩形的x坐标
   {
      没有碰撞。
      返回这个结果
   }
   否则如果圆点的y坐标+圆的半径 小于 矩形的y坐标
   {
      没有碰撞。
      返回这个结果
   }
   否则如果圆点的x坐标-圆的半径 大于 矩形的x坐标+矩形的宽
   {
      没有碰撞。
      返回这个结果
   }
   否则如果圆点的y坐标-圆的半径 大于 矩形的y坐标+矩形的高
   {
      没有碰撞。
      返回这个结果
   }
   如果上面的都不是……那就是碰撞了。
   返回这个结果
}

//===================

思路:

将整个区域分成9块,9个方位,中间的是矩形。

如果圆点在左上、右上、左下、右下、则绝对无法和矩形的四条边碰撞,这时只要圆形和相应的矩形的角的坐标进行圆和圆的碰撞检测就可以了。这是上面伪代码的上半部分。

下半部分就简单了,判断圆是不是碰到矩形的边……

这也许是非常麻烦的方法吧,有更好的方法还请指教,谢谢。

对于下半部分的代码,我们很容易就能实现,但是上半部分,就不一样了,这里我提供了一个方法:

   如果圆点的x坐标 小于 矩形的x坐标,并且圆点的y坐标 小于 矩形的y坐标
   {
      圆点就在矩形的左上方,这时候判断圆和矩形左上角是否碰撞。
      返回这个结果。
   }

判断圆和矩形左上角是否碰撞的方法,用矩形左上角的坐标和原点的距离与圆的半径作比较,方法在本文的“圆与圆碰撞检测”部分有提到,如果矩形左上角坐标与原点的距离小于圆的半径,就是碰撞成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jether

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值