计算矩形与圆形相交与否
**
* 描述: 计算圆形与矩形之间图形相交工具类
* User: YueXZ
* DateTime: 2021/12/8 17:22
* Version:1.0.0
*/
public class ShapeAreaMathUtil {
public static Boolean circleIsOverlap(Circle c1, Circle c2) {
return Math.sqrt((c2.getCenterX() - c1.getCenterX()) * (c2.getCenterX() - c1.getCenterX()) + (c2.getCenterY() - c1.getCenterY()) * (c2.getCenterY() - c1.getCenterY()))
< (c1.getRadius() + c2.getRadius());
}
//以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标 rec1 = [0,0,2,2], rec2 = [1,1,3,3]
public static boolean isRectangleOverlap(double[] rec1, double[] rec2) {
if (rec1[0] == rec1[2] || rec1[1] == rec1[3] || rec2[0] == rec2[2] || rec2[1] == rec2[3]) {
return false;
}
return !(rec1[2] <= rec2[0] || // left
rec1[3] <= rec2[1] || // bottom
rec1[0] >= rec2[2] || // right
rec1[1] >= rec2[3]); // top
}
//其中 (x1, y1) 是矩形左下角的坐标,(x2, y2) 是右上角的坐标。
public static boolean rectangleAndCircleIsOverlap(Double radius, Double x_center, Double y_center, Double x1, Double y1, Double x2, Double y2) {
//判断圆是否在矩形内
if (x1 <= x_center && x2 >= x_center && y1 <= y_center && y2 >= y_center)
return true;
//判断矩形的四个点是否在圆内
if (Math.sqrt((x1 - x_center) * (x1 - x_center) + (y1 - y_center) * (y1 - y_center)) <= radius)
return true;
if (Math.sqrt((x1 - x_center) * (x1 - x_center) + (y2 - y_center) * (y2 - y_center)) <= radius)
return true;
if (Math.sqrt((x2 - x_center) * (x2 - x_center) + (y1 - y_center) * (y1 - y_center)) <= radius)
return true;
if (Math.sqrt((x2 - x_center) * (x2 - x_center) + (y2 - y_center) * (y2 - y_center)) <= radius)
return true;
//矩形的点不在圆内,但矩形与圆相交的情况
if (y1 < y_center && y2 > y_center && ((Math.abs(x1 - x_center) <= radius || Math.abs(x2 - x_center) <= radius)))
return true;
return x1 < x_center && x2 > x_center && ((Math.abs(y1 - y_center) <= radius || Math.abs(y2 - y_center) <= radius));
}
}