//圆与矩形 public static bool RadiusToRectangle(CollRadius CollA, CollRectange CollB) { //长轴距离过滤 if (Vector2.Distance(CollA.GetV2Pos(), CollB.GetV2Pos()) > CollB.GetLength() + CollA.Radius) { return(false); } //获得圆相对矩形中心的相对坐标 float newRx = CollA.x - CollB.x; float newRy = CollA.y - CollB.y; if (Mathf.RoundToInt(CollB.GetCalRotate()) != 0) { //计算最新角度(与X轴的角度),同数学X Y轴 以矩形中心为坐标中心 float rotate = Mathf.Atan((CollB.y - CollA.y) / (CollB.x - CollA.x)) * Mathf.Rad2Deg; float newrot = rotate - CollB.GetCalRotate(); //减去矩形旋转角度 与矩形同时旋转对应的角度 float distance = Vector2.Distance(CollA.GetV2Pos(), CollB.GetV2Pos()); //圆相对矩形的 x y newRx = Mathf.Cos(newrot * Mathf.Deg2Rad) * distance; newRy = Mathf.Sin(newrot * Mathf.Deg2Rad) * distance; } //矩形 与圆 相交公式 获得在矩形 x y范围内 与圆心最近的点 float dx = Mathf.Min(newRx, CollB.width * 0.5f); float dx1 = Mathf.Max(dx, -CollB.width * 0.5f); float dy = Mathf.Min(newRy, CollB.height * 0.5f); float dy1 = Mathf.Max(dy, -CollB.height * 0.5f); return((dx1 - newRx) * (dx1 - newRx) + (dy1 - newRy) * (dy1 - newRy) <= CollA.Radius * CollA.Radius); }
//圆与扇形 (暂时不做扇形内圆过滤 如有必需 多算一次小扇形是否相交) public static bool RadiusToSector(CollRadius CollA, CollSector CollB) { //长轴距离过滤 if (Vector2.Distance(CollA.GetV2Pos(), CollB.GetV2Pos()) > CollB.outCircle + CollA.Radius) { return(false); } //扇形最远点 即中轴与x轴夹角 (不做旋转时 扇形对称分布 夹角0) float angle = CollB.GetCalRotate(); float cosA = Mathf.Cos(angle * Mathf.Deg2Rad); float sinA = Mathf.Sin(angle * Mathf.Deg2Rad); //计算最远点坐标 float x2 = CollB.x + cosA * CollB.outCircle; float y2 = CollB.y + sinA * CollB.outCircle; float theta = CollB.angle * Mathf.Deg2Rad; return(IsCircleIntersectFan(CollA.x, CollA.y, CollA.Radius, CollB.x, CollB.y, x2, y2, theta)); }
//圆与圆碰撞 public static bool RadiusToRadius(CollRadius CollA, CollRadius CollB) { return(Vector2.Distance(CollA.GetV2Pos(), CollB.GetV2Pos()) <= (CollA.Radius + CollB.Radius)); }