该程序使用 C++ 语言实现空间几何计算,包含以下功能:

  1. 创建直线

    • 通过两点式创建直线。
    • 通过一般式创建直线。
    • 通过点斜式创建直线。
  2. 创建平面

    • 通过标准式创建平面。
    • 通过三点成面创建平面。
  3. 计算距离

    • 计算两点之间的距离。
    • 计算点到直线的距离。
    • 计算点到平面的距离。
  4. 计算单位向量

    • 计算空间直线的单位方向向量。
    • 计算空间平面的单位法向量。
  5. 判断位置关系

    • 判断点与直线的关系。
    • 判断直线与直线的关系。
    • 判断点与平面的关系。
    • 判断直线与平面的关系。
    • 判断平面与平面的关系。
  6. 暂停清屏:在每次功能运行结束后,程序会暂停并清屏,方便用户进行下一步操作。

以下是程序代码:

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;

// 点类
class Point {
public:
	double x, y, z;
	// 输入点
	void getPoint() {
		cout << '请输入点的 x,y,z 坐标:' << endl;
		cin >> x >> y >> z;
		cout << endl;
	}
	void showPoint() {
		cout << '该点的坐标为:' << '(' << x << ', ' << y << ', ' << z << ')' << endl;
	}
	// 两点之间的距离
	void Pdistance() {
		Point a, b;
		double d;
		a.getPoint();
		a.showPoint();
		b.getPoint();
		b.showPoint();
		d = sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2) + pow(a.z - b.z, 2));
		cout << '两点之间的距离为 ' << d << '\n';
	}
};

// 计算两点间距离,成员函数使用
double PDdistance(Point a, Point b) {
	double d;
	d = sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2) + pow(a.z - b.z, 2));
	return d;
}

// 线类
class Line : public Point {
public:
	Point a, b;
	double A1, B1, C1, D1, A2, B2, C2, D2;
	double p, q, r;
	void lds() // 两点式
	{
		a.getPoint();
		a.showPoint();
		b.getPoint();
		b.showPoint();
		A1 = a.x - b.x;
		B1 = a.y - b.y;
		C1 = a.z - b.z;
		cout << '创建成功!' << endl;
		printf('直线方程为: (x-%.2lf)     (y-%.2lf)     (z-%.2lf)\n', a.x, a.y, a.z);
		printf('            ------------ = ----------- = ------------\n');
		printf('             (%.2lf-%.2lf)   (%.2lf-%.2lf)   (%.2lf-%.2lf)\n', b.x, a.x, b.y, a.y, b.z, a.z);
	}
	void ybs() // 一般式
	{
		cout << '请依次输入 A1, B1, C1, D1:';
		cin >> A1 >> B1 >> C1 >> D1;
		cout << endl;
		cout << '请依次输入 A2, B2, C2, D2:';
		cin >> A2 >> B2 >> C2 >> D2;
		cout << endl << '创建成功!' << endl;
		printf('直线方程为:Π1:%.2lfx+%.2lfy+%.2lfz+%.2lf=0\n', A1, B1, C1, D1);
		printf('直线方程为:Π2:%.2lfx+%.2lfy+%.2lfz+%.2lf=0\n', A2, B2, C2, D2);
	}
	void dxs() // 点斜式
	{
		cout << '请输入方向向量:';
		cin >> p >> q >> r;
		cout << endl;
		cout << '请输入固定点坐标:';
		cin >> a.x >> a.y >> a.z;
		cout << endl << '创建成功!' << endl;
		printf('直线方程为: (x-%.2lf)    (y-%.2lf)    (z-%.2lf)\n', a.x, a.y, a.z);
		printf('            --------- = --------- = ---------\n');
		printf('               %.2lf        %.2lf        %.2lf\n', p, q, r);
	}
};

// 面类
class Plane : public Point {
public:
	Point a, b, c;
	double A, B, C, D;
	void bzs() // 标准式
	{
		cout << '请依次输入 A, B, C, D:';
		cin >> A >> B >> C >> D;
		cout << endl << '创建成功!' << endl;
		printf('平面公式为:%.2lfx+%.2lfy+%.2lfz+%.2lf=0\n', A, B, C, D);
	}
	void sdcm() // 三点成面
	{
		a.getPoint();
		b.getPoint();
		c.getPoint();
		A = (b.z - b.x) * (c.z - c.x) - (c.y - c.x) * (b.z - b.x);
		B = (a.z - a.x) * (c.y - c.x) - (a.y - a.x) * (c.z - c.x);
		C = (a.y - a.x) * (b.z - b.x) - (a.z - a.x) * (b.y - b.x);
		cout << endl << '创建成功!' << endl;
		D = -A * a.x - B * a.y - C * a.z;
		printf('平面方程为:%.2lf(x-%.2lf)+%.2lf(y-%.2lf)+%.2lf(z-%.2lf)=0\n', A, a.x, B, a.y, C, a.z);
	}
};

