20200714 千锤百炼软工人第九天

今天完善了下小学期作业

#include<iostream>
#include<cmath>
using namespace std;
class point
{
public:
 point()
 {}
 void setpoint(int a, int b, int c)
 {
  x = a; y = b; z = c;
  cout << "该点的坐标为:" << "(" << x << "," << y << "," << z << ")" << endl;
 }
 friend void dirvector();
 int getpointx();
 int getpointy();
 int getpointz();
private:
 int x, y, z;
};
int point::getpointx()
{
 return x;
}
int point::getpointy()
{
 return y;
}
int point::getpointz()
{
 return z;
}
void dirvector()
{
 point  a, b;
 int x1, x2, y1, y2, z1, z2;
 cout << "请输入一个点的坐标";
 cin >> x1 >> y1 >> z1;
 a.setpoint(x1, y1, z1);
 cout << "请输入另一个点的坐标";
 cin >> x2 >> y2 >> z2;
 b.setpoint(x2, y2, z2);
 cout << "该直线方程为:" << "(" << "x-" << a.x << ")/(" << b.x << "-" << a.x << ")=(y-" << a.y << ")/(" << b.y << "-" << a.y << ")=(z-" << a.z << ")/(" << b.z << "-" << a.z << ")" << endl;
 double m, n, p, v;
 m = a.y*b.z - b.y*a.z;
 n = b.x*a.z - a.x*b.z;
 p = a.x*b.y - b.x*a.y;
 v = sqrt(m*m + n * n + p * p);
 m = m / v;
 n = n / v;
 p = p / v;
 cout << "单位方向向量为:(" << m << "," << n << "," << p << ")" << endl;
}
class line
{
public:
 line()
 {}
 line(int x, int y, int z)
 {
  a = x; b = y; c = z;
  cout << "该直线方程为:" << a << "x+" << b << "y+" << c << "=0" << endl;
 }
 void setline()
 {
  cout << "请输入直线方程的3个参数:";
  cin >> a >> b >> c;
  cout << "该直线方程为:" << a << "x+" << b << "y+" << c << "=0" << endl;
 }
 int getlinea();
 int getlineb();
 int getlinec();
private:
 int a, b, c;
};
int line::getlinea()
{
 return a;
}
int line::getlineb()
{
 return b;
}
int line::getlinec()
{
 return c;
}
void ppsetline()
{
 point a, b;
 int x1, x2, y1, y2, z1, z2;
 cout << "请输入一个点的坐标";
 cin >> x1 >> y1 >> z1;
 cout << "请输入另一个点的坐标";
 cin >> x2 >> y2 >> z2;
 a.setpoint(x1, y1, z1);
 b.setpoint(x2, y2, z2);
 cout << "该直线方程为:" << "(" << "x-" << a.getpointx() << ")/(" << b.getpointx() << "-" << a.getpointx() << ")=(y-" << a.getpointy() << ")/(" << b.getpointy() << "-" << a.getpointy() << ")=(z-" << a.getpointz() << ")/(" << b.getpointz() << "-" << a.getpointz() << ")" << endl;
}
void pdsetline()
{
 point a, b;
 int x1, x2, y1, y2, z1, z2;
 cout << "请输入直线上一个点的坐标";
 cin >> x1 >> y1 >> z1;
 cout << "请输入该直线的方向向量的坐标";
 cin >> x2 >> y2 >> z2;
 a.setpoint(x1, y1, z1);
 b.setpoint(x2, y2, z2);
 cout << "该直线方程为:" << "(x-" << a.getpointx() << ")/" << b.getpointx() << "=" << "(y-" << a.getpointy() << ")/" << b.getpointy() << "=" << "(z-" << a.getpointz() << ")/" << b.getpointz() << endl;
}
void pvsetline()
{
 point a, b;
 int x1, x2, y1, y2, z1, z2;
 cout << "请输入直线上一个点的坐标";
 cin >> x1 >> y1 >> z1;
 cout << "请输入该直线的法向量的坐标";
 cin >> x2 >> y2 >> z2;
 a.setpoint(x1, y1, z1);
 b.setpoint(x2, y2, z2);
 cout << "该平面方程为:" << "(x-" << a.getpointx() << ")*" << b.getpointx() << "+" << "(y-" << a.getpointy() << ")*" << b.getpointy() << "+" << "(z-" << a.getpointz() << ")*" << b.getpointz() << "=0" << endl;
}
class flat
{
public:
 flat()
 {}
 flat(int x, int y, int z, int q)
 {
  a = x;
  b = y;
  c = z;
  d = q;
  cout << "该平面方程为:" << a << "x+" << b << "y+" << c << "z+" << d << "=0" << endl;
 }
 void setflat();
 int getflata();
 int getflatb();
 int getflatc();
 int getflatd();
private:
 int a, b, c, d;
};
int flat::getflata()
{
 return a;
}
int flat::getflatb()
{
 return b;
}
int flat::getflatc()
{
 return c;
}
int flat::getflatd()
{
 return d;
}
void flat::setflat()
{
 cout << "请输入平面方程的4个参数:";
 cin >> a >> b >> c >> d;
 cout << "该平面方程为:" << a << "x+" << b << "y+" << c << "z+" << d << "=0" << endl;
}
void fdvector()
{
 flat f;
 f.setflat();
 cout << "该平面的单位法向量为:";
 double a, b, c, v;
 v = sqrt(f.getflata()*f.getflata() + f.getflatb()*f.getflatb() + f.getflatc()*f.getflatc());
 a = f.getflata() / v;
 b = f.getflatb() / v;
 c = f.getflatb() / v;
 cout << "(" << a << "," << b << "," << c << ")" << endl;
}
void ffsetline()
{
 flat f1, f2;
 f1.setflat();
 f2.setflat();
 point a, b;
 a.setpoint(f1.getflata(), f1.getflatb(), f1.getflatc());
 b.setpoint(f2.getflata(), f2.getflatb(), f2.getflatc());
 double m, n, p;
 m = a.getpointy()*b.getpointz() - b.getpointy()*a.getpointz();
 n = b.getpointx()*a.getpointz() - a.getpointx()*b.getpointz();
 p = a.getpointx()*b.getpointy() - b.getpointx()*a.getpointy();
 cout << "所得直线的单位方向向量为:(" << m << "," << n << "," << p << ")" << endl;
 int  q, w, e;
 e = (f1.getflatb() / f2.getflatb() - f1.getflatd()) / (f1.getflatc() - f1.getflatb() / f2.getflatb()*f2.getflatc());
 w = (-f1.getflatd() - e * f1.getflatc()) / f1.getflatd();
 q = (-f1.getflatb()*w - e * f1.getflatc() - f1.getflatd()) / f1.getflata();
 cout << "(x-" << q << ")" << "/" << m << "=(y-" << w << ")" << "/" << n << "=(z-" << e << ")" << "/" << p << endl;
}
double ppdistance(point a, point b)
{
 cout << "两点间的距离为:";
 return sqrt((a.getpointx() - b.getpointx())*(a.getpointx() - b.getpointx()) + (a.getpointy() - b.getpointy())*(a.getpointy() - b.getpointy()) + (a.getpointz() - b.getpointz())*(a.getpointz() - b.getpointz()));
}
double pldistance(point m, line n)
{
 cout << "点到直线的距离为:";
 return abs(m.getpointx()*n.getlinea() + m.getpointy()*n.getlineb() + n.getlinec()) / sqrt(n.getlinea()*n.getlinea() + n.getlineb()*n.getlineb());
}
double pfdistance(point m, flat n)
{
 cout << "点到平面的距离为:";
 return abs(m.getpointx()*n.getflata() + m.getpointy()*n.getflatb() + m.getpointz()*n.getflatc() + n.getflatd()) / sqrt(n.getflata()*n.getflata() + n.getflatb()*n.getflatb() + n.getflatc()*n.getflatc());
}
void pppsetflat()
{
 point a, b, c;
 int x1, x2, x3, y1, y2, y3, z1, z2, z3;
 cout << "请输入平面上一个点的坐标";
 cin >> x1 >> y1 >> z1;
 a.setpoint(x1, y1, z1);
 cout << "请输入平面上一个点的坐标";
 cin >> x2 >> y2 >> z2;
 b.setpoint(x2, y2, z2);
 cout << "请输入平面上的一个点坐标";
 cin >> x3 >> y3 >> z3;
 c.setpoint(x3, y3, z3);
 double m, n, p;
 m = a.getpointy()*b.getpointz() - b.getpointy()*a.getpointz();
 n = b.getpointx()*a.getpointz() - a.getpointx()*b.getpointz();
 p = a.getpointx()*b.getpointy() - b.getpointx()*a.getpointy();
 cout << "(x-" << c.getpointx() << ")/" << m << "=(y-" << c.getpointy() << ")/" << n << "=(z-" << c.getpointz() << ")/" << p << endl;
}
int main()
{
 while (1)
 {
  cout << "《欢迎进入点直线平面创建及应用平台》" << endl;
  cout << "1 创建点" << endl;
  cout << "2 以两个点确定的一条直线" << endl;
  cout << "3 以两个相交平面确定的一条直线" << endl;
  cout << "4 以空间曲线的点向式确定的一条直线" << endl;
  cout << "5 以三个不同点确定的一个平面" << endl;
  cout << "6 以一个点和一个法向量确定的一个平面" << endl;
  cout << "7 两点的距离" << endl;
  cout << "8 点到直线的距离" << endl;
  cout << "9 点到平面距离" << endl;
  cout << "0 空间直线的单位方向向量" << endl;
  cout << "*空间平面的单位法向量" << endl;
  cout << "请选择:";
  char option;
  cin >> option;
  switch (option)
  {
  case '1':
  {point a;
  int x, y, z;
  cout << "请输入点的坐标";
  cin >> x >> y >> z;
  a.setpoint(x, y, z);
  break; }
  case '2':
  {
   ppsetline();
   break;
  }
  case '3':
  {
   ffsetline();
   break;
  }
  case '4':
  {
   pdsetline();
   break;
  }
  case '5':
  {
   pppsetflat();
   break;
  }
  case '6':
  {
   pvsetline();
   break;
  }
  case '7':
  {point a, b;
  int x1, x2, y1, y2, z1, z2;
  cout << "请输入一个点的坐标";
  cin >> x1 >> y1 >> z1;
  cout << "请输入另一个点的坐标";
  cin >> x2 >> y2 >> z2;
  a.setpoint(x1, y1, z1);
  b.setpoint(x2, y2, z2);
  cout << ppdistance(a, b) << endl;
  break;
  }
  case '8':
  {
   point a;
   line l;
   int x, y, z;
   cout << "请输入一个点的坐标";
   cin >> x >> y >> z;
   a.setpoint(x, y, z);
   l.setline();
   cout << pldistance(a, l) << endl;
   break;
  }
  case '9':
  {
   point a;
   flat f;
   int x, y, z;
   cout << "请输入一个点的坐标";
   cin >> x >> y >> z;
   a.setpoint(x, y, z);
   f.setflat();
   cout << pfdistance(a, f) << endl;
   break;
  }
  case '0':
  {
   dirvector();
   break;
  }
  case '*':
  {
   fdvector();
   break;
  }
  default:
  {
   cout << "无此选项和功能,请重新输入。" << endl;
   break;
  }
 
  }

 }
 return 0;
}
这是一个在三维空间内对点线面操作的一个程序
 
原文地址:https://www.cnblogs.com/huangmouren233/p/13301105.html