#include #include

using namespace std;

class Point { private: double x, y, z; public: Point(double xx = 0, double yy = 0, double zz = 0) { x = xx; y = yy; z = zz; } double getX() { return x; } double getY() { return y; } double getZ() { return z; } };

class Line { private: Point p1, p2; public: Line(Point pp1, Point pp2) { p1 = pp1; p2 = pp2; } double distance(Point p) { double x0 = p.getX(); double y0 = p.getY(); double z0 = p.getZ(); double x1 = p1.getX(); double y1 = p1.getY(); double z1 = p1.getZ(); double x2 = p2.getX(); double y2 = p2.getY(); double z2 = p2.getZ();

    double a = y1 * (z2 - z0) + y2 * (z0 - z1) + y0 * (z1 - z2);
    double b = z1 * (x2 - x0) + z2 * (x0 - x1) + z0 * (x1 - x2);
    double c = x1 * (y2 - y0) + x2 * (y0 - y1) + x0 * (y1 - y2);
    double d = -x1 * (y2 * z0 - y0 * z2) - x2 * (y0 * z1 - y1 * z0) - x0 * (y1 * z2 - y2 * z1);
    
    double distance = abs(a * x0 + b * y0 + c * z0 + d) / sqrt(a * a + b * b + c * c);
    
    return distance;
}

};

class Plane { private: double a, b, c, d; public: Plane(double aa, double bb, double cc, double dd) { a = aa; b = bb; c = cc; d = dd; } double distance(Point p) { double x0 = p.getX(); double y0 = p.getY(); double z0 = p.getZ();

    double distance = abs(a * x0 + b * y0 + c * z0 + d) / sqrt(a * a + b * b + c * c);
    
    return distance;
}

};

double distance(Point p1, Point p2) { double x1 = p1.getX(); double y1 = p1.getY(); double z1 = p1.getZ(); double x2 = p2.getX(); double y2 = p2.getY(); double z2 = p2.getZ();

double distance = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1));

return distance;

}

double dotProduct(Point p1, Point p2) { double x1 = p1.getX(); double y1 = p1.getY(); double z1 = p1.getZ(); double x2 = p2.getX(); double y2 = p2.getY(); double z2 = p2.getZ();

double dotProduct = x1 * x2 + y1 * y2 + z1 * z2;

return dotProduct;

}

Point crossProduct(Point p1, Point p2) { double x1 = p1.getX(); double y1 = p1.getY(); double z1 = p1.getZ(); double x2 = p2.getX(); double y2 = p2.getY(); double z2 = p2.getZ();

double x = y1 * z2 - y2 * z1;
double y = z1 * x2 - z2 * x1;
double z = x1 * y2 - x2 * y1;

Point result(x, y, z);

return result;

}

bool isParallel(Line l1, Line l2) { Point p1 = l1.getP1(); Point p2 = l1.getP2(); Point p3 = l2.getP1(); Point p4 = l2.getP2();

Point v1(p2.getX() - p1.getX(), p2.getY() - p1.getY(), p2.getZ() - p1.getZ());
Point v2(p4.getX() - p3.getX(), p4.getY() - p3.getY(), p4.getZ() - p3.getZ());

Point v = crossProduct(v1, v2);

if (v.getX() == 0 && v.getY() == 0 && v.getZ() == 0) {
    return true;
}
return false;

}

bool isPerpendicular(Line l, Plane p) { Point p1 = l.getP1(); Point p2 = l.getP2();

double a = p.getA();
double b = p.getB();
double c = p.getC();

Point v(p2.getX() - p1.getX(), p2.getY() - p1.getY(), p2.getZ() - p1.getZ());
Point n(a, b, c);

if (dotProduct(v, n) == 0) {
    return true;
}
return false;

}

