如何计算矩形内相交双圆构成的8字形外围长度?实现inkAmount方法
问题分析与解法
核心思路
计算8字形外围的墨水量(即外围总长度),可按题目提示的思路:两个圆的总周长减去2倍的重叠弧长(重叠部分被两个圆各计算了一次,需从总周长中扣除两次)。
推导过程
- 确定圆的半径:每个圆与矩形三条边相切,因此圆的半径
r = a/2(矩形高度的一半)。 - 计算圆心距:两个圆分别靠近矩形左右两端,圆心的水平距离为
d = a - b(因a ≥ b,直接取正值)。 - 计算重叠弧对应的圆心角:通过余弦定理推导,单个圆中重叠弧对应的圆心角(弧度制)为
2 * arccos(d/(2r)),代入r和d后简化为2 * arccos( (a - b)/a )。 - 推导最终公式:
- 两个圆的总周长为
2 * 2πr = 2πa(代入r=a/2)。 - 两个圆的重叠弧长总和为
2 * r * 2 * arccos( (a - b)/a ) = 2a * arccos( (a - b)/a )。 - 外围总长度 = 总周长 - 重叠弧长总和,最终简化为:
inkAmount = 2 * π * a - 2 * a * arccos( (a - b) / a )
- 两个圆的总周长为
代码实现(Java)
public class Pepe8Shape { public double inkAmount(int b, int a) { double theta = Math.acos( (a - b) / (double)a ); return 2 * Math.PI * a - 2 * a * theta; } }
示例验证
当 b=2、a=3 时:
theta = arccos( (3-2)/3 ) ≈ 1.23096弧度- 计算结果:
2*π*3 - 2*3*1.23096 ≈ 18.84956 - 7.38576 ≈ 10.10963,与题目给出的示例结果完全一致。
内容的提问来源于stack exchange,提问作者Fabian Nogales
相关产品推荐
相关产品推荐

