《实时控制软件设计》第一个编程作业

题目: 第一步: 写一个根据输入坐标生成一个平面图形(点、线段和三角形)并能对该几何图形进行平移和旋转操作的命令行 “软件”,要求:

 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() != ‘\n‘) && 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没改。
时间: 2024-10-11 17:25:15

《实时控制软件设计》第一个编程作业的相关文章

实时控制软件设计第二次编程作业

1 #include <iostream> 2 #include"robot.h" 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 4 5 int main(int argc, char** argv) { 6 Robot Robot(140,200,6,4); 7 jointframe JF; 8

《实时控制软件设计》第一次编程作业

//代码: #include <iostream> #include <Eigen/Dense> #include <cmath> using Eigen::MatrixXd; using namespace std; float pi=3.1415926; void mpoint(MatrixXd m) { MatrixXd T(1,2),A(1,2); cout<<"请输入移动距离:"; fflush(stdin); scanf(&q

实时控制软件设计第一周作业-汽车ABS软件系统案例分析

汽车ABS软件系统案例分析 ABS 通过控制作用于车轮制动分泵上的制动管路压力,使汽车在紧急刹车时车轮不会抱死,这样就能使汽车在紧急制动时仍能保持较好的方向稳定性. ABS系统一般是在普通制动系统基础上加装了轮速传感器,电子控制单元,制动压力调节器.制动时,通过分析传感器车速轮速数据判断车轮是否处于抱死拖滑状态,并据此控制制动压力调节器进行高频增压,保压,减压,防止车轮抱死. Q1.该系统有哪些强实时功能需求?需要对哪些实时事件进行实时响应,对允许的实时延迟的数量级进行估计. A1.强实时需求:

实时控制软件设计第一周作业

以汽车ABS系统的软件系统进行案例分析: 一.强实时功能需求有:1.汽车车轮转速的实时监测,实时计算出轮速.参考车速.车轮加速度.滑移率等参数: 2.系统故障诊断,故障诊断分为两部分,分别是启动时故障诊断和行驶状态下故障诊断. 实时事件实时响应:1.制动压力调节,当车轮处于抱死的临界状态时,调节制动压力: 2.系统故障处理,如果发现故障,则应及时警示. 二.ABS的软件系统需要设计2个实时任务,分别是汽车车轮状态监测和行驶状态下故障诊断. 三.以上两个实时任务均为时间触发:1.为保证ABS的实时

《实时控制软件设计》第二周作业

 状态分析 由题目描述,只有两种不同事件,一个是车辆进入,一个是车辆离开,与之对应的传感器信号,起落杆信号,通行灯信号都是一同变化,因此可以简化成两种复合状态. 代码实现 传感器头文件 // // Created by zhuhaihao on 2016/12/4. // #ifndef STATEMACHINE_STATEMACHINE_H #define STATEMACHINE_STATEMACHINE_H class Sensor { public: Sensor(); Sensor(b

《实时控制软件设计》读书笔记

读书笔记 在浅读过<构建之法:现代软件工程>第一章和邹欣老师的一些博文后,我对以下四个方面有了一些粗陋的认识. 一.      对软件工程的理解 <构建之法>第一章中对软件工程有着自己的理解.书中提到“软件=程序+软件工程”这一概念.同时,书中还指出软件工程包含软件需求分析.软件设计.软件构建.软件测试和软件维护这些领域.看过这些介绍后,我认为首先要弄请程序.软件.软件工程的区别.正如书中提到阿超的例子一样,程序只是完成某一项或几项简单任务的代码和数据结构集成:而软件则是能满足用户

《实时控制软件》第三周作业

一.Xenomai的简介 1.简介 Xenomai 是一种采用双内核机制的Linux 内核的强实时扩展.优先级高于Linux 内核,它负责处理系统的实时任务.Xenomai 无缝集成到Linux操作系统,从而无障碍所有的Linux软件栈源代码和更多的东西Xenomai 实时内核为开发强实时应用提供了丰富的功能, 主要包括实时线程调度与管理用户空间实时任务支持中断服务线程同步服务实时对象注册服务和动态内存申请等. 和典型的Linux实时方案( RTLinux和RTAI) 相比,Xenomai拥有自

《实时控制软件设计》第一周作业 欧梓峰 U201317662

CNC 插补计算程序分析 一.该系统有哪些强实时功能需求?需要对哪些实时事件进行实时响应,对允许的实时延迟的数量级进行估计. 答:该系统对如何控制刀具或工具的运动有强的实时控制需求,通过插补控制和位置控制以及主轴控制实现一边插补进行运算,一边进行加工,才能完成程序规定的加工任务,反过来讲,才能实时控制加工. 二.如果你是软件设计者,要实现这些实时功能,要设计几个实时任务? 答:①插补计算任务:对轮廓线的起点到终点之间再密集的计算出有限个坐标点,刀具沿着这些坐标点移动,来逼近理论轮廓,以保证切削过

《实时控制软件设计》第一周作业