历届试题 农场阳光
Description
X星球十分特殊,它的自转速度与公转速度相同,所以阳光总是以固定的角度照射。
最近,X星球为发展星际旅游业,把空间位置出租给Y国游客来晒太阳。每个租位是漂浮在空中的圆盘形彩云(圆盘与地面平行)。当然,这会遮挡住部分阳光,被遮挡的土地植物无法生长。
本题的任务是计算某个农场宜于作物生长的土地面积有多大。
Input
输入描述:
输入数据的第一行包含两个整数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
Output
输出描述:
要求输出一个实数,四舍五入保留两位有效数字,表示农场里能长庄稼的土地的面积。
输出样例:
21.46
解题思路
这道题目的结果是要求阳光照射的农场的面积,即需要计算除了圆心阴影遮盖之外的面积
一般的思路是通过天空的圆盘的圆心和入射角来计算地面的圆圈的位置以及半径,然后用
农场的面积减去阴影圈的面积,但是需要考虑的是照射的阴影圆圈可能不是一整个的,可
能在农场的边缘只有部分,那就是不规则形状了,所以不可行
所以我在参考了其他博主的想法以及自己思考后觉得 我们可以将整个农场分为若干份,计
算每一小份到达每一个阴影圆的圆心的距离(这里利用了√[(x1-x2)^2+ (y1-y2)^2)] ) ,然后与
阴影圆的半径作比较,如果大于,则在阴影外,如果一小份在每一个阴影外,则累积该小份
,最后计算所有在阴影外的小份的个数占所有份的比重,再用这个比重乘上农场面积即可得
出结果。
下面是计算圆心位置的思路图
注意事项
1.入射角g必须转化成弧度才能使用java中的Math库的sin,cos等函数,否则出错
g = Math.toRadians(sc.nextDouble());
2.当你设置精度后,在取每个点以及圆的半径时必须乘上精度,因为你分隔成若干份了
代码
import java.util.Scanner;
import java.lang.Math;
public class Main {
static int a,b;//农场长和宽
static double g;//阳光照射角度
static int n;//空中租位个数
static int[][] skycircle;//空中租位(圆)的圆心和半径
static double