空间几何图形计算程序设计思路及代码实现
该程序主要实现了一个空间几何图形计算的功能。主要包括了点类、线类和面类,以及一些计算和判断位置关系的函数。
程序中定义了一个'Point'类,用来表示一个点的坐标。其中包括了输入点的坐标、显示点的坐标和计算两点之间距离的函数。
程序中定义了一个'Line'类,继承自'Point'类,用来表示一条直线。其中包括了三种表示直线的方式:两点式、一般式和点斜式。通过输入不同的直线参数,可以创建不同的直线对象。
程序中定义了一个'Plane'类,继承自'Point'类,用来表示一个平面。其中包括了两种表示平面的方式:标准式和三点成面。通过输入不同的平面参数,可以创建不同的平面对象。
程序中定义了一些计算函数,如计算两点之间的距离、计算点到直线的距离、计算点到平面的距离,以及计算空间直线单位方向向量、计算空间平面单位法向量等。
程序还提供了判断点线关系、线线关系、点面关系、线面关系和面面关系的函数。
#include
//点类: 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;
原文地址: https://www.cveoy.top/t/topic/qseo 著作权归作者所有。请勿转载和采集!