三維凸包之增量演算法

2021-07-09 21:27:15 字數 2624 閱讀 7054

演算法工作過程:

選取點集中的四個點構成乙個初始的四面體:

選兩個點p1, p2,再選乙個點p3,p3和p1, p2不在同一條直線上,這樣形成了乙個面。再選乙個點,不在同乙個面上,形成乙個四面體。

然後繼續研究剩餘的點:

點在四面體內部,略過。

點在四面體外部,刪除此點能「看見」的面,擴大凸包體積。

大意:求解多面體表面積

#include #include #include using namespace std;

const double eps=1e-7;

const int n=5e2+10;

struct point

point(double _x,double _y,double _z):x(_x),y(_y),z(_z) {}

point operator -(const point other)

point operator *(const point other)

double operator ^(const point other)

};struct ch3d;

int n; //初始點數

point p[n]; //初始點

int cnt; //凸包上的三角形

fac f[n*6]; // 被建立的面不超過6n

int vis[n][n];

double vlen(point v)

double area(point p1,point p2,point p3)

double volumn(point p1,point p2,point p3,point p4)

double ptoplane(point p,fac ff)

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

void dfs(int p,int num)

bool same(int s,int e)

}if(jud) return ;

jud=1;

// 三點在面

for(int i=2;ieps)

}if(jud) return ;

jud=1;

// 四點成體

for(int i=3;ieps)

}if(jud) return ;

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

fac add;

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

for(int i=4;ieps)}}

int tmp=cnt;

cnt=0;

for(int i=0;ihdu 3662 

3d convex hull

求解包含所有點的最小多面體的表面上面的個數

#include #include #include using namespace std;

const double eps=1e-7;

const int n=5e2+10;

struct point

point(double _x,double _y,double _z):x(_x),y(_y),z(_z) {}

point operator -(const point other)

point operator *(const point other)

double operator ^(const point other)

};struct ch3d;

int n; //初始點數

point p[n]; //初始點

int cnt; //凸包上的三角形

fac f[n*6]; // 被建立的面不超過6n

int vis[n][n];

double vlen(point v)

double area(point p1,point p2,point p3)

double volumn(point p1,point p2,point p3,point p4)

double ptoplane(point p,fac ff)

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

void dfs(int p,int num)

bool same(int s,int e)

}if(jud) return ;

jud=1;

// 三點在面

for(int i=2;ieps)

}if(jud) return ;

jud=1;

// 四點成體

for(int i=3;ieps)

}if(jud) return ;

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

fac add;

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

for(int i=4;ieps)}}

int tmp=cnt;

cnt=0;

for(int i=0;i

BZOJ1209 最佳包裹 (三維凸包 增量法)

求三維凸包的表面積。n 100 n le100 n 100 暴力往當前的凸包裡加點。o n 2 o n 2 o n2 題解詳見大佬部落格 擾動函式sha keshake shak e是為了避免四點共面。實測e ps epsep s開到1e 101e 10 1e 10才過 include using ...

BZOJ1209 最佳包裹 (三維凸包 增量法)

求三維凸包的表面積。n 100n 1 00暴力往當前的凸包裡加點。o n 2 o n2 題解詳見大佬部落格 擾動函式sha kesh ake是為了避免四點共面。實測epse ps開到1e 10 1e 1 0才過 include using namespace std define il inline...

uvalive5090 三維凸包

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