原题翻译如:
在一些平坦的场地上有一个被围栏围住的区域。篱笆具有高度h,在平面投影中,它具有由其N个顶点的笛卡尔坐标(Xi,Yi)指定的封闭多边形线(无自相交)的形式。在坐标(0,0)的点上,一个灯站在场上。灯可以位于栅栏的外部或内部,但不在其侧面,如下图所示(图中细线所示的部分不被灯照亮):
栅栏是完全黑色的,即它既不反射也不扩散,也不能让光通过。研究和实验表明,以下法律表达了落在该栅栏任意照明点的光强度:
I 0 = k / r
其中k是不取决于所讨论点的已知常数值,r是平面投影中该点与灯之间的距离。具有宽度d1和高度h的无穷小窄垂直板的照明
dI = I 0 * |cosα| * dl * h
其中I 0是栅栏板上的光的强度,α是在该点处的栅栏侧面的法线与灯的方向之间的平面投影中的角度。
您将编写一个程序,将找到围墙的总照度,该照明被定义为所有照明板的照明总和。
输入
输入文件的第一行包含数字k,h和N,以空格分隔。k和h是实常数。N(3 <= N <= 100)是围栏的顶点数。然后N行跟随,每行包含两个实数Xi和Yi,由空格分隔。
产量
将输入文件写入栅格的总照明四舍五入到小数点后的第二位。
样品输入
0.5 1.7 3
1.0 3.0
2.0 -1.0
-4.0 -1.0
样品输出
5.34
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
//#include<queue>
#define dist(a,b) sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))
#define cross(a,b,c) (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x)
#define dot(a,b,c) (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y)
#define delt(a) fabs(a)<eps?0:a>0?1:-1
#define pi acos(-1.0)
//#define eps 1e-8
//#define inf 1e20
#define N 1005
using namespace std;
int n, m, t, nl, ml;
struct TPoint
{
double x, y;
}pt[N], st;
void scan()
{
scanf("%lf%lf%d", &st.x, &st.y, &n);
for (int i = 0; i<n; i++)
scanf("%lf%lf", &pt[i].x, &pt[i].y);
}
double getang(TPoint a, TPoint b)
{
double ang1 = atan2(a.y, a.x), ang2 = atan2(b.y, b.x);
if (ang1 - ang2>pi)
ang2 += 2 * pi;
if (ang2 - ang1>pi)
ang1 += 2 * pi;
return ang1 - ang2;
}
void solve()
{
double minf = 0, maxf = 0, sumf = 0;
pt[n] = pt[0];
for (int i = 0; i<n; i++)
{
sumf += getang(pt[i], pt[i + 1]);
maxf = max(sumf, maxf);
minf = min(sumf, minf);
if (maxf - minf>2 * pi)
{
maxf = minf + 2 * pi;
break;
}
}
printf("%.2f\n", (maxf - minf)*st.x*st.y);
}
int main()
{
scan();
solve();
return 0;
}