电子科大清水河校区是电子科大大力兴建的未来主校区,于07年秋正式迎接学生入住,目前有07、08级本科生及部分研究生在此校区学习、生活。
清水河校区位于成都高新西区的中部地带,占地约3128亩。从空中看,新校区的整体像一个长方形,南北长,东西窄。一条水渠从西北角的顶点注入,笔直的延伸到南面围墙的大概三分之一分点的地方,由此流出学校。位于这条水渠和西墙之间的是研究院,最南面的是学术交流中心和接待中心。
在本题中,假设清水河校区是一个凸多边形,水渠是一条直线,要求给出清水河校区被水渠分割成的两部分的面积。(水渠一定穿过清水河校区)
清水河校区位于成都高新西区的中部地带,占地约3128亩。从空中看,新校区的整体像一个长方形,南北长,东西窄。一条水渠从西北角的顶点注入,笔直的延伸到南面围墙的大概三分之一分点的地方,由此流出学校。位于这条水渠和西墙之间的是研究院,最南面的是学术交流中心和接待中心。
在本题中,假设清水河校区是一个凸多边形,水渠是一条直线,要求给出清水河校区被水渠分割成的两部分的面积。(水渠一定穿过清水河校区)
#include<iostream>
#include<cstdio>
#include<cmath>
#define precision 1e-6
#define INF 1e10
using namespace std;
struct point
{
double x;
double y;
};
int dblcmp(double m)
{
if(fabs(m)<precision)
return 0;
else if(m<0)
return -1;
return 1;
}
int cross(point p1,point p2,point a)
{
return dblcmp( (p1.x-a.x)*(p2.y-a.y)-(p2.x-a.x)*(p1.y-a.y) );
}
bool judge(point a,point b,point p1,point p2,point &m)
{
if(cross(p1,p2,a)*cross(p1,p2,b)>0)
return false;
double k1,b1,k2,b2;
if(a.x==b.x)
{
k1=INF;
b1=a.x;
}
else
{
k1=(a.y-b.y)/(a.x-b.x);
b1=a.y-k1*a.x;
}
if(p1.x==p2.x)
{
k2=INF;
b2=p1.x;
}
else
{
k2=(p1.y-p2.y)/(p1.x-p2.x);
b2=p1.y-k2*p1.x;
}
if(k1!=INF && k2!=INF)
{
m.x=(b2-b1)/(k1-k2);
m.y=k1*m.x+b1;
}
else if(k1==INF &&k2!=INF)
{
m.x=a.x;
m.y=k2*m.x+b2;
}
else if(k1!=INF &&k2==INF)
{
m.x=p1.x;
m.y=k1*m.x+b1;
}
return true;
}
int main()
{
freopen("test.txt","r",stdin);
int n;
int i;
point m;
point p1,p2;
point node[2];
point a[25];
int po[2];
double area1,area2,sum;
while(scanf("%d",&n)!=EOF && n!=0)
{
for(i=0;i<n;i++)
scanf("%lf %lf",&a[i].x,&a[i].y);
a[n]=a[0];
scanf("%lf %lf %lf %lf",&p1.x,&p1.y,&p2.x,&p2.y);
int j=0;
for(i=0;i<n;i++)
{
if( judge(a[i],a[i+1],p1,p2,m) )
{
if( dblcmp(m.x-a[i+1].x)==0 && dblcmp(m.y-a[i+1].y)==0 )
continue;
po[j]=i;
node[j++]=m;
if(j==2)
break;
}
}
sum=0;
for(i=0;i<n;i++)
sum+=(a[i].x*a[i+1].y-a[i].y*a[i+1].x);
sum=fabs(sum/2);
area2= node[0].x*a[po[0]+1].y-a[po[0]+1].x*node[0].y;
area2+= node[1].x*node[0].y-node[0].x*node[1].y ;
area2+= a[po[1]].x*node[1].y-node[1].x*a[po[1]].y;
for(i=po[0]+1;i<po[1];i++)
{
area2+= a[i].x*a[i+1].y-a[i].y*a[i+1].x;
}
area2=fabs(area2/2);
area1=sum-area2;
if(area1>area2)
printf("%.0lf %.0lf\n",area1,area2);
else
printf("%.0lf %.0lf\n",area2,area1);
}
return 0;
}