圆形与矩形碰撞算法

30 篇文章 0 订阅
16 篇文章 1 订阅
/*
* arcX,arcY表示圆的绘制坐标,就是左上角坐标 ,arcR为圆半径;rectX,rectY,rectW,rectH分别表示矩形的绘制坐标与宽高
*/
public static final boolean isArcRectCollides(int arcX, int arcY,
int arcR, int rectX, int rectY, int rectW, int rectH) {
int arcOx = arcX + arcR;// 圆心X坐标
int arcOy = arcY + arcR;// 圆心Y坐标
if (((rectX - arcOx) * (rectX - arcOx) + (rectY - arcOy)
* (rectY - arcOy)) <= arcR * arcR)
return true;
if (((rectX + rectW - arcOx) * (rectX + rectW - arcOx) + (rectY - arcOy)
* (rectY - arcOy)) <= arcR * arcR)
return true;
if (((rectX - arcOx) * (rectX - arcOx) + (rectY + rectH - arcOy)
* (rectY + rectH - arcOy)) <= arcR * arcR)
return true;
if (((rectX + rectW - arcOx) * (rectX + rectW - arcOx) + (rectY + rectH - arcOy)
* (rectY + rectH - arcOy)) <= arcR * arcR)
return true;
// 分别判断矩形4个顶点与圆心的距离是否<=圆半径;如果<=,说明碰撞成功


int minDisX = 0;
if (arcOy >= rectY && arcOy <= rectY + rectH) {
if (arcOx < rectX)
minDisX = rectX - arcOx;
else if (arcOx > rectX + rectW)
minDisX = arcOx - rectX - rectW;
else
return true;
if (minDisX <= arcR)
return true;
}// 判断当圆心的Y坐标进入矩形内时X的位置,如果X在(rectX-arcR)到(rectX+rectW+arcR)这个范围内,则碰撞成功


int minDisY = 0;
if (arcOx >= rectX && arcOx <= rectX + rectW) {
if (arcOy < rectY)
minDisY = rectY - arcOy;
else if (arcOy > rectY + rectH)
minDisY = arcOy - rectY - rectH;
else
return true;
if (minDisY <= arcR)
return true;
}// 判断当圆心的X坐标进入矩形内时Y的位置,如果X在(rectY-arcR)到(rectY+rectH+arcR)这个范围内,则碰撞成功
return false;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值