网上找了一个三维计算几何模版,完善了一下,使它能使用了...
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
/***********基础*************/
const double EPS=0.000001;
typedef struct Point_3D {
double x, y, z;
Point_3D(double xx = 0, double yy = 0, double zz = 0): x(xx), y(yy), z(zz) {}
bool operator == (const Point_3D& A) const {
return x==A.x && y==A.y && z==A.z;
}
}Vector_3D;
Point_3D read_Point_3D() {
double x,y,z;
scanf("%lf%lf%lf",&x,&y,&z);
return Point_3D(x,y,z);
}
Vector_3D operator + (const Vector_3D & A, const Vector_3D & B) {
return Vector_3D(A.x + B.x, A.y + B.y, A.z + B.z);
}
Vector_3D operator - (const Point_3D & A, const Point_3D & B) {
return Vector_3D(A.x - B.x, A.y - B.y, A.z - B.z);
}
Vector_3D operator * (const Vector_3D & A, double p) {
return Vector_3D(A.x * p, A.y * p, A.z * p);
}
Vector_3D operator / (const Vector_3D & A, double p) {
return Vector_3D(A.x / p, A.y / p, A.z / p);
}
double Dot(const Vector_3D & A, const Vector_3D & B) {
return A.x * B.x + A.y * B.y + A.z * B.z;
}
double Length(const Vector_3D & A) {
return sqrt(Dot(A, A));
}
double Angle(const Vector_3D & A, const Vector_3D & B) {
return acos(Dot(A, B) / Length(A) / Length(B));
}
Vector_3D Cross(const Vector_3D & A, const Vector_3D & B) {
return Vector_3D(A.y * B.z - A.z * B.y, A.z * B.x - A.x * B.z, A.x * B.y - A.y * B.x);
}
double Area2(const Point_3D & A, const Point_3D & B, const Point_3D & C) {
return Length(Cross(B - A, C - A));
}
double Volume6(const Point_3D & A, const Point_3D & B, const Point_3D & C, const Point_3D & D) {
return Dot(D - A, Cross(B - A, C - A));
}
// 四面体的重心
Point_3D Centroid(const Point_3D & A, const Point_3D & B, const Point_3D & C, const Point_3D & D) {
return (A + B + C + D) / 4.0;
}
/************点线面*************/
// 点p到平面p0-n的距离。n必须为单位向量