三维凸包模板
增量算法 复杂度O(n^n)
枚举点集 每次看点与当前所有面的关系 Pr能照到的面删除 剩下的保留搭配np[]
再将交界处的边与Pr的连接面加入np[]
注意需要对数据微小扰动 防止存在四点共面
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int MaxN = 105;
const double eps = 1e-12;
int n,m;//多面体中n个点 m个边
bool vis[MaxN][MaxN];//vis[i][j]:P在i->j面的上面
double rand_eps(){//随机微小扰动 防止四点共面
return ((double)rand() / RAND_MAX - 0.5) * eps;//[-0.5,0.5]*eps
}
struct Point{
double x,y,z;
void shake(){
x += rand_eps();
y += rand_eps();
z += rand_eps();
}
double len(){
return sqrt(x * x + y * y + z * z);
}
Point operator - (Point t){
return {x - t.x,y - t.y,z - t.z};
}
double operator & (Point t){//点积
return (x*t.x +