uvalive5090 三維凸包

2021-07-05 02:35:29 字數 1596 閱讀 3602

題意:

給出一些三維的點,求出乙個凸包,輸出凸包有多少個表面。

思路:

模板。。。隊友找了乙個巨全面的模板,貼過來。

**:

#include#include#include#include#includeusing namespace std;

const int maxn=550;

const double eps=1e-8;

struct point

point(double xx,double yy,double zz):x(xx),y(yy),z(zz){}

//兩向量之差

point operator -(const point p1)

//兩向量之和

point operator +(const point p1)

//叉乘

point operator *(const point p)

point operator *(double d)

point operator / (double d)

//點乘

double operator ^(point p)

};struct ch3d

; //初始頂點數

int n;

//初始頂點

point p[maxn];

//凸包表面的三角形數

int num;

//凸包表面的三角形

face f[8*maxn];

//凸包表面的三角形

int g[maxn][maxn];

//向量長度

double vlen(point a)

//叉乘

point cross(const point &a,const point &b,const point &c)

//三角形面積*2

double area(point a,point b,point c)

//四面體有向體積*6

double volume(point a,point b,point c,point d)

//正:點在麵同向

double dblcmp(point &p,face &f)

void deal(int p,int a,int b)}}

void dfs(int p,int now)//遞迴搜尋所有應該從凸包內刪除的面

bool same(int s,int t)

}if(flag)return;

flag=true;

//使前三個點不共線

for(i=2;ieps)

}if(flag)return;

flag=true;

//使前四個點不共面

for(int i=3;ieps)

}if(flag)return;

//*****************************************

for(i=0;i<4;i++)

for(i=4;ieps)}}

tmp=num;

for(i=num=0;i

三維凸包之增量演算法

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

三維凸包 BZOJ 最佳包裹

模板題解 增量法怎麼這麼強啊。擾動很重要,直接掛50分。判斷可視邊緣的方法很神奇,將每個三角面的三邊順方向打有向標記,那麼只有乙個方向有邊的點對就是邊緣點對,直接建面。總的面數是o n o n o n 複雜度為o n 2 o n 2 o n2 可以用乙個有理有據但是有點麻煩的優化 可以做到o n l...

三維凸包板子 hdu 4273

hdu 4273 rescue 給乙個三維凸包,求重心到表面的最短距離 模板題 三維凸包 多邊形重心 點麵距離 include include include include includeusing namespace std const int maxn 550 const double eps...