• 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;
    }
    这是一个在三维空间内对点线面操作的一个程序
     
  • 相关阅读:
    第一周任务Largest Submatrix of All 1’s
    第一周 Largest Rectangle in a Histogram
    第二次作业
    B. Light bulbs(2019 ICPC上海站)
    二维平面最近点-分治
    python生成器,推导式
    python函数名的运用,闭包,迭代器
    python函数(二)
    python函数(一)
    python基础(七)
  • 原文地址:https://www.cnblogs.com/huangmouren233/p/13301105.html
Copyright © 2020-2023  润新知