C++ 三维解析几何:点、直线和平面类实现
#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;
}
原文地址: https://www.cveoy.top/t/topic/qr9m 著作权归作者所有。请勿转载和采集!