题意:给出两个四面体的四个顶点坐标(保证四两个面体不相交,且体积大于0),输出两个四面体的最近距离。
题解:要求最近距离分3种情况:
1.顶点到另一个四面体的某面距离
2.顶点到另一个四面体的某条边距离
3.两个四面体的边与边的最短距离(异面线段最短距离)
异面线段最短距离又分两种情况,两条线段所在直线的公垂线的最小距离点对是否都在线段上,如果在那么公垂线的距离就是异面线段最短距离,否则就是两对端点计算四个点距的最短距离了。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps = 1e-9;
const double PI = acos(-1);
struct Point3 {
double x, y, z;
Point3(double x = 0, double y = 0, double z = 0):x(x), y(y), z(z) {}
};
typedef Point3 Vector3;
int dcmp(double x) {
if (fabs(x) < eps)
return 0;
return x < 0 ? -1 : 1;
}
Vector3 operator + (Vector3 A, Vector3 B) { return Vector3(A.x + B.x, A.y + B.y, A.z + B.z); }
Vector3 operator - (Vector3 A, Vector3 B) { return Vector3(A.x - B.x, A.y - B.y, A.z - B.z); }
Vector3 operator * (Vector3 A, double b) { return Vector3(A.x * b, A.y * b, A.z * b); }
Vector3 operator / (Vector3 A,