// 计算点到直线的距离
double PZdistance(Point a, Point b, Point c) // a,b 是线上两点,c 是线外一点
{
	double ab = PDdistance(a, b), bc = PDdistance(b, c), ca = PDdistance(a, c);
	double m = (ab + bc + ca) / 2;
	double S = sqrt(m * (m - ab) * (m - bc) * (m - ca));
	double d = S / ab;
	return d;
}

// 计算点到平面的距离
double DMdistance(Point m, double a, double b, double c, double d) {
	double D;
	double up = (a * m.x + b * m.y + c * m.z + d) >= 0 ? a * (a * m.x + b * m.y + c * m.z + d) : -(a * m.x + b * m.y + c * m.z + d);
	D = up / sqrt(a * a + b * b + c * c);
	return D;
}

// 计算空间直线单位方向向量
void zdf(Point a, Point b) {
	double ex, ey, ez, es;
	ex = a.x - b.x;
	ey = a.y - b.y;
	ez = a.z - b.z;
	es = sqrt(ex * ex + ey * ey + ez * ez);
	ex /= es;
	ey /= es;
	ez /= es;
	cout << '该空间直线单位方向向量为:' << '(' << ex << ',' << ey << ',' << ez << ')' << '\n';
}

// 计算空间平面单位法向量
void mdf(double x, double y, double z) {
	double ex, ey, ez, es;
	es = sqrt(x * x + y * y + z * z);
	ex = x / es;
	ey = y / es;
	ez = z / es;
	cout << '该空间平面法向量为:' << '(' << ex << ',' << ey << ',' << ez << ')' << '\n';
}

// 判断点线关系
void pddx(Point a, Point b, Point c) // a,b 在直线上,c 在直线外
{
	double ab = PDdistance(a, b), bc = PDdistance(b, c), ca = PDdistance(a, c);
	double m = (ab + bc + ca) / 2;
	double S = sqrt(m * (m - ab) * (m - bc) * (m - ca));
	double d = S / ab;
	if (d > 0.0)
		cout << '点在直线外。' << endl;
	else
		cout << '点在直线上。' << endl;
}

// 判断线线关系
void pdxx(double x1, double y1, double z1, double x2, double y2, double z2) {
	if ((x1 / x2 - y1 / y2) == 0.0 && (y1 / y2 - z1 / z2) == 0.0 && (x1 / x2 == 1.0 || x1 / x2 == -1.0))
		cout << '两直线重合。' << endl;
	else if ((x1 / x2 - y1 / y2) == 0.0 && (y1 / y2 - z1 / z2) == 0.0 && x1 / x2 != 1.0 && x1 / x2 != -1.0)
		cout << '两直线平行。' << endl;
	else
		cout << '两直线相交。' << endl;
}

// 判断点面关系
void pddm(Point m, double a, double b, double c, double d) {
	double D;
	double up = (a * m.x + b * m.y + c * m.z + d) >= 0 ? a * (a * m.x + b * m.y + c * m.z + d) : -(a * m.x + b * m.y + c * m.z + d);
	D = up / sqrt(a * a + b * b + c * c);
	if (D > 0.0)
		cout << '点在平面外。' << endl;
	else
		cout << '点在平面上。' << endl;
}

// 判断线面关系
void pdxm(double a, double b, double c, double d, double e, double f) {
	double x = a * d + b * e + c * f;
	if (x == 0.0)
		cout << '直线与平面平行。' << endl;
	else if (a == d && b == e && c == f)
		cout << '直线与平面垂直。' << endl;
	else
		cout << '直线与平面相交。' << endl;
}

// 判断面面关系
void pdmm(double a, double b, double c, double d, double e, double f) {
	double x = a * d + b * e + c * f;
	if (x == 0.0)
		cout << '两平面互相垂直。' << endl;
	else if (a / d == b / e && b / e == c / f)
		cout << '两平面平行。' << endl;
	else
		cout << '两平面相交。' << endl;
}

// 暂停清屏
void s() {
	system('pause');
	system('cls');
}

