1 三维空间中的共线问题

1.1 如何判断三维空间中的三个点是否共线

在三维空间中,如果三个点共线,就说明这三个点在同一条直线上,就是说这三个点无法组成一个三维平面,即其三个点组成的平面法向量为零向量:(0,0,0)

1.2 使用C++判断三维空间中三个点是否共线

通过上述的分析,我们可以使用C++代码进行实现,示例代码如下

#include <iostream>
#include <math.h>
#define eps 1e-8

struct Point3f
{
    float x;
    float y;
    float z;

    Point3f()
    {
        x = 0.0;
        y = 0.0;
        z = 0.0;
    }

    Point3f(float x_in, float y_in, float z_in)
    {
        x = x_in;
        y = y_in;
        z = z_in;
    }
};

typedef Point3f Vector3f;

// 计算两个三维向量的叉积
Vector3f CrossProduct(Vector3f u, Vector3f v) {
    Vector3f result;
    result.x = u.y * v.z - v.y * u.z;
    result.y = u.z * v.x - u.x * v.z;
    result.z = u.x * v.y - u.y * v.x;
    return result;
}

// 计算两个三维向量的差
Vector3f Sub(Vector3f u, Vector3f v)
{
    Vector3f result;
    result.x = u.x - v.x;
    result.y = u.y - v.y;
    result.z = u.z - v.z;
    return result;
}

// 求解向量大小
double Vlen(Vector3f vec)
{
    return sqrt(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z);
}

// 判断三点是否共线
int IsPointsInline(Point3f p1, Point3f p2, Point3f p3)
{
    return Vlen(CrossProduct(Sub(p1, p2), Sub(p2, p3))) < eps;
}


int main()
{
    Point3f point_a(1.0, 2.0, 3.0);
    Point3f point_b(1.0, 5.0, 6.0);
    Point3f point_c(1.0, 8.0, 9.0);

    int res = IsPointsInline(point_a, point_b, point_c);
    if (res)
    {
        std::cout << "此三点共线" << std::endl;
    }
    else
    {
        std::cout << "此三点不共线" << std::endl;
    }

    return 0;
}

在上述代码中,我们判断了(1.0, 2.0, 3.0)(1.0, 5.0, 6.0)(1.0, 8.0, 9.0)三个点是否共线,从这三个点的坐标上我们可以很清楚的判断这三个点是共线的,上述代码的运行结果也是输出三点共线的。另外为了避免浮点数误差,定义了一个eps做容差,用于规避浮点数误差。