int main() { int choice;

Point p1(1, 2, 3);
Point p2(4, 5, 6);
Line l(p1, p2);
Plane pl(1, 2, 3, 4);

while (true) {
    cout << '创建直线:' << endl;
    cout << '1.两点式创建直线' << endl;
    cout << '2.一般式创建直线' << endl;
    cout << '3.点斜式创建直线' << endl;
    cout << '****************************' << endl;
    cout << '创建平面:' << endl;
    cout << '4.标准式创建平面' << endl;
    cout << '5.三点成面' << endl;
    cout << '****************************' << endl;
    cout << '计算距离:' << endl;
    cout << '6.计算两点间距' << endl;
    cout << '7.计算点到直线距离' << endl;
    cout << '8.计算点到平面的距离' << endl;
    cout << '****************************' << endl;
    cout << '计算单位向量:' << endl;
    cout << '9.计算空间直线单位方向向量' << endl;
    cout << '10.计算空间平面单位法向量' << endl;
    cout << '****************************' << endl;
    cout << '判断位置关系:' << endl;
    cout << '11.判断点线关系' << endl;
    cout << '12.判断线线关系' << endl;
    cout << '13.判断点面关系' << endl;
    cout << '14.判断线面关系' << endl;
    cout << '15.判断面面关系' << endl;
    cout << '****************************' << endl;
    cout << '0.退出程序' << endl;
    cout << '请选择:';
    cin >> choice;
    
    if (choice == 0) {
        break;
    }
    else if (choice == 1) {
        double x1, y1, z1, x2, y2, z2;
        cout << '请输入两点的坐标:' << endl;
        cout << '第一个点的x坐标:';
        cin >> x1;
        cout << '第一个点的y坐标:';
        cin >> y1;
        cout << '第一个点的z坐标:';
        cin >> z1;
        cout << '第二个点的x坐标:';
        cin >> x2;
        cout << '第二个点的y坐标:';
        cin >> y2;
        cout << '第二个点的z坐标:';
        cin >> z2;
        
        Point p1(x1, y1, z1);
        Point p2(x2, y2, z2);
        
        Line l(p1, p2);
    }
    else if (choice == 2) {
        double a, b, c, d;
        cout << '请输入一般式直线的参数:' << endl;
        cout << 'a:';
        cin >> a;
        cout << 'b:';
        cin >> b;
        cout << 'c:';
        cin >> c;
        cout << 'd:';
        cin >> d;
        
        Line l(a, b, c, d);
    }
    else if (choice == 3) {
        double x, y, z, m, n, p;
        cout << '请输入点斜式直线的参数:' << endl;
        cout << '直线上的一点的坐标:' << endl;
        cout << 'x:';
        cin >> x;
        cout << 'y:';
        cin >> y;
        cout << 'z:';
        cin >> z;
        cout << '直线的方向向量:' << endl;
        cout << 'm:';
        cin >> m;
        cout << 'n:';
        cin >> n;
        cout << 'p:';
        cin >> p;
        
        Point p(x, y, z);
        Point v(m, n, p);
        
        Line l(p, v);
    }
    else if (choice == 4) {
        double a, b, c, d;
        cout << '请输入标准式平面的参数:' << endl;
        cout << 'a:';
        cin >> a;
        cout << 'b:';
        cin >> b;
        cout << 'c:';
        cin >> c;
        cout << 'd:';
        cin >> d;
        
        Plane pl(a, b, c, d);
    }
    else if (choice == 5) {
        double x1, y1, z1, x2, y2, z2, x3, y3, z3;
        cout << '请输入三个点的坐标:' << endl;
        cout << '第一个点的x坐标:';
        cin >> x1;
        cout << '第一个点的y坐标:';
        cin >> y1;
        cout << '第一个点的z坐标:';
        cin >> z1;
        cout << '第二个点的x坐标:';
        cin >> x2;
        cout << '第二个点的y坐标:';
        cin >> y2;
        cout << '第二个点的z坐标:';
        cin >> z2;
        cout << '第三个点的x坐标:';
        cin >> x3;
        cout << '第三个点的y坐标:';
        cin >> y3;
        cout << '第三个点的z坐标:';
        cin >> z3;
        
        Point p1(x1, y1, z1);
        Point p2(x2, y2, z2);
        Point p3(x3, y3, z3);
        
        Plane pl(p1, p2, p3);
    }
    else if (choice == 6) {
        double x1, y1, z1, x2, y2, z2;
        cout << '请输入两点的坐标:' << endl;
        cout << '第一个点的x坐标:';
        cin >> x1;
        cout << '第一个点的y坐标:';
        cin >> y1;
        cout << '第一个点的z坐标:';
        cin >> z1;
        cout << '第二个点的x坐标:';
        cin >> x2;
        cout << '第二个点的y坐标:';
        cin >> y2;
        cout << '第二个点的z坐标:';
        cin >> z2;
        
        Point p1(x1, y1, z1);
        Point p2(x2, y2, z2);
        
        double distance = distance(p1, p2);
        cout << '两点间的距离为:' << distance << endl;
    }
    else if (choice == 7) {
        double x, y, z;
        cout << '请输入点的坐标:' << endl;
        cout << 'x:';
        cin >> x;
        cout << 'y:';
        cin >> y;
        cout << 'z:';
        cin >> z;
        
        Point p(x, y, z);
        
        double distance = l.distance(p);
        cout << '点到直线的距离为:' << distance << endl;
    }
    else if (choice == 8) {
        double x, y, z;
        cout << '请输入点的坐标:' << endl;
        cout << 'x:';
        cin >> x;
        cout << 'y:';
        cin >> y;
        cout << 'z:';
        cin >> z;
        
        Point p(x, y, z);
        
        double distance = pl.distance(p);
        cout << '点到平面的距离为:' << distance << endl;
    }
    else if (choice == 9) {
        Point p1 = l.getP1();
        Point p2 = l.getP2();
        
        double x1 = p1.getX();
        double y1 = p1.getY();
        double z1 = p1.getZ();
        double x2 = p2.getX();
        double y2 = p2.getY();
        double z2 = p2.getZ();
        
        double x = x2 - x1;
        double y = y2 - y1;
        double z = z2 - z1;
        
        double length = sqrt(x * x + y * y + z * z);
        
        cout << '空间直线的单位方向向量为:' << '(' << x / length << ', ' << y / length << ', ' << z / length << ')' << endl;
    }
    else if (choice == 10) {
        double a = pl.getA();
        double b = pl.getB();
        double c = pl.getC();
        
        double length = sqrt(a * a + b * b + c * c);
        
        cout << '空间平面的单位法向量为:' << '(' << a / length << ', ' << b / length << ', ' << c / length << ')' << endl;
    }
    else if (choice == 11) {
        double x, y, z;
        cout << '请输入点的坐标:' << endl;
        cout << 'x:';
        cin >> x;
        cout << 'y:';
        cin >> y;
        cout << 'z:';
        cin >> z;
        
        Point p(x, y, z);
        
        if (l.contains(p)) {
            cout << '点在直线上' << endl;
        }
        else {
            cout << '点不在直线上' << endl;
        }
    }
    else if (choice == 12) {
        if (isParallel(l, l)) {
            cout << '两条直线平行' << endl;
        }
        else {
            cout << '两条直线不平行' << endl;
        }
    }
    else if (choice == 13) {
        double x, y, z;
        cout << '请输入点的坐标:' << endl;
        cout << 'x:';
        cin >> x;
        cout << 'y:';
        cin >> y;
        cout << 'z:';
        cin >> z;
        
        Point p(x, y, z);
        
        if (pl.contains(p)) {
            cout << '点在平面上' << endl;
        }
        else {
            cout << '点不在平面上' << endl;
        }
    }
    else if (choice == 14) {
        if (isPerpendicular(l, pl)) {
            cout << '直线垂直于平面' << endl;
        }
        else {
            cout << '直线不垂直于平面' << endl;
        }
    }
    else if (choice == 15) {
        double a1, b1, c1, d1, a2, b2, c2, d2;
        cout << '请输入两个平面的参数:' << endl;
        cout << '第一个平面的a:';
        cin >> a1;
        cout << '第一个平面的b:';
        cin >> b1;
        cout << '第一个平面的c:';
        cin >> c1;
        cout << '第一个平面的d:';
        cin >> d1;
        cout << '第二个平面的a:';
        cin >> a2;
        cout << '第二个平面的b:';
        cin >> b2;
        cout << '第二个平面的c:';
        cin >> c2;
        cout << '第二个平面的d:';
        cin >> d2;
        
        Plane pl1(a1, b1, c1, d1);
        Plane pl2(a2, b2, c2, d2);
        
        if (pl1.isParallel(pl2)) {
            cout << '两个平面平行' << endl;
        }
        else if (pl1.isPerpendicular(pl2)) {
            cout << '两个平面垂直' << endl;
        }
        else {
            cout << '两个平面既不平行也不垂直' << endl;
        }
    }
    else {
        cout << '无效的选择!' << endl;
    }
}

return 0;
C++ 三维解析几何:点、直线和平面类实现

原文地址: https://www.cveoy.top/t/topic/qted 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录