碰撞检测算法:点和矩形碰撞、点和圆形碰撞、矩形碰撞、圆形碰撞
点和矩形碰撞
/**
*
* @param x1 点
* @param y1 点
* @param x2 矩形view x
* @param y2 矩形view y
* @param w 矩形view 宽
* @param h 矩形view 高
* @return*/publicstaticbooleanisCollision(intx1,inty1,intx2,inty2,intw,int h) {
if(x1 >= x2 && x1 <= x2 + w && y1 >= y2 && y1 <= y2 + h) {
returntrue;
}
returnfalse;
}
矩形碰撞
/**
* 检测两个矩形是否碰撞
* @return*/publicbooleanisCollisionWithRect(intx1,inty1,intw1,int h1,
intx2,inty2,intw2,int h2) {
if(x1 >= x2 && x1 >= x2 + w2) {
returnfalse;
} elseif(x1 <= x2 && x1 + w1 <= x2) {
returnfalse;
} elseif(y1 >= y2 && y1 >= y2 + h2) {
returnfalse;
} elseif(y1 <= y2 && y1 + h1 <= y2) {
returnfalse;
}
returntrue;
}
点(x1,x2) , 圆心(x2,y2) ,半径r
if(Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r) {
// 如果点和圆心距离小于或等于半径则认为发生碰撞 returntrue;
}
圆和圆
/**
* 圆形碰撞
*
* @param x1
* 圆形1的圆心X坐标
* @param y1
* 圆形2的圆心X坐标
* @param x2
* 圆形1的圆心Y坐标
* @param y2
* 圆形2的圆心Y坐标
* @param r1
* 圆形1的半径
* @param r2
* 圆形2的半径
* @return*/privatebooleanisCollisionWithCircle(intx1,inty1,intx2,int y2,
intr1,int r2) {
// Math.sqrt:开平方
// Math.pow(double x, double y): X的Y次方
//直角坐标系,依点1和点2做平行线,|x1-x2|为横向直角边,|y1-y2|为纵向直角边 依勾股定理 c^2=a^2+b^2 if(Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r1 + r2) {
// 如果两圆的圆心距小于或等于两圆半径和则认为发生碰撞 returntrue;
}
returnfalse;
}
网友评论