点击这里查看原题
半平面交模板题,这个讲解挺好的,http://blog.csdn.net/accry/article/details/6070621
/*
User:Small
Language:C++
Problem No.:1279
*/
#include<stdio.h>
#include<iostream>
#include<iomanip>
#include<string.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=1505;
const double eps=1e-6;
int n,cnt;
double ans;
struct no{
double x,y;
}p[M<<1],q[M<<1],points[M];
void init(){
ans=cnt=0;
}
void line(no x,no y,double &a,double &b,double &c){//计算x,y两点连线的一般式,即ax+by+c=0的形式
a=y.y-x.y;
b=x.x-y.x;
c=x.y*y.x-x.x*y.y;
}
no intersect(no x,no y,double a,double b,double c){//计算x,y两点连线与ax+by+c=0的交点
double u=fabs(a*x.x+b*x.y+c),v=fabs(a*y.x+b*y.y+c);
return (no){(x.x*v+y.x*u)/(u+v),(x.y*v+y.y*u)/(u+v)};
}
void cut(double a,double b,double c){
int tot=0;
for(int i=1;i<=cnt;i++){
if(a*p[i].x+b*p[i].y+c>=eps) q[++tot]=p[i];
else{
if(a*p[i-1].x+b*p[i-1].y+c>eps) q[++tot]=intersect(p[i],p[i-1],a,b,c);
if(a*p[i+1].x+b*p[i+1].y+c>eps) q[++tot]=intersect(p[i],p[i+1],a,b,c);
}
}
for(int i=1;i<=tot;i++) p[i]=q[i];
cnt=tot;
p[cnt+1]=p[1];
p[0]=p[cnt];
}
void solve(){
init();
cin>>n;
for(int i=1;i<=n;i++){
cin>>points[i].x>>points[i].y;
}
for(int i=1;i<=n;i++) p[i]=points[i];
p[n+1]=p[1];
p[0]=p[n];
cnt=n;
points[n+1]=points[1];
for(int i=1;i<=n;i++){
double a,b,c;
line(points[i],points[i+1],a,b,c);
cut(a,b,c);
}
for(int i=1;i<=cnt;i++){
ans+=p[i].x*p[i+1].y-p[i].y*p[i+1].x;//用叉积计算面积
}
ans=fabs(ans/2.0);
cout<<setiosflags(ios::fixed)<<setprecision(2)<<ans<<endl;
}
int main(){
freopen("data.in","r",stdin);//
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--) solve();
return 0;
}