題意:
給出一些三維的點,求出乙個凸包,輸出凸包有多少個表面。
思路:
模板。。。隊友找了乙個巨全面的模板,貼過來。
**:
#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...