题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3662

题意:求三维凸包面的个数。

思路:模板。

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上返回0int 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;}int isSame(face a,face b){Point x1=p[a.a],y1=p[a.b],z1=p[a.c];Point x2=p[b.a],y2=p[b.b],z2=p[b.c];if(DB(getVolume(x1,y1,z1,x2))) return 0;if(DB(getVolume(x1,y1,z1,y2))) return 0;if(DB(getVolume(x1,y1,z1,z2))) return 0;return 1;}int getFactNum(){int ans=0,i,j;FOR0(i,cnt){FOR(j,i+1,cnt-1) if(isSame(F[i],F[j])){break;}ans+=j>=cnt;}return ans;}
};_3DCH a;int main()
{while(scanf("%d",&a.n)!=-1){int i;FOR0(i,a.n) a.p[i].Get();a.construct();int s=a.getFactNum();printf("%d\n",s);}return 0;
}

  

HDU 3662 3D Convex Hull(三维凸包面的个数)相关推荐

  1. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他...

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  2. HDU3662(求三维凸包表面的多边形个数,表面三角形个数,体积,表面积,凸包重心,凸包中点到面的距离)

    题目:3D Convex Hull   题意:给定空间中的n个点,求这n个点形成的凸包的表面的多边形个数. 增量法求解:首先任选4个点形成的一个四面体,然后每次新加一个点,分两种情况: 1> 在 ...

  3. 清华计算几何大作业(一):CG2017 PA1-1 Convex Hull (凸包)

    CG2017 PA1-1 Convex Hull (凸包) 1. 前置知识 2. 思路分析 3. 伪代码 4. 可视化结果示例 5. 项目代码(待更新完整) 1.1.1 Numerical Tests ...

  4. 寻找凸包 (Convex Hull)

    凸包问题是算法中经典的题目了,最近算法课讲分治问题时提到了Convex Hull,算法导论的书上也花了篇幅讨论了Convex Hull的求解,主要是Graham方法. 为了能更好地理解分治和Graha ...

  5. P6810 「MCOI-02」Convex Hull 凸包

    P6810 「MCOI-02」Convex Hull 凸包 思路 ∑i=1n∑j=1mτ(i)τ(j)τ(gcd(i,j))∑d=1nτ(d)∑i=1nd∑j=1mdτ(id)τ(id)[gcd(i, ...

  6. R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集)、ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull)

    R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集).ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull) 目录

  7. OpenCV 凸包Convex Hull

    OpenCV 凸包Convex Hull 凸包Convex Hull 目标 代码 结果 凸包Convex Hull 目标 在本教程中,您将学习如何: 使用OpenCV函数cv :: convexHul ...

  8. MATLAB凸包Convex hull运算

    凸包Convex hull运算(求离散点的边界) [k,a] = convhull(x,y); K = convulln(X, options); [K AV] = convexHull(DT); t ...

  9. Monotone Chain Convex Hull(单调链凸包)

    1 Monotone Chain Convex Hull(单调链凸包)算法伪代码: 2 //输入:一个在平面上的点集P 3 //点集 P 按 先x后y 的递增排序 4 //m 表示共a[i=0...m ...

最新文章

  1. SDWebImage
  2. 刷新器-Java EE 7后端十大功能
  3. 波士顿大学计算机与传媒专业,波士顿大学传媒专业好吗
  4. bash 历史记录_您将实际使用的7个Bash历史记录快捷方式
  5. zstd安装_在ARM架构服务器上编译Greenplum6并制作rpm安装包
  6. bert模型可以做文本主题识别吗_BERT模型可以使用无监督的方法做文本相似度任务吗?...
  7. Radius认证协议(六)报文属性
  8. 快半步是天才,快一步是疯子,马云14年前错失一个“微信”?
  9. 富士服务器A系列说明书,富士伺服驱动器FALDIC-用户手册.pdf
  10. java学习(类和对象)
  11. 蜜蜂在挡板外和框梁顶造赘脾的几个要素及处理方法
  12. 将mp4文件转换为flv
  13. Cloudsim和算法
  14. 人工智能对客服职业的影响
  15. 永磁电机风力发电机原理及并网实验系统QY-TF18
  16. Java视频修改分辨率(附代码) | Java工具类
  17. 后台管理系统--首页及登录认证
  18. 烟台中学2021年高考成绩查询,烟台中学排名前十名,2021年烟台中学排名一览表
  19. 钉钉扫码登录网站(两种方式实现)
  20. 段码LCD研究 | 用HT1621B驱动段码LCD屏

热门文章

  1. GoLang的逃逸分析
  2. Linux中用户的简介与管理
  3. vuex:弄懂mapState、mapGetters、mapMutations、mapActions
  4. linux tomcat 改端口号,Ubuntu中Tomcat更改80端口
  5. iscsi存储常见错误
  6. 给,你要的Go学习路线图来啦
  7. Laravel服务提供器
  8. ConcurrentProgramming:Atomic 原子类
  9. MongoDB常用使用场景介绍
  10. Docker容器(container)详解