"#include\n#include\n#include\nusing 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 << ""<< endl ;
}
//计算空间平面单位法向量:
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 << ""<< endl;
}
//判断点线关系:
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;
}
"本程序是一个空间几何关系判断的程序,主要包含了点、直线和平面三个类。其中,点类包含了点的坐标输入、输出和计算两点距离的功能;直线类继承了点类,并包含了直线的三种创建方式:两点式、一般式和点斜式,以及计算直线单位方向向量的功能;平面类继承了点类,并包含了平面的两种创建方式:标准式和三点成面。

程序中还包含了一些辅助的函数,用于计算点到直线的距离、点到平面的距离,以及判断点线、线线、点面、线面和面面的关系。这些函数的具体实现在相应的函数中。

程序的主函数中,通过用户选择不同的功能来调用相应的类和函数,实现了对几何关系的判断和计算。同时,程序还提供了暂停清屏的功能,使得

C++空间几何关系判断程序设计思路与代码实现

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

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