点(Point)
struct point{
double x, y, z;
};
double volume(point a, point b, point c, point d) { return dot(cross(b - a, c - a), d - a); } // 返回混合积[b-a c-a d-a],等价于(a->b->c)->d三棱锥的有向体积
- 其他函数也都要改成三维的,因为忘记加第三维出过bug。
平面(Plane)
struct plane{
int v[3]; // 每个面的点规定都是逆时针储存的
point norm() { return cross(P[v[1]] - P[v[0]], P[v[2]] - P[v[0]]); } // 法向量
double area() { return length(norm()) / 2; } // 三点围成的有向面积
bool above(point a) { return dot(a - P[v[0]], norm()) >= 0; } // 判断点是否在面的上方
double dis(point a) { return project(a - P[v[0]], norm()); } //点到面的有向距离
double volume(point a) { return dot(norm(), a - P[v[0]]); } //返回六面体的体积
};