博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3528 Ultimate Weapon(三维凸包表面积)
阅读量:6893 次
发布时间:2019-06-27

本文共 2989 字,大约阅读时间需要 9 分钟。

题目链接:

题意:求三维凸包表面积。

思路:模板。

struct Point{    double x,y,z;    Point() {}    Point(double _x,double _y,double _z)	{		x=_x;		y=_y;		z=_z;	}	void Get()	{	    RD(x,y,z);	}    Point operator-(const Point p1)	{		return Point(x-p1.x,y-p1.y,z-p1.z);	}    Point operator*(Point p)	{		return Point(y*p.z-z*p.y,z*p.x-x*p.z,x*p.y-y*p.x);	}    double operator^(Point p)	{		return x*p.x+y*p.y+z*p.z;	}	double len()	{	    return sqrt(sqr(x)+sqr(y)+sqr(z));	}};struct _3DCH{    struct face    {        int a,b,c,ok;        face(){}        face(int _a,int _b,int _c,int _ok)        {            a=_a;            b=_b;            c=_c;            ok=_ok;        }    }F[N<<2];    int n,cnt,b[N][N];    Point p[N];    int DB(double x)    {        if(x>1e-10) return 1;        if(x<-1e-10) return -1;        return 0;    }    double vlen(Point a)    {        return a.len();    }    double getArea(Point a,Point b,Point c)    {        return vlen((b-a)*(c-a));    }    double getVolume(Point a,Point b,Point c,Point d)    {        return (b-a)*(c-a)^(d-a);    }    //t在f的正面返回1,反面返回-1,在f上返回0    int getDir(Point t,face f)    {        double x=(p[f.b]-p[f.a])*(p[f.c]-p[f.a])^(t-p[f.a]);        return DB(x);    }    void deal(int i,int x,int y)    {        int f=b[x][y];        face temp;        if(!F[f].ok) return;        if(getDir(p[i],F[f])>0) DFS(i,f);        else        {            temp=face(y,x,i,1);            b[y][x]=b[x][i]=b[i][y]=cnt;            F[cnt++]=temp;        }    }    void DFS(int i,int j)    {        F[j].ok=0;        deal(i,F[j].b,F[j].a);        deal(i,F[j].c,F[j].b);        deal(i,F[j].a,F[j].c);    }    void construct()    {        if(n<4) return;        int i,j,k=0;        FOR1(i,n-1) if(DB(vlen(p[0]-p[i])))        {            swap(p[1],p[i]);            k=1;            break;        }        if(!k) return;        k=0;        FOR(i,2,n-1) if(DB(getArea(p[0],p[1],p[i])))        {            swap(p[2],p[i]);            k=1;            break;        }        if(!k) return;;        k=0;        FOR(i,3,n-1) if(DB(getVolume(p[0],p[1],p[2],p[i])))        {            swap(p[3],p[i]);            k=1;            break;        }        if(!k) return;        cnt=0;        face temp;        FOR0(i,4)        {            temp=face((i+1)%4,(i+2)%4,(i+3)%4,1);            if(getDir(p[i],temp)>0) swap(temp.b,temp.c);            b[temp.a][temp.b]=b[temp.b][temp.c]=b[temp.c][temp.a]=cnt;            F[cnt++]=temp;        }        FOR(i,4,n-1) FOR0(j,cnt) if(F[j].ok&&getDir(p[i],F[j])>0)        {            DFS(i,j);            break;        }        j=0;        FOR0(i,cnt) if(F[i].ok) F[j++]=F[i];        cnt=j;    }    double getSumArea()    {        double ans=0;        int i;        FOR0(i,cnt) ans+=getArea(p[F[i].a],p[F[i].b],p[F[i].c]);        return ans/2;    }};_3DCH a;int main(){    while(scanf("%d",&a.n)!=-1)    {        int i;        FOR0(i,a.n) a.p[i].Get();        a.construct();        double s=a.getSumArea();        printf("%.3lf\n",s);    }    return 0;}

  

转载地址:http://rmzdl.baihongyu.com/

你可能感兴趣的文章
添加 Pool Member - 每天5分钟玩转 OpenStack(123)
查看>>
NSDECODER v1.0
查看>>
游侠原创:vmware下android-x86-4.4-RC1体验
查看>>
OpenMNS--管理网络的绝好工具
查看>>
ORACLE LINUX 6.1安装过程
查看>>
iPhone/Mac Objective-C内存管理原理
查看>>
整理Silverlight资源列表(三)-SL实际运用案例
查看>>
02-BGP选路原则和属性详解--weight
查看>>
7.[数据结构和算法分析笔记]词典 Dictionary
查看>>
CCNP精粹系列之八----帧中继全网拓扑试验配置
查看>>
Lync升级S4B秘籍,So Easy!!!
查看>>
SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例...
查看>>
android用户界面-组件Widget-进度条ProgressBar
查看>>
猜字谜小游戏编程
查看>>
【OneNote Mobile】 如何处理便签内容的格式?
查看>>
ios开发学习-弹出视图(Popup View) 效果源码分享--系列教程1
查看>>
Algeco Scotsman将召开2016年第三季度业绩电话会议
查看>>
新加坡IMDA计划进行Li-Fi测试
查看>>
《深入理解大数据:大数据处理与编程实践》一一1.3 MapReduce并行计算技术简介...
查看>>
LoadRunner关联的高级应用
查看>>