代码出处不明,但是方法简单,思路清晰,非常值得参考。
如有朋友知道代码出处,请评论里注明,我会加上。
/*
* 用法:
* input: n: 点数
* p[i].x p[i].y p[i].z: 坐标
* solve(): 构建三维凸包
* return : double area(): 凸包表面积
* double volume(): 体积
* int polygon(): 表面三角形数
* int polygon(): 表面多边形数
* Point getcent(): 凸包质心
* double function(Point fuck): 点到凸包上的距离
*/
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int MAXN=505;
const double EPS=1e-8;
struct Point{
double x,y,z;
Point(){}
Point(double xx,double yy,double zz):x(xx),y(yy),z(zz){}
Point operator -(const Point p1){ //两向量之差
return Point(x-p1.x,y-p1.y,z-p1.z);
}
Point operator *(Point p){ //叉乘
return Point(y*p.z-z*p.y,z*p.x-x*p.z,x*p.y-y*p.x);
}
double operator ^(Point p){ //点乘
return (x*p.x+y*p.y+z*p.z);
}
};
struct CH3D{
/*
* 用法:
* input: n: 点数
* p[i].x p[i].y p[i].z: 坐标
* solve(): 构建三维凸包
* return : double area(): 凸包表面积
* double volume(): 体积
* int polygon(): 表面三角形数
* int polygon(): 表面多边