问题描述
给定一个矩形和一个固定点 𝑃P,需要计算一个以点 𝑃P 为圆心的最小圆,使得该圆完全覆盖给定的矩形,并计算该圆的面积。圆的半径是点 𝑃P 到矩形四个顶点中最远距离,而面积可以通过公式 𝐴=𝜋⋅𝑟2A=π⋅r2 来计算。需要注意的是,𝜋π 取值为 3.1415926536。
例如,给定矩形的左下角坐标为 (𝑥1,𝑦1)(x1,y1),右上角坐标为 (𝑥2,𝑦2)(x2,y2),点 𝑃P 的坐标为 (𝑥𝑃,𝑦𝑃)(xP,yP),你需要找到使圆能够完全覆盖矩形的最小面积,面积保留两位小数。
测试样例
样例1:
输入:
x1 = 0,y1 = 0,x2 = 1,y2 = 1,xP = 0,yP = 0
输出:'6.28'
样例2:
输入:
x1 = -2,y1 = -2,x2 = 2,y2 = 2,xP = 0,yP = 0
输出:'25.13'
样例3:
输入:
x1 = -3,y1 = -1,x2 = 1,y2 = 2,xP = 0,yP = 0
输出:'40.84'
最小覆盖圆面积问题
这个问题要求我们计算一个以固定点 ( P ) 为圆心的最小圆,该圆能够完全覆盖给定的矩形,并计算该圆的面积。圆的半径是点 ( P ) 到矩形四个顶点中最远的距离,面积公式为 ( A = \pi \cdot r^2 ),其中 ( \pi ) 取值为 3.1415926536。
问题分析
-
目标:
- 计算以点 ( P ) 为圆心的最小圆的面积,该圆完全覆盖给定的矩形。
- 圆的半径是点 ( P ) 到矩形四个顶点中最远的距离。
-
步骤:
- 计算点 ( P ) 到矩形四个顶点的距离:
- 矩形的四个顶点分别为:
- ( (x_1, y_1) )
- ( (x_1, y_2) )
- ( (x_2, y_1) )
- ( (x_2, y_2) )
- 计算点 ( P(x_P, y_P) ) 到这四个顶点的距离: [ d = \sqrt{(x_P - x_i)^2 + (y_P - y_i)^2} ] 其中 ( (x_i, y_i) ) 是矩形的四个顶点之一。
- 矩形的四个顶点分别为:
- 找到最大距离:
- 找到点 ( P ) 到四个顶点中的最大距离 ( r ),这就是圆的半径。
- 计算面积:
- 使用公式 ( A = \pi \cdot r^2 ) 计算圆的面积。
- 注意,题目要求面积保留两位小数。
- 计算点 ( P ) 到矩形四个顶点的距离:
-
实现细节:
- 使用
Math.sqrt计算距离。 - 使用
Math.max找到最大距离。 - 使用
String.format保留两位小数。
- 使用
代码实现
public class Main {
public static String solution(int x1, int y1, int x2, int y2, int xP, int yP) {
// 计算四个顶点的坐标
int[][] corners = {
{x1, y1},
{x1, y2},
{x2, y1},
{x2, y2}
};
// 初始化最大距离为0
double maxDistance = 0.0;
// 计算点 P 到四个顶点的距离,并找到最大距离
for (int[] corner : corners) {
double dx = xP - corner[0];
double dy = yP - corner[1];
double distance = Math.sqrt(dx * dx + dy * dy);
if (distance > maxDistance) {
maxDistance = distance;
}
}
// 计算面积
double area = 3.1415926536 * maxDistance * maxDistance;
// 保留两位小数
return String.format("%.2f", area);
}
public static void main(String[] args) {
System.out.println(solution(0, 0, 1, 1, 0, 0).equals("6.28")); // 输出: true
System.out.println(solution(-2, -2, 2, 2, 0, 0).equals("25.13")); // 输出: true
System.out.println(solution(-3, -1, 1, 2, 0, 0).equals("40.84")); // 输出: true
}
}
代码解释
-
计算四个顶点:
- 根据输入的矩形坐标 ( (x_1, y_1) ) 和 ( (x_2, y_2) ),计算矩形的四个顶点。
-
计算距离:
- 对于每个顶点,计算点 ( P(x_P, y_P) ) 到该顶点的距离。
- 使用
Math.sqrt计算欧几里得距离。
-
找到最大距离:
- 使用
Math.max找到点 ( P ) 到四个顶点中的最大距离,这就是圆的半径。
- 使用
-
计算面积:
- 使用公式 ( A = \pi \cdot r^2 ) 计算面积。
- 使用
String.format("%.2f", area)保留两位小数。
-
测试样例:
- 样例1:
- 输入:x1 = 0, y1 = 0, x2 = 1, y2 = 1, xP = 0, yP = 0
- 输出:"6.28"
- 样例2:
- 输入:x1 = -2, y1 = -2, x2 = 2, y2 = 2, xP = 0, yP = 0
- 输出:"25.13"
- 样例3:
- 输入:x1 = -3, y1 = -1, x2 = 1, y2 = 2, xP = 0, yP = 0
- 输出:"40.84"
- 样例1:
结论
通过上述方法,我们可以有效地计算出以点 ( P ) 为圆心的最小覆盖圆的面积。该算法简单且高效,适用于大多数情况。