演算法工作過程:
選取點集中的四個點構成乙個初始的四面體:
選兩個點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...