caioj1215
来源:互联网 发布:淘宝视频制作多少钱 编辑:程序博客网 时间:2024/06/06 09:37
半平面交的第一题啦!纪念一下。。
本来大部队学的是
#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;const int N=20005;struct Point {double x,y;}A,B;double aa,bb,cc;int n;Point a[N*2];int m;Point b[N*2];int mm;double mu (Point x,Point y,Point z){ double x1=x.x-z.x,y1=x.y-z.y; double x2=y.x-z.x,y2=y.y-z.y; return x1*y2-x2*y1;}Point JD (Point x,Point y){ double t1=mu(x,B,A); double t2=mu(y,B,A); Point p,p1,p2; p1=x;p2=y; p.x=(t1*p2.x-t2*p1.x)/(t1-t2); p.y=(t1*p2.y-t2*p1.y)/(t1-t2); return p;}void cut ()//现在有一条有向直线A,B { mm=0; for (int u=1;u<=m;u++) { if (mu(B,a[u],A)>=0) { b[++mm]=a[u];//在左边 //printf("%d %d\n",u,mm); } else { if (mu(B,a[u-1],A)>0) b[++mm]=JD(a[u-1],a[u]); if (mu(B,a[u+1],A)>0) b[++mm]=JD(a[u+1],a[u]); } } for (int u=1;u<=mm;u++) a[u]=b[u]; a[mm+1]=a[1]; a[0]=a[mm]; m=mm;}void prepare(){ m=4; a[1].x=-100000;a[1].y=-100000; a[2].x=100000;a[2].y=-100000; a[3].x=100000;a[3].y=100000; a[4].x=-100000;a[4].y=100000; a[5]=a[1];a[0]=a[4];}int main(){/*freopen("d.in","r",stdin); freopen("d.out","w",stdout);*/ scanf("%d",&n); prepare(); for (int u=1;u<=n;u++) { scanf("%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y); cut(); // for (int u=1;u<=m;u++) // printf("%lf %lf\n",a[u].x,a[u].y); } double ans=0; for (int u=3;u<=m;u++) ans=ans+mu(a[u],a[u-1],a[1]); printf("%.1lf\n",fabs(ans)/2); return 0;}