Python蓝桥杯练习 农场阳光

问题描述

  X星球十分特殊,它的自转速度与公转速度相同,所以阳光总是以固定的角度照射。
  最近,X星球为发展星际旅游业,把空间位置出租给Y国游客来晒太阳。每个租位是漂浮在空中的圆盘形彩云(圆盘与地面平行)。当然,这会遮挡住部分阳光,被遮挡的土地植物无法生长。
  本题的任务是计算某个农场宜于作物生长的土地面积有多大。

输入格式

  输入数据的第一行包含两个整数a, b,表示某农场的长和宽分别是a和b,此时,该农场的范围是由坐标(0, 0, 0), (a, 0, 0), (a, b, 0), (0, b, 0)围成的矩形区域。
  第二行包含一个实数g,表示阳光照射的角度。简单起见,我们假设阳光光线是垂直于农场的宽的,此时正好和农场的长的夹角是g度,此时,空间中的一点(x, y, z)在地面的投影点应该是(x + z * ctg(g度), y, 0),其中ctg(g度)表示g度对应的余切值。
  第三行包含一个非负整数n,表示空中租位个数。
  接下来 n 行,描述每个租位。其中第i行包含4个整数xi, yi, zi, ri,表示第i个租位彩云的圆心在(xi, yi, zi)位置,圆半径为ri。

输出格式

  要求输出一个实数,四舍五入保留两位有效数字,表示农场里能长庄稼的土地的面积。

样例输入

10 10
90.0
1
5 5 10 5

样例输出

21.46

样例输入

8 8
90.0
1
4 4 10 5

样例输出

1.81

样例输入

20 10
45.0
2
5 0 5 5
8 6 14 6

样例输出

130.15

思路

当阳光斜射入农场时,实际上上空的圆形区域阴影在地面上仍是圆形,大小不变,位置改变,所以只需要找到底面对应圆心位置即可
这道题的难点在于精确求矩形除去圆形剩余部分面积
分两组情况

  1. 当圆形区域互不重叠时,只需要判断投影在矩形区域内的圆形区域范围的圆形大小即可,之后减去便是剩余部分
  2. 当圆形区域之间有重叠时,计算出重叠区域的面积,再用两个圆形区域面积相加减去重叠部分,就是投影部分。注意如果一个圆形与多个圆形重叠,那么要重复计算它与每个重合圆形的重叠部分面积,再用两个圆形面积减去重叠部分得到投影部分,再把多余计算的圆形面积减去,每个圆形区域只保留一次加进去的。
这里的关键为计算两个圆形的重叠区域面积

两个圆形重叠部分面积计算

扫描二维码关注公众号,回复: 11448045 查看本文章
  1. AC、BC为圆半径,AB为两个圆心的距离
  2. 由余弦定理得到∠CAB、∠CBA
  3. 根据AC、AB和∠CAB计算出三角形ABC的面积,之后乘2得到两个三角形的面积
  4. 根据AC、∠CAB*2计算出圆A部分的扇形区域面积
  5. 根据BC、∠CBA*2计算出圆B部分的扇形区域面积
  6. 两个扇形面积相加再减去三角形ABC*2的面积得到的值就是重叠部分的面积
  7. 上图两种情况相同,考虑一次就可以了
  8. 其他情况为内含、外离。

我看到其他人还有用微积分来做的,具体为把矩形细分为若干个小矩形,然后判断小矩形的四个边角是否在圆形区域内,如果有两个那么这个小矩形就算在阴影部分,最后把非阴影部分相加就可以了。在大面积的情况下是可以达到精度的,但是速度方面可能不太好。

Python源代码

在赶了在赶了,别催了

猜你喜欢

转载自www.cnblogs.com/heyjjjjj/p/13382871.html