LINK:三维凸包

一个非常古老的知识点。估计也没啥用。

大体上了解了过程 能背下来就背下来吧.

一个bf:暴力枚举三个点 此时只需要判断所有的点都在这个面的另外一侧就可以说明这个面是三维凸包上的面了。

一个问题 :多点共面问题。一个trick:可以利用扰动法然后 就可以解决这个问题了。

正解:\(n^2\)的增量法求三维凸包。

先加入三个不共线的点组成一个面(正反两面然后不断加入点。

然后考虑每一个点 删除这个点可以看到的面 然后边界与新加入的点连边即可。

具体理解看代码(我也有点迷。。

code
  1. //#include<bits\stdc++.h>
  2. #include<iostream>
  3. #include<iomanip>
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<string>
  7. #include<ctime>
  8. #include<cmath>
  9. #include<cctype>
  10. #include<cstdlib>
  11. #include<queue>
  12. #include<deque>
  13. #include<stack>
  14. #include<vector>
  15. #include<algorithm>
  16. #include<utility>
  17. #include<bitset>
  18. #include<set>
  19. #include<map>
  20. #define ll long long
  21. #define db double
  22. #define INF 1000000000
  23. #define ldb long double
  24. #define pb push_back
  25. #define put_(x) printf("%d ",x);
  26. #define get(x) x=read()
  27. #define gt(x) scanf("%d",&x)
  28. #define gi(x) scanf("%lf",&x)
  29. #define put(x) printf("%d\n",x)
  30. #define putl(x) printf("%lld\n",x)
  31. #define gc(a) scanf("%s",a+1)
  32. #define rep(p,n,i) for(RE int i=p;i<=n;++i)
  33. #define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
  34. #define fep(n,p,i) for(RE int i=n;i>=p;--i)
  35. #define vep(p,n,i) for(RE int i=p;i<n;++i)
  36. #define pii pair<int,int>
  37. #define mk make_pair
  38. #define RE register
  39. #define P 1000000007
  40. #define gf(x) scanf("%lf",&x)
  41. #define pf(x) ((x)*(x))
  42. #define uint unsigned long long
  43. #define ui unsigned
  44. #define EPS 1e-9
  45. #define sq sqrt
  46. #define mod 998244353
  47. #define S second
  48. #define F first
  49. #define op(x) t[x].op
  50. #define d(x) t[x].d
  51. #define Set(a,v) memset(a,v,sizeof(a))
  52. #define pf(x) ((x)*(x))
  53. using namespace std;
  54. char buf[1<<15],*fs,*ft;
  55. inline char getc()
  56. {
  57. return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
  58. }
  59. inline int read()
  60. {
  61. RE int x=0,f=1;RE char ch=getc();
  62. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
  63. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
  64. return x*f;
  65. }
  66. const int MAXN=2010;
  67. int n,cnt;
  68. int vis[MAXN][MAXN];
  69. db ans=0;
  70. db Rand(){return rand()/(db)RAND_MAX;}
  71. db reps() {return (Rand()-0.5)*EPS;}
  72. struct Vec
  73. {
  74. db x,y,z;
  75. void shake(){x+=reps();y+=reps();z+=reps();}//扰动.
  76. db len(){return sq(pf(x)+pf(y)+pf(z));}
  77. Vec operator -(Vec a){return (Vec){x-a.x,y-a.y,z-a.z};}
  78. Vec operator %(Vec a){return (Vec){y*a.z-z*a.y,z*a.x-x*a.z,x*a.y-y*a.x};}
  79. db operator *(Vec a){return x*a.x+y*a.y+z*a.z;}
  80. }a[MAXN];
  81. typedef Vec point;
  82. struct wy
  83. {
  84. int v[3];
  85. Vec Nor(){return (a[v[1]]-a[v[0]])%(a[v[2]]-a[v[0]]);}
  86. db area(){return Nor().len()/2.0;}
  87. }f[MAXN],c[MAXN];
  88. inline bool pd(wy c,Vec b){return ((b-a[c.v[0]])*c.Nor())>0;}
  89. inline void Convex_3D()
  90. {
  91. f[cnt=1].v[0]=1;
  92. f[cnt=1].v[1]=2;
  93. f[cnt=1].v[2]=3;
  94. f[cnt=2].v[0]=3;
  95. f[cnt=2].v[1]=2;
  96. f[cnt=2].v[2]=1;
  97. rep(4,n,i)
  98. {
  99. int cc=0;
  100. rep(1,cnt,j)
  101. {
  102. int ww=pd(f[j],a[i]);
  103. if(!ww)c[++cc]=f[j];
  104. rep(0,2,k)vis[f[j].v[k]][f[j].v[(k+1)%3]]=ww;
  105. }
  106. rep(1,cnt,j)
  107. {
  108. rep(0,2,k)
  109. {
  110. int x=f[j].v[k],y=f[j].v[(k+1)%3];
  111. if(vis[x][y]&&!vis[y][x])
  112. {
  113. c[++cc].v[0]=x;c[cc].v[1]=y;c[cc].v[2]=i;
  114. }
  115. }
  116. }
  117. rep(1,cc,j)f[j]=c[j];
  118. cnt=cc;
  119. }
  120. }
  121. int main()
  122. {
  123. freopen("1.in","r",stdin);
  124. gt(n);rep(1,n,i)scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z),a[i].shake();
  125. Convex_3D();rep(1,cnt,i)ans+=f[i].area();
  126. printf("%.3lf",ans);return 0;
  127. }

luogu P4724 模板 三维凸包的更多相关文章

  1. [Luogu4724][模板]三维凸包(增量构造法)

    1.向量点积同二维,x1y1+x2y2+x3y3.向量叉积是行列式形式,(y1z2-z1y2,z1x2-x1z2,x1y2-y1x2). 2.增量构造法: 1)首先定义,一个平面由三个点唯一确定.一个 ...

  2. 题解-洛谷P4724 【模板】三维凸包

    洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...

  3. Luogu P2742 模板-二维凸包

    Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...

  4. Luogu 4724 三维凸包

    Luogu 4724 三维凸包 增量法,维护当前凸包,每次加入一个点 \(P\) ,视其为点光源,将可见面删去,新增由"晨昏线"(分割棱)与 \(P\) 构成的平面. 注意每个平面 ...

  5. hdu4266(三维凸包模板题)

    /*给出三维空间中的n个顶点,求解由这n个顶点构成的凸包表面的多边形个数. 增量法求解:首先任选4个点形成的一个四面体,然后每次新加一个点,分两种情况: 1> 在凸包内,则可以跳过 2> ...

  6. POJ3528 HDU3662 三维凸包模板

    POJ3528 HDU3662 第一道题 给定若干点 求凸包的表面积,第二题 给定若干点就凸包的面数. 简单说一下三维凸包的求法,首先对于4个点假设不共面,确定了唯一四面体,对于一个新的点,若它不在四 ...

  7. POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心

    题意: 两个凸多面体,可以任意摆放,最多贴着,问他们重心的最短距离. 解法: 由于给出的是凸多面体,先构出两个三维凸包,再求其重心,求重心仿照求三角形重心的方式,然后再求两个多面体的重心到每个多面体的 ...

  8. hdu4273Rescue(三维凸包重心)

    链接 模板题已不叫题.. 三维凸包+凸包重心+点到平面距离(体积/点积)  体积-->混合积(先点乘再叉乘) #include <iostream> #include<cstd ...

  9. hdu 4273 2012长春赛区网络赛 三维凸包中心到最近面距离 ***

    新模板 /* HDU 4273 Rescue 给一个三维凸包,求重心到表面的最短距离 模板题:三维凸包+多边形重心+点面距离 */ #include<stdio.h> #include&l ...

