这题是一个几何综合题,线段的相交于多边形的面积。
这题错了几次,主要是判断线段相交的错误。相邻的两条边没必要去判断。而我把每条边对枚举了,很难除去端点相交的。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;
struct point{
double x,y;
}p[1005];
struct line{
point a,b;
}edge[1005];
bool vis[1005][1005];
int cnt;
double cross(point u,point v,point w){
return (v.x-u.x)*(w.y-u.y)-(v.y-u.y)*(w.x-u.x);
}
bool Iscross(line A,line B)
{
double t1=cross(B.a,A.a,A.b);
double t2=cross(B.b,A.a,A.b);
double t3=cross(A.a,B.a,B.b);
double t4=cross(A.b,B.a,B.b);
if(t1*t2<=0&&t3*t4<=0) return true;
return false;
}
bool Judge(){
int tmp;
for(int i=0;i<cnt-1;i++){
for(int j=i+2;;j++){
tmp=j%cnt;
if(vis[i][tmp]||vis[tmp][i]) break;
if((tmp+1)%cnt==i) break;
vis[i][tmp]=vis[tmp][i]=1;
if(Iscross(edge[i],edge[tmp])) return true;
}
}
return false;
}
int main()
{
int n,i,j,test=1;
double ret;
while(scanf("%d",&n),n){
cnt=0;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++){
scanf("%lf %lf",&p[i].x,&p[i].y);
if(i>0) edge[cnt].a=p[i-1],edge[cnt++].b=p[i];
}
edge[cnt].a=p[n-1],edge[cnt++].b=p[0];
if(n<3||Judge()){
printf("Figure %d: Impossible\n",test++);
}
else{
ret=0;
for(i=0;i<n;i++){
ret+=cross(p[0],p[i],p[(i+1)%n]);
}
if(ret<0) ret=-ret;
printf("Figure %d: %.2lf\n",test++,ret/2);
}
}
return 0 ;
}