写c++程序:1 空间点、线和面:实现三维解析几何中的点、直线和平面类1 能够实现直线的不同创建方式例如两个点确定一条直线两个相交的平面确定一条直线空间曲线的点斜式和平面的不同创建方式例如三个不共线的点确定一个平面一个点和一个法向量确定一个平面;2 能够计算相应的距离:两点之间的距离点到直线的距离点到平面的距离;3 能够计算空间直线的单位方向向量长度为1空间平面的单位法向量长度为1;4 能够判断点
#include
using namespace std;
const double EPSILON = 1e-6; // 精度误差
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;
}
};
class Line { private: Point p1; Point p2;
public: Line(Point p1, Point p2) { this->p1 = p1; this->p2 = p2; }
double getDistance() const {
double dx = p2.getX() - p1.getX();
double dy = p2.getY() - p1.getY();
double dz = p2.getZ() - p1.getZ();
return sqrt(dx * dx + dy * dy + dz * dz);
}
Point getP1() const {
return p1;
}
Point getP2() const {
return p2;
}
};
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 getDistance(Point p) const {
double numerator = a * p.getX() + b * p.getY() + c * p.getZ() + d;
double denominator = sqrt(a * a + b * b + c * c);
return fabs(numerator / denominator);
}
double getUnitNormalVectorX() const {
return a / sqrt(a * a + b * b + c * c);
}
double getUnitNormalVectorY() const {
return b / sqrt(a * a + b * b + c * c);
}
double getUnitNormalVectorZ() const {
return c / sqrt(a * a + b * b + c * c);
}
};
// 判断两个实数是否相等 bool isEqual(double a, double b) { return fabs(a - b) < EPSILON; }
// 判断两个点是否相等 bool isEqual(Point p1, Point p2) { return isEqual(p1.getX(), p2.getX()) && isEqual(p1.getY(), p2.getY()) && isEqual(p1.getZ(), p2.getZ()); }
// 判断点和直线的关系 bool isPointOnLine(Point p, Line l) { double dx1 = p.getX() - l.getP1().getX(); double dy1 = p.getY() - l.getP1().getY(); double dz1 = p.getZ() - l.getP1().getZ(); double dx2 = p.getX() - l.getP2().getX(); double dy2 = p.getY() - l.getP2().getY(); double dz2 = p.getZ() - l.getP2().getZ(); return isEqual(dx1 * dx2 + dy1 * dy2 + dz1 * dz2, 0); }
// 判断线和线的关系 bool isLineIntersect(Line l1, Line l2) { double x1 = l1.getP1().getX(); double y1 = l1.getP1().getY(); double z1 = l1.getP1().getZ(); double x2 = l1.getP2().getX(); double y2 = l1.getP2().getY(); double z2 = l1.getP2().getZ(); double x3 = l2.getP1().getX(); double y3 = l2.getP1().getY(); double z3 = l2.getP1().getZ(); double x4 = l2.getP2().getX(); double y4 = l2.getP2().getY(); double z4 = l2.getP2().getZ();
double denominator = (y1 - y2) * (z3 - z4) - (z1 - z2) * (y3 - y4);
double numerator1 = (x1 - x3) * ((y1 - y2) * (z3 - z4) - (z1 - z2) * (y3 - y4)) - (x1 - x2) * ((y1 - y3) * (z3 - z4) - (z1 - z3) * (y3 - y4));
double numerator2 = (x1 - x3) * ((x1 - x2) * (z3 - z4) - (z1 - z2) * (x3 - x4)) - (x1 - x2) * ((x1 - x3) * (z3 - z4) - (z1 - z3) * (x3 - x4));
double numerator3 = (x1 - x2) * ((x1 - x3) * (y1 - y2) - (y1 - y3) * (x3 - x4)) - (y1 - y2) * ((x1 - x3) * (x1 - x2) - (x1 - x3) * (y1 - y2));
if (isEqual(denominator, 0)) {
// 平行或共线
if (isEqual(numerator1, 0) && isEqual(numerator2, 0) && isEqual(numerator3, 0)) {
return true; // 共线
} else {
return false; // 平行
}
} else {
double t = numerator1 / denominator;
double s = numerator2 / denominator;
double r = numerator3 / denominator;
return (t >= 0 && t <= 1) && (s >= 0 && s <= 1) && (r >= 0 && r <= 1);
}
}
// 判断点和平面的关系 bool isPointOnPlane(Point p, Plane plane) { double dx = p.getX(); double dy = p.getY(); double dz = p.getZ(); double a = plane.getUnitNormalVectorX(); double b = plane.getUnitNormalVectorY(); double c = plane.getUnitNormalVectorZ(); double d = plane.getDistance(p);
return isEqual(a * dx + b * dy + c * dz + d, 0);
}
// 判断线和平面的关系 bool isLineIntersectPlane(Line line, Plane plane) { Point p1 = line.getP1(); Point p2 = line.getP2(); double dx1 = p1.getX(); double dy1 = p1.getY(); double dz1 = p1.getZ(); double dx2 = p2.getX(); double dy2 = p2.getY(); double dz2 = p2.getZ(); double a = plane.getUnitNormalVectorX(); double b = plane.getUnitNormalVectorY(); double c = plane.getUnitNormalVectorZ(); double d = plane.getDistance(p1); double denominator = a * (dx1 - dx2) + b * (dy1 - dy2) + c * (dz1 - dz2);
if (isEqual(denominator, 0)) {
// 平行或共面
if (isPointOnPlane(p1, plane)) {
return true; // 共面
} else {
return false; // 平行
}
} else {
double t = (a * dx1 + b * dy1 + c * dz1 + d) / denominator;
return t >= 0 && t <= 1;
}
}
// 判断平面和平面的关系 bool isPlaneIntersect(Plane plane1, Plane plane2) { double a1 = plane1.getUnitNormalVectorX(); double b1 = plane1.getUnitNormalVectorY(); double c1 = plane1.getUnitNormalVectorZ(); double d1 = plane1.getDistance(Point(0, 0, 0)); double a2 = plane2.getUnitNormalVectorX(); double b2 = plane2.getUnitNormalVectorY(); double c2 = plane2.getUnitNormalVectorZ(); double d2 = plane2.getDistance(Point(0, 0, 0));
double denominator = a1 * b2 - a2 * b1;
double numerator1 = b1 * d2 - b2 * d1;
double numerator2 = a2 * d1 - a1 * d2;
if (isEqual(denominator, 0)) {
// 平行或共面
if (isEqual(numerator1, 0) && isEqual(numerator2, 0)) {
return true; // 共面
} else {
return false; // 平行
}
} else {
return true;
}
}
int main() { Point p1(1, 2, 3); Point p2(4, 5, 6); Line line(p1, p2); cout << "Distance between p1 and p2: " << line.getDistance() << endl;
Point p3(7, 8, 9);
Plane plane(1, 2, 3, 4);
cout << "Distance between p3 and plane: " << plane.getDistance(p3) << endl;
cout << "Unit normal vector of the plane: (" << plane.getUnitNormalVectorX() << ", " << plane.getUnitNormalVectorY() << ", " << plane.getUnitNormalVectorZ() << ")" << endl;
Point p4(1, 2, 3);
cout << "Is p4 on the line? " << (isPointOnLine(p4, line) ? "Yes" : "No") << endl;
Line line2(p1, p3);
cout << "Do line and line2 intersect? " << (isLineIntersect(line, line2) ? "Yes" : "No") << endl;
cout << "Is p4 on the plane? " << (isPointOnPlane(p4, plane) ? "Yes" : "No") << endl;
cout << "Does line intersect the plane? " << (isLineIntersectPlane(line, plane) ? "Yes" : "No") << endl;
Plane plane2(2, 3, 4, 5);
cout << "Do plane and plane2 intersect? " << (isPlaneIntersect(plane, plane2) ? "Yes" : "No") << endl;
return 0;
原文地址: https://www.cveoy.top/t/topic/iytc 著作权归作者所有。请勿转载和采集!