C++ 三维解析几何:点、直线和平面类实现
#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, l)) {
cout << '两条直线平行' << endl;
}
else {
cout << '两条直线不平行' << endl;
}
}
else if (choice == 13) {
double x, y, z;
cout << '请输入点的坐标:' << endl;
cout << 'x:';
cin >> x;
cout << 'y:';
cin >> y;
cout << 'z:';
cin >> z;
Point p(x, y, z);
if (pl.contains(p)) {
cout << '点在平面上' << endl;
}
else {
cout << '点不在平面上' << endl;
}
}
else if (choice == 14) {
if (isPerpendicular(l, pl)) {
cout << '直线垂直于平面' << endl;
}
else {
cout << '直线不垂直于平面' << endl;
}
}
else if (choice == 15) {
double a1, b1, c1, d1, a2, b2, c2, d2;
cout << '请输入两个平面的参数:' << endl;
cout << '第一个平面的a:';
cin >> a1;
cout << '第一个平面的b:';
cin >> b1;
cout << '第一个平面的c:';
cin >> c1;
cout << '第一个平面的d:';
cin >> d1;
cout << '第二个平面的a:';
cin >> a2;
cout << '第二个平面的b:';
cin >> b2;
cout << '第二个平面的c:';
cin >> c2;
cout << '第二个平面的d:';
cin >> d2;
Plane pl1(a1, b1, c1, d1);
Plane pl2(a2, b2, c2, d2);
if (pl1.isParallel(pl2)) {
cout << '两个平面平行' << endl;
}
else if (pl1.isPerpendicular(pl2)) {
cout << '两个平面垂直' << endl;
}
else {
cout << '两个平面既不平行也不垂直' << endl;
}
}
else {
cout << '无效的选择!' << endl;
}
}
return 0;
原文地址: https://www.cveoy.top/t/topic/qted 著作权归作者所有。请勿转载和采集!