#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-8
int n,a,b;
struct P
{
int x,y;
}p[100],s,t;
int dblcmp(double x)
{
return (x>eps)-(x<-eps);
}
int cross(int ux,int uy,int vx,int vy)
{
return ux*vy-uy*vx;
}
bool onLine(int x,int y,P a,P b)
{
return cross(x-a.x,y-a.y,x-b.x,y-b.y)==0&&(a.x-x)*(b.x-x)<=0;
}
bool inside(int x,int y)
{
int k,d1,d2,ret = 0;
for(int i=0;i<n;i++)
{
if(onLine(x,y,p[i],p[(i+1)%n]))
return true;
k = cross(x-p[i].x,y-p[i].y,p[(i+1)%n].x-p[i].x,p[(i+1)%n].y-p[i].y);
d1 = y-p[i].y;
d2 = y-p[(i+1)%n].y;
if(k<0&&d1>=0&&d2<0)
ret++;
if(k>0&&d2>=0&&d1<0)
ret--;
}
return ret!=0;
}
int main()
{
double sx,sy,tx,ty;
while(scanf("%lf%lf%lf%lf",&sx,&sy,&tx,&ty)!=EOF)
{
scanf("%d%d%d",&n,&a,&b);
for(int i=0;i<n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
double sum = (tx-sx)*(ty-sy);
double ans = 0;
int mix = ceil(sx),maX = floor(tx);
int miy = ceil(sy),may = floor(ty);
double h,w;
for(int i=mix;i<=maX;i++)
{
for(int j=miy;j<=may;j++)
{
if(inside(i,j))
{
h = min(tx,i+0.5)-max(sx,i-0.5);
w = min(ty,j+0.5)-max(sy,j-0.5);
ans += (a*i+b*j)*h*w;
}
}
}
printf("%.3lf\n",ans/sum);
}
}
zoj 3720 几何 判断点在多边形内
最新推荐文章于 2017-12-06 18:36:00 发布