空间点、线和面:编写一个C++代码。实现三维解析几何中的点、直线和平面类具有如下功能:1 能够实现直线的不同创建方式例如两个点确定一条直线两个相交的平面确定一条直线空间曲线的点斜式和平面的不同创建方式例如三个不共线的点确定一个平面一个点和一个法向量确定一个平面;2 能够计算相应的距离:两点之间的距离点到直线的距离点到平面的距离;3 能够计算空间直线的单位方向向量长度为1空间平面的单位法向量长度为1
#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
原文地址: https://www.cveoy.top/t/topic/iM10 著作权归作者所有。请勿转载和采集!