int main() {
	Point p, q, r;
	Line l1, l2, l3;
	Plane a1, a2;
	int num = -1;
	while (num) {
		printf('创建直线:\n1. 两点式创建直线\n2. 一般式创建直线\n3. 点斜式创建直线\n****************************\n创建平面:\n4. 标准式创建平面\n5. 三点成面\n****************************\n计算距离:\n6. 计算两点间距\n7. 计算点到直线距离\n8. 计算点到平面的距离\n****************************\n计算单位向量:\n9. 计算空间直线单位方向向量\n10. 计算空间平面单位法向量\n****************************\n判断位置关系:\n11. 判断点线关系\n12. 判断线线关系\n13. 判断点面关系\n14. 判断线面关系\n15. 判断面面关系\n*****************************\n0. 退出程序\n');
		cout << '请选择:';
		cin >> num;
		switch (num) {
		case 0:
			// 退出程序
			cout << '已退出!' << endl; s();
			break;
		case 1:
			// 两点式创建直线
			cout << '现在利用两点式创建直线:' << endl;
			l1.lds(); s();
			break;
		case 2:
			// 一般式创建直线
			cout << '现在利用一般式创建直线:' << endl;
			l2.ybs(); s();
			break;
		case 3:
			// 点斜式创建直线
			cout << '现在利用点斜式创建直线:' << endl;
			l3.dxs(); s();
			break;
		case 4:
			// 标准式创建平面
			cout << '现在利用标准式创建平面:' << endl;
			a1.bzs(); s();
			break;
		case 5:
			// 三点成面
			cout << '现在利用三点成面创建平面:' << endl;
			a2.sdcm(); s();
			break;
		case 6:
			// 计算两点间距
			cout << '现在计算两点间距:' << endl;
			p.Pdistance(); s();
			break;
		case 7:
			// 计算点到直线距离
			p.getPoint(); p.showPoint();
			cout << '现在利用两点式创建直线:' << endl;
			l1.lds();
			cout << '点到直线的距离为:' << PZdistance(l1.a, l1.b, p) << endl; s();
			break;
		case 8:
			// 计算点到平面的距离
			p.getPoint(); p.showPoint();
			cout << '现在利用标准式创建平面:' << endl;
			a1.bzs();
			cout << '点到平面的距离为:' << DMdistance(p, a1.A, a1.B, a1.C, a1.D) << endl; s();
			break;
		case 9:
			// 计算空间直线单位方向向量
			cout << '现在利用两点式创建直线:' << endl;
			l1.lds();
			zdf(l1.a, l1.b); s();
			break;
		case 10:
			// 计算空间平面单位法向量
			cout << '现在利用标准式创建平面:' << endl;
			a1.bzs();
			mdf(a1.A, a1.B, a1.C); s();
			break;
		case 11:
			// 判断点线关系
			p.getPoint(); p.showPoint();
			cout << '现在利用两点式创建直线:' << endl;
			l1.lds();
			pddx(l1.a, l1.b, p); s();
			break;
		case 12:
			// 判断线线关系
			cout << '现在利用两点式创建直线:' << endl;
			l1.lds();
			cout << '现在利用点斜式创建直线:' << endl;
			l3.dxs();
			pdxx(l1.A1, l1.B1, l1.C1, l3.p, l3.q, l3.r); s();
			break;
		case 13:
			// 判断点面关系
			p.getPoint(); p.showPoint();
			cout << '现在利用标准式创建平面:' << endl;
			a1.bzs();
			pddm(p, a1.A, a1.B, a1.C, a1.D); s();
			break;
		case 14:
			// 判断线面关系
			cout << '现在利用点斜式创建直线:' << endl;
			l3.dxs();
			cout << '现在利用标准式创建平面:' << endl;
			a1.bzs();
			pdxm(l3.p, l3.q, l3.r, a1.A, a1.B, a1.C); s();
			break;
		case 15:
			// 判断面面关系
			cout << '现在利用标准式创建平面:' << endl;
			a1.bzs();
			cout << '现在利用三点成面创建平面:' << endl;
			a2.sdcm();
			pdmm(a1.A, a1.B, a1.C, a2.A, a2.B, a2.C); s();
			break;
		}
	}
	return 0;
}

使用方法

  1. 将代码保存为 .cpp 文件。
  2. 使用 C++ 编译器编译代码。
  3. 运行可执行文件。
  4. 根据提示选择功能并输入相关参数。

示例

  • 创建两点式直线:选择 1,输入两点坐标。
  • 计算两点间距离:选择 6,输入两点坐标。
  • 判断点面关系:选择 13,输入点坐标和平面方程系数。

注意

  • 程序使用了 system('pause')system('cls') 函数,可能需要根据您的操作系统调整。
  • 程序代码仅供参考,您可以根据自己的需求进行修改和完善。

进一步改进

  • 添加图形界面,使操作更加直观。
  • 增加更多功能,例如计算直线与平面交点、计算直线与直线交点等。
  • 使用更高级的数学库进行计算,提高精度和效率。
  • 使用面向对象编程思想进行设计,提高代码可读性和可维护性。

希望这份代码对您有所帮助!

C++空间几何计算程序:直线、平面创建、距离计算、位置关系判断

原文地址: https://www.cveoy.top/t/topic/qsaR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录