C++ 实现三维解析几何中的点、直线和平面类
#include
class Point { private: double x, y, z; public: Point(double x, double y, double z) : x(x), y(y), z(z) {} double getX() const { return x; } double getY() const { return y; } double getZ() const { return z; } };
class Line { private: Point p1, p2; public: Line(const Point& p1, const Point& p2) : p1(p1), p2(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 = y1 * (z2 - z1) - z1 * (y2 - y1);
double B = z1 * (x2 - x1) - x1 * (z2 - z1);
double C = x1 * (y2 - y1) - y1 * (x2 - x1);
double D = -A * x1 - B * y1 - C * z1;
double distance = std::abs(A * x0 + B * y0 + C * z0 + D) / std::sqrt(A * A + B * B + C * C);
return distance;
}
};
class Plane { private: double a, b, c, d; public: Plane(double a, double b, double c, double d) : a(a), b(b), c(c), d(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 isPointOnLine(const Point& point, const Line& line) { double distance = line.distanceToPoint(point); return distance < 1e-6; // 考虑计算机中实数计算的精度误差 }
// 判断线和线的关系 bool isLineIntersect(const Line& line1, const Line& line2) { // 实现判断两条线是否相交的算法 }
// 判断点和平面的关系 bool isPointOnPlane(const Point& point, const Plane& plane) { double distance = plane.distanceToPoint(point); return distance < 1e-6; // 考虑计算机中实数计算的精度误差 }
// 判断线和平面的关系 bool isLineOnPlane(const Line& line, const Plane& plane) { // 实现判断线是否在平面上的算法 }
// 判断平面和平面的关系 bool isPlaneIntersect(const Plane& plane1, const Plane& plane2) { // 实现判断两个平面是否相交的算法 }
int main() { Point point1(0, 0, 0); Point point2(1, 1, 1); Line line(point1, point2); std' << 'Distance from point1 to line: ' << line.distanceToPoint(point1) << std::endl;
Plane plane(1, 1, 1, 0);
std' << 'Distance from point1 to plane: ' << plane.distanceToPoint(point1) << std::endl;
std' << 'Is point1 on line: ' << isPointOnLine(point1, line) << std::endl;
std' << 'Is point1 on plane: ' << isPointOnPlane(point1, plane) << std::endl;
return 0;
}
这是一个简单的实现,可以根据具体需求进行扩展和修改。注意在判断点和线、点和平面的关系时,使用了一个很小的误差范围来考虑计算机中实数计算的精度误差。实际应用中,可能需要根据具体的应用场景来选择合适的误差范围。
原文地址: https://www.cveoy.top/t/topic/qr8K 著作权归作者所有。请勿转载和采集!