随机推荐

  1. Hills——一道转移方程很“有趣”的线性DP

    题目描述 Welcome to Innopolis city. Throughout the whole year, Innopolis citizens suffer from everlastin ...

  2. Git篇---将秘钥添加到github

    第1步:创建SSH Key.在用户主目录下,看看有没有-/.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步.如果没有,打开She ...

  3. Kail系统更新指令

    0x00源更新 国内更新源 leafpad /etc/apt/sources.list 然后复制粘贴下面的源 #kali官方源 deb http://http.kali.org/kali kali-r ...

  4. Node js 入门指南(1)

    目录 Node Js 定义 特点 Node使用方式 Tip: 使用导出文件的注意事项 Node 内置模块 http 模块 定义 使用方法 fs 模块 定义 使用方法 读取文件方式 同步读取 异步读取 ...

  5. 机器学习实战基础(十二):sklearn中的数据预处理和特征工程(五) 数据预处理 Preprocessing & Impute 之 处理分类特征:处理连续性特征 二值化与分段

    处理连续性特征 二值化与分段 sklearn.preprocessing.Binarizer根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量.大于阈值的值映射为1,而小于或等于阈值的值 ...

  6. 数据可视化之DAX篇(九) 关于DAX中的VAR,你应该避免的一个常见错误

    https://zhuanlan.zhihu.com/p/67803111 本文源于微博上一位朋友的问题,在计算同比增长率时,以下两种DAX代码有什么不同? -------------------- ...

  7. 【Nginx】如何封禁IP和IP段?看完这篇我会了!!

    写在前面 Nginx不仅仅只是一款反向代理和负载均衡服务器,它还能提供很多强大的功能,例如:限流.缓存.黑白名单和灰度发布等等.在之前的文章中,我们已经介绍了Nginx提供的这些功能.小伙伴们可以到[ ...

  8. 基于SSM框架的简单问答社区

    前言:学习了Spring.SpringMVC.MyBatis框架后,开发了一套简单的问答社区,前端采用Bootstrap开发框架. 版本信息 IDEA:2020.1.2 JDK:14.0.1 Mave ...

  9. .NET 开源项目 StreamJsonRpc 介绍[下篇]

    阅读本文大概需要 9 分钟. 大家好,这是 .NET 开源项目 StreamJsonRpc 介绍的最后一篇.上篇介绍了一些预备知识,包括 JSON-RPC 协议介绍,StreamJsonRpc 是一个 ...

  10. MacOS系统隐藏文件操作

    显示或关闭隐藏文件 显示:defaults write com.apple.finder AppleShowAllFiles -bool true ; killall Finder隐藏:default ...