zoukankan      html  css  js  c++  java
  • 《实时控制软件设计》第一个编程作业

    题目: 第一步: 写一个根据输入坐标生成一个平面图形(点、线段和三角形)并能对该几何图形进行平移和旋转操作的命令行 “软件”,要求:
    
     a) 通过命令行输入图形的名称,端点数(1为点,2为线段,3为三角形)和端点坐标(x,y)。
    
     如:输入一个点 p1 1 (2,5)
         输入一个线段 l1 2 (3,5) (4,6)
         输入一个三角形 t1 3 (1,1) (2,5) (-4,7)
    
     b) 输入一个计算指令,实现对上述图形的平移和绕原点旋转等操作,并输出该图形新的坐标值。
    
     如:move l1 (3,6) 表示把线段l1沿x方向移动3,沿y方向移动6。
         rotate t1 -30 表示把三角形t1绕原点逆时针旋转30度。
    
     程序设计要求使用Eigen库函数,(如觉得有难度可先用自己编写的函数实现,但在实现第二步前必须修改成使用Eigen库函数),先在博客上提交代码,并附上运行结果截图。同学之间可相互阅读博客,比较一下各自程序的功能、实现方法的异同。
    
     第二步,
    
     在小组内每个同学在如下方向中选择一个,进行功能扩展:
    
     a) 实现更复杂的二维图形操作,如定义更复杂的图形(多边形),实现图形围绕任意点的旋转,图形相对于某一条线的镜像,并考虑扩展到三维空间。
    
     b) 把图形数据保存到文件,并能从文件中恢复。
    
     c) 实现简易GUI,通过GUI输入图形坐标和操作命令,并显示图形。
     
     考虑如何把上述三个软件功能集成在一起,如何定义接口?
    
     估计做好这个软件需要的时间,并且写出大概的设计步骤和实现算法。

      1 #include <iostream>
      2 #include <Eigen/Dense>
      3 #include <iomanip>
      4 
      5 using Eigen::MatrixXd;
      6 using namespace std;
      7 #define PI 3.14159
      8 
      9 class Shape
     10 {
     11 public:
     12     char Name[10];
     13     void virtual Move(double x, double y) = 0;
     14     void virtual Rotation(double theta) = 0;
     15 };
     16 class Point : public Shape
     17 {
     18 public:
     19     Point()
     20     {
     21         cin >> x0 >> y0;
     22     }
     23     void output()
     24     {
     25         cout << setiosflags(ios::fixed) << setprecision(2) << "(" << x0 << "," << y0 << ")" << endl;
     26     }
     27     void Move(double x, double y)
     28     {
     29         x0 = x0 + x;
     30         y0 = y0 + y;
     31         output();
     32     }
     33     void Rotation(double theta)
     34     {
     35         MatrixXd R(3, 3);
     36         MatrixXd p(1, 3);
     37         MatrixXd result(1, 3);
     38         double theta1;
     39         theta1 = theta * (2 * PI) / 360;
     40         R << cos(theta1), sin(theta1), 0,
     41             -sin(theta1), cos(theta1), 0,
     42             0, 0, 1;
     43         p << x0, y0, 1;
     44         result = p*R;
     45         x0 = result(0, 0);
     46         y0 = result(0, 1);
     47         output();
     48     } //三个类的函数没写 
     49 private:
     50     double x0, y0;//为什么定义成私有的 
     51 };
     52 class Line : public Shape
     53 {
     54 public:
     55     void Move(double x, double y)
     56     {
     57         p1.Move(x, y);
     58         p2.Move(x, y);
     59     }
     60     void virtual Rotation(double theta)
     61     {
     62         p1.Rotation(theta);
     63         p2.Rotation(theta);
     64     }
     65 private:
     66     Point p1;
     67     Point p2;
     68 };
     69 class  Triangle : public Shape
     70 {
     71 public:
     72     void Move(double x, double y)
     73     {
     74         p1.Move(x, y);
     75         p2.Move(x, y);
     76         p3.Move(x, y);
     77     }
     78     void virtual Rotation(double theta)
     79     {
     80         p1.Rotation(theta);
     81         p2.Rotation(theta);
     82         p3.Rotation(theta);
     83     }
     84 private:
     85     Point p1;
     86     Point p2;
     87     Point p3;
     88 };
     89 
     90 class Command
     91 {
     92 public:
     93     string Com;
     94     char Obj[10];
     95     double x[2];
     96 };
     97 
     98 int main()
     99 {
    100     char Name_Temp[10];
    101     int Point_Count;
    102     char Ctinue[1];
    103 
    104     Point** P;
    105     P = new Point*[10];
    106     Line** L;
    107     L = new Line*[10];
    108     Triangle** T;
    109     T = new  Triangle*[10];
    110     while (true)
    111     {
    112         cout << "请输入图形名称、点数、坐标" << endl;
    113         cin >> Name_Temp >> Point_Count;
    114         int i = 0, j = 0, k = 0;
    115         switch (Point_Count)
    116         {
    117         case 1:
    118         {
    119                   P[i] = new Point();
    120                   for (int l = 0; l<10; l++)
    121                   {
    122                       P[i]->Name[l] = Name_Temp[l];
    123                   }
    124                   cout << "Success" << endl;
    125                   i++;
    126                   break;
    127         }
    128         case 2:
    129         {
    130                   L[j] = new Line();
    131                   for (int l = 0; l<10; l++)
    132                   {
    133                       L[j]->Name[l] = Name_Temp[l];
    134                   }
    135                   cout << "Success" << endl;
    136                   j++;
    137                   break;
    138         }
    139         case 3:
    140         {
    141                   T[k] = new Triangle();
    142                   for (int l = 0; l<10; l++)
    143                   {
    144                       T[k]->Name[l] = Name_Temp[l];
    145                   }
    146                   cout << "Success" << endl;
    147                   k++;
    148                   break;
    149         }
    150         }
    151         cout << "继续输入?" << endl;
    152         cin >> Ctinue;
    153         if (Ctinue[0] == 'N')
    154             break;
    155         else
    156             continue;
    157     }
    158     while(true)
    159     {
    160         cout << "请输入指令:" << endl;
    161         Command C;
    162         cin >> C.Com >> C.Obj;
    163         int m = 0;
    164         while ((cin.get() != '
    ') && m<2)
    165         {
    166             cin >> C.x[m];
    167             m++;
    168         }
    169         bool found = 0;
    170         for (int i = 0; i<10;i++)
    171         {
    172             if (!strcmp(C.Obj, P[i]->Name))
    173             {
    174                 if (C.Com == "Move")
    175                 {
    176                     cout<<"平移后坐标"<<endl;
    177                     P[i]->Move(C.x[0], C.x[1]);
    178                 }                    
    179                 else if (C.Com == "Rotation")
    180                 {
    181                     cout<<"旋转后坐标"<<endl;
    182                     P[i]->Rotation(C.x[0]);
    183                 }    
    184                 else
    185                     cout << "指令不存在";
    186                 break;
    187             }
    188             else if (!strcmp(C.Obj, L[i]->Name))
    189             {
    190                 if (C.Com == "Move")
    191                 {
    192                     cout<<"平移后坐标"<<endl;
    193                     L[i]->Move(C.x[0], C.x[1]);
    194                 } 
    195                     
    196                 else if (C.Com == "Rotation")
    197                 {
    198                     cout<<"旋转后坐标"<<endl;
    199                     L[i]->Rotation(C.x[0]);
    200                 } 
    201                 
    202                 else
    203                     cout << "指令不存在";
    204                 break;
    205             }
    206             else if (!strcmp(C.Obj, T[i]->Name))
    207             {
    208                 if (C.Com == "Move")
    209                 {
    210                     cout<<"平移后坐标"<<endl;
    211                     T[i]->Move(C.x[0], C.x[1]);
    212                 } 
    213                 
    214                 else if (C.Com == "Rotation")
    215                 {
    216                     cout<<"旋转后坐标"<<endl;
    217                     T[i]->Rotation(C.x[0]);
    218                 }     
    219                 else
    220                     cout << "指令不存在";
    221                 break;
    222             }                        
    223         }
    224         cout << "继续输入?" << endl;
    225         cin >> Ctinue;
    226         if (Ctinue[0] == 'N')
    227             break;
    228         else
    229             continue;
    230     }
    231     system("pause");
    232     return 0;
    233 }

    还有一些小bug没改。
  • 相关阅读:
    Cocos2d-x移植Android 常见问题处理办法
    JSON解析问题
    类图(Rose)
    Linux_脚本——使用echo从一个文件写入还有一个文件末尾
    Android HttpClient自己主动登陆discuz论坛!
    Swift编程语言学习1.1——常量与变量
    DVR_RDK编译报错
    啊马蜂蜜哦我阿达十米台内又热偶爱
    贪婪算法之兑换硬币及问题所在
    00095_流的操作规律
  • 原文地址:https://www.cnblogs.com/zhaokewei/p/5008793.html
Copyright © 2011-2022 走看看