#include #include

class Point { private: double x; double y; double z; public: Point(double x, double y, double z) { this->x = x; this->y = y; this->z = z; }

double getX() const {
    return x;
}

double getY() const {
    return y;
}

double getZ() const {
    return z;
}

double distanceTo(const Point& other) const {
    double dx = x - other.getX();
    double dy = y - other.getY();
    double dz = z - other.getZ();
    return std::sqrt(dx*dx + dy*dy + dz*dz);
}

};

class Line { private: Point p1; Point p2; public: Line(const Point& p1, const Point& p2) : p1(p1), p2(p2) {}

const Point& getP1() const {
    return p1;
}

const Point& getP2() const {
    return p2;
}

double distanceToPoint(const Point& point) const {
    double x0 = point.getX();
    double y0 = point.getY();
    double z0 = point.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 = y2 - y1;
    double B = x1 - x2;
    double C = x2*y1 - x1*y2;
    
    double distance = std::abs(A*x0 + B*y0 + C*z0) / std::sqrt(A*A + B*B + C*C);
    return distance;
}

};

class Plane { private: double a; double b; double c; double d; public: Plane(double a, double b, double c, double d) { this->a = a; this->b = b; this->c = c; this->d = d; }

double getA() const {
    return a;
}

double getB() const {
    return b;
}

double getC() const {
    return c;
}

double getD() const {
    return d;
}

double distanceToPoint(const Point& point) const {
    double x = point.getX();
    double y = point.getY();
    double z = point.getZ();
    
    double distance = std::abs(a*x + b*y + c*z + d) / std::sqrt(a*a + b*b + c*c);
    return distance;
}

};

bool areEqual(double a, double b, double epsilon = 0.00001) { return std::abs(a - b) < epsilon; }

bool areCollinear(const Line& line1, const Line& line2, double epsilon = 0.00001) { double x1 = line1.getP1().getX(); double y1 = line1.getP1().getY(); double z1 = line1.getP1().getZ();

double x2 = line1.getP2().getX();
double y2 = line1.getP2().getY();
double z2 = line1.getP2().getZ();

double x3 = line2.getP1().getX();
double y3 = line2.getP1().getY();
double z3 = line2.getP1().getZ();

double x4 = line2.getP2().getX();
double y4 = line2.getP2().getY();
double z4 = line2.getP2().getZ();

double ux = x2 - x1;
double uy = y2 - y1;
double uz = z2 - z1;

double vx = x4 - x3;
double vy = y4 - y3;
double vz = z4 - z3;

double nx = uy*vz - uz*vy;
double ny = uz*vx - ux*vz;
double nz = ux*vy - uy*vx;

return areEqual(nx, 0.0, epsilon) && areEqual(ny, 0.0, epsilon) && areEqual(nz, 0.0, epsilon);

}

bool areParallel(const Line& line1, const Line& line2, double epsilon = 0.00001) { double x1 = line1.getP1().getX(); double y1 = line1.getP1().getY(); double z1 = line1.getP1().getZ();

double x2 = line1.getP2().getX();
double y2 = line1.getP2().getY();
double z2 = line1.getP2().getZ();

double x3 = line2.getP1().getX();
double y3 = line2.getP1().getY();
double z3 = line2.getP1().getZ();

double x4 = line2.getP2().getX();
double y4 = line2.getP2().getY();
double z4 = line2.getP2().getZ();

double ux = x2 - x1;
double uy = y2 - y1;
double uz = z2 - z1;

double vx = x4 - x3;
double vy = y4 - y3;
double vz = z4 - z3;

double nx = uy*vz - uz*vy;
double ny = uz*vx - ux*vz;
double nz = ux*vy - uy*vx;

return areEqual(nx, 0.0, epsilon) && areEqual(ny, 0.0, epsilon) && areEqual(nz, 0.0, epsilon);

}

bool areCoplanar(const Line& line, const Plane& plane, double epsilon = 0.00001) { double x1 = line.getP1().getX(); double y1 = line.getP1().getY(); double z1 = line.getP1().getZ();

double x2 = line.getP2().getX();
double y2 = line.getP2().getY();
double z2 = line.getP2().getZ();

double A = plane.getA();
double B = plane.getB();
double C = plane.getC();
double D = plane.getD();

double nx = y2 - y1;
double ny = x1 - x2;
double nz = x2*y1 - x1*y2;

double distance = std::abs(A*nx + B*ny + C*nz + D) / std::sqrt(A*A + B*B + C*C);

return areEqual(distance, 0.0, epsilon);

}

bool areCoplanar(const Plane& plane1, const Plane& plane2, double epsilon = 0.00001) { double A1 = plane1.getA(); double B1 = plane1.getB(); double C1 = plane1.getC(); double D1 = plane1.getD();

double A2 = plane2.getA();
double B2 = plane2.getB();
double C2 = plane2.getC();
double D2 = plane2.getD();

double distance = std::abs(A1*D2 - A2*D1 + B1*C2 - B2*C1 + C1*D2 - C2*D1) / std::sqrt(A1*A1 + B1*B1 + C1*C1) / std::sqrt(A2*A2 + B2*B2 + C2*C2);

return areEqual(distance, 0.0, epsilon);

}

int main() { Point point1(1.0, 2.0, 3.0); Point point2(4.0, 5.0, 6.0); Line line(point1, point2);

std::cout << 'Distance from point to line: ' << line.distanceToPoint(point1) << std::endl;

Plane plane(1.0, 2.0, 3.0, 4.0);

std::cout << 'Distance from point to plane: ' << plane.distanceToPoint(point1) << std::endl;

Point point3(7.0, 8.0, 9.0);
Line line2(point1, point3);

std::cout << 'Are lines collinear? ' << areCollinear(line, line2) << std::endl;
std::cout << 'Are lines parallel? ' << areParallel(line, line2) << std::endl;

Point point4(10.0, 11.0, 12.0);
Plane plane2(1.0, 2.0, 3.0, 40.0);

std::cout << 'Are point and plane coplanar? ' << areCoplanar(point1, plane) << std::endl;
std::cout << 'Are line and plane coplanar? ' << areCoplanar(line, plane) << std::endl;
std::cout << 'Are planes coplanar? ' << areCoplanar(plane, plane2) << std::endl;

return 0;

}

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

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

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