luogu P4724 模板 三維凸包

2022-02-04 18:11:54 字數 2263 閱讀 2345

link:三維凸包

乙個非常古老的知識點。估計也沒啥用。

大體上了解了過程 能背下來就背下來吧.

乙個bf:暴力列舉三個點 此時只需要判斷所有的點都在這個面的另外一側就可以說明這個面是三維凸包上的面了。

乙個問題 :多點共面問題。乙個trick:可以利用擾動法然後 就可以解決這個問題了。

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

先加入三個不共線的點組成乙個面(正反兩面然後不斷加入點。

然後考慮每乙個點 刪除這個點可以看到的面 然後邊界與新加入的點連邊即可。

具體理解看**(我也有點迷。。

code

//#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define db double

#define inf 1000000000

#define ldb long double

#define pb push_back

#define put_(x) printf("%d ",x);

#define get(x) x=read()

#define gt(x) scanf("%d",&x)

#define gi(x) scanf("%lf",&x)

#define put(x) printf("%d\n",x)

#define putl(x) printf("%lld\n",x)

#define gc(a) scanf("%s",a+1)

#define rep(p,n,i) for(re int i=p;i<=n;++i)

#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])

#define fep(n,p,i) for(re int i=n;i>=p;--i)

#define vep(p,n,i) for(re int i=p;i#define mk make_pair

#define re register

#define p 1000000007

#define gf(x) scanf("%lf",&x)

#define pf(x) ((x)*(x))

#define uint unsigned long long

#define ui unsigned

#define eps 1e-9

#define sq sqrt

#define mod 998244353

#define s second

#define f first

#define op(x) t[x].op

#define d(x) t[x].d

#define set(a,v) memset(a,v,sizeof(a))

#define pf(x) ((x)*(x))

using namespace std;

char buf[1<<15],*fs,*ft;

inline char getc()

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}const int maxn=2010;

int n,cnt;

int vis[maxn][maxn];

db ans=0;

db rand()

db reps()

struct vec

//擾動.

db len()

vec operator -(vec a);}

vec operator %(vec a);}

db operator *(vec a)

}a[maxn];

typedef vec point;

struct wy

db area()

}f[maxn],c[maxn];

inline bool pd(wy c,vec b)

inline void convex_3d()

rep(1,cnt,j)

}} rep(1,cc,j)f[j]=c[j];

cnt=cc; }}

int main()

P4724 模板 三維凸包 簡潔

給出空間中n個點,求凸包表面積。第一行乙個整數n,表示點數。接下來n行,每行三個實數x,y,z描述座標。輸出凸包表面積,保留3位小數。輸入 1 4 0 0 0 1 0 0 0 1 0 0 0 1 輸出 1 2.366 n 2000 include 三維凸包 using namespace std c...

uvalive5090 三維凸包

題意 給出一些三維的點,求出乙個凸包,輸出凸包有多少個表面。思路 模板。隊友找了乙個巨全面的模板,貼過來。include include include include includeusing namespace std const int maxn 550 const double eps 1e...

三維凸包之增量演算法

演算法工作過程 選取點集中的四個點構成乙個初始的四面體 選兩個點p1,p2,再選乙個點p3,p3和p1,p2不在同一條直線上,這樣形成了乙個面。再選乙個點,不在同乙個面上,形成乙個四面體。然後繼續研究剩餘的點 點在四面體內部,略過。點在四面體外部,刪除此點能 看見 的面,擴大凸包體積。大意 求解多面...