题意:给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面)。如果共面,输出"Yes",否则输出"No"。


题解:很容易想到,如果四点共面,那么从分别从两个对点出发的两个向量的叉积必然平行。然后就是代码模板套上即可。


代码:

#include <bits/stdc++.h>
using namespace std;
const double eps=1e-12;
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;
Vector3 operator-(Point3 A, Point3 B){
    return Vector3(A.x-B.x, A.y-B.y, A.z-B.z);
}
double Dot(Vector3 A, Vector3 B){
    return A.x*B.x+A.y*B.y+A.z*B.z;
}
double Length(Vector3 A){
    return sqrt(Dot(A, A));
}
Vector3 Cross(Vector3 A, Vector3 B){
    return Vector3(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(Vector3 A, Vector3 B){
    return Length(Cross(A, B));
}
double dcmp(double x){
    if(fabs(x)<eps)return 0;else return x<0?-1:1;
}
int n;
int main()
{
    scanf("%d", &n);
    while(n--){
        Point3 p1,p2,p3,p4;
        scanf("%lf%lf%lf", &p1.x, &p1.y, &p1.z);
        scanf("%lf%lf%lf", &p2.x, &p2.y, &p2.z);
        scanf("%lf%lf%lf", &p3.x, &p3.y, &p3.z);
        scanf("%lf%lf%lf", &p4.x, &p4.y, &p4.z);
        Vector3 tv1=p1-p2, tv2=p3-p2, tv3=p1-p4, tv4=p3-p4;
        Vector3 v1=Cross(tv1, tv2), v2=Cross(tv3, tv4);
        double ans=Area2(v1, v2);
        printf("%s\n", ans?"No":"Yes");
    }
    return 0;
}