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

  1 #include <iostream>
  2 #include <string>
  3 #include <stdlib.h> 
  4 #include <math.h>
  5 #include <Eigen/Dense>
  6 
  7 #define PN 100//可保存的点的数目 
  8 #define LN 100//可保存线的数目 
  9 #define RN 100//可保存三角形的数目 
 10 #define PI 3.1415926
 11 
 12 using namespace Eigen;
 13 using namespace std;
 14 
 15 void add ();
 16 void addPoint();
 17 void addLine();
 18 void addRect();
 19 void move();
 20 void rotate();
 21 
 22 
 23 
 24 //模板函数:将string类型变量转换为常用的数值类型(此方法具有普遍适用性)  
 25 template <class Type>  
 26 Type stringToNum(const string& str)  
 27 {  
 28     istringstream iss(str);  
 29     Type num;  
 30     iss >> num;  
 31     return num;      
 32 }  
 33 
 34 class Point {
 35     
 36     private :
 37         Vector2d v;    
 38         string name;    
 39     public:
 40         
 41         //构造函数
 42         Point(Vector2d v1){
 43             v = v1;
 44         }
 45         
 46         Point(Vector2d v1 , string pname) {
 47             v = v1;
 48             name = pname;
 49         } 
 50         Point() {};
 51         
 52         //设置点的x,y坐标 
 53         void setPoint(Vector2d v1){
 54             v = v1;
 55         }
 56                 
 57         
 58         Vector2d getPoint() {
 59             return v;
 60         }
 61         
 62         string getName() {
 63             return name;
 64         }
 65         
 66         void setName(string pname) {
 67             name = pname;
 68         }
 69 };
 70 
 71 class Line {
 72     private :
 73         Vector2d v1;
 74         Vector2d v2;
 75         string name;
 76         
 77     public :
 78         //构造函数
 79         Line() {};
 80          
 81         void setLine(Vector2d vv1,Vector2d vv2) {
 82             v1 = vv1;
 83             v2 = vv2;
 84         }
 85         
 86         Vector2d getStartPoint() {
 87             return v1;
 88         }
 89         
 90         Vector2d getEndPoint() {
 91             return v2;
 92         }
 93         
 94         void setName(string lname) {
 95             name = lname;
 96         }
 97         
 98         string getName() {
 99             return name;
100         }
101         
102         
103 };
104 
105 class Rect {
106     private :
107         Vector2d v1;
108         Vector2d v2;
109          Vector2d v3;
110          string name;
111          
112     public:
113         
114         Rect() {};
115         
116     void setRect(Vector2d vv1,Vector2d vv2,Vector2d vv3) {
117         v1 = vv1;
118         v2 = vv2;
119         v3 = vv3;
120     }
121     
122     Vector2d getPoint1() {
123         return v1;
124     }
125     
126     Vector2d getPoint2() {
127         return v2;
128     }
129     
130     Vector2d getPoint3() {
131         return v3;
132     }
133     
134     void setName(string rname) {
135         name = rname;
136     }
137     
138     string getName() {
139         return name;
140     }
141 };
142 
143 string a[5];
144 int pcnt = 0;
145 Point point[PN]; 
146 int lcnt = 0;
147 Line line[LN];
148 int rcnt = 0;
149 Rect rect[RN];
150 
151 
152 int main(int argc,char *argv[]) {
153     
154     while(1) {
155         string str ; //定义一个字符串去接收命令行传入的值
156         getline(cin,str);//接收命令行的字符串 
157         
158     //将命令行的字符串按空格分割存入a[5]中 
159         for(int i=0,j=0;i<str.size();i++) {
160             int pos;
161             pos = str.find(' ',i);
162             if(pos!=std::string::npos) {
163                 a[j] = str.substr(i,pos-i);
164                 j++;
165                 i=pos;
166             } else {
167                 a[j] = str.substr(i,str.size()-i);
168                 break;
169             }
170             
171          }
172          
173          if(a[0]=="move") {
174              move();
175         } else if(a[0]=="rotate") {
176             rotate();
177         } else {
178             add();
179         }
180     }
181     
182 }
183 
184 void add() {
185     if(a[1]=="1") {
186         addPoint();
187     } else if(a[1]=="2") {
188         addLine();
189     } else if(a[1]=="3") {
190         addRect();
191     } else {
192         cout<<"输入格式有误,请按照正确的格式输入!"<<endl;
193     }
194     
195 }
196 
197 void addPoint() {
198     Vector2d v;
199     string m1,m2; 
200     string s = a[2];
201     double x,y;
202     int pos;
203     pos=s.find(',',0);
204     if(pos!=std::string::npos) {
205         m1 = s.substr(0,pos);
206         m2 = s.substr(pos+1,s.size()-pos);
207         x = stringToNum<double>(m1);
208         y = stringToNum<double>(m2);
209      } else {
210          cout<<"指令输入有误,要添加点请按照如下结构输入:"<<endl;
211          cout<<"p1 1 5.2,6.4"<<endl;
212          exit(0); 
213      }
214      v<<x,y;
215      
216     point[pcnt].setPoint(v);
217     point[pcnt].setName(a[0]);
218     pcnt++;
219     cout<<"添加了一个点:"<<a[0]<<endl;
220     cout<<"坐标为:"<<v.transpose()<<endl; 
221     
222 }
223 
224 void addLine() {
225     Vector2d v1,v2;
226     string m1,m2,m3,m4;
227     string s1 = a[2];
228     string s2 = a[3];
229     double x1,x2,y1,y2;
230     int pos1,pos2;
231         pos1=s1.find(',',0);
232         
233     if(pos1!=std::string::npos) {
234         m1 = s1.substr(0,pos1);
235         m2 = s1.substr(pos1+1,s1.size()-pos1);
236         x1 = stringToNum<double>(m1);
237         y1 = stringToNum<double>(m2);
238      } else {
239          cout<<"指令输入有误,要添加点请按照如下结构输入:"<<endl;
240          cout<<"l1 2 1,2 3,4"<<endl;
241          exit(0); 
242     }
243     
244     pos2=s2.find(',',0);
245     if(pos2!=std::string::npos) {
246         m3 = s2.substr(0,pos2);
247         m4 = s2.substr(pos2+1,s2.size()-pos2);
248         x2 = stringToNum<double>(m3);
249         y2 = stringToNum<double>(m4);
250      } else {
251          cout<<"指令输入有误,要添加点请按照如下结构输入:"<<endl;
252          cout<<"l1 2 1,2 3,4"<<endl;
253          exit(0); 
254     }
255     
256     v1<<x1,y1;
257     v2<<x2,y2;
258     line[lcnt].setLine(v1,v2);
259     line[lcnt].setName(a[0]);
260     lcnt++;
261     cout<<"添加了一条线:"<<a[0]<<endl;
262     cout<<"起点坐标为:"<<v1.transpose()<<endl;
263     cout<<"终点坐标为:"<<v2.transpose()<<endl; 
264 }
265 
266 void addRect() {
267     Vector2d v1,v2,v3;
268     string m1,m2,m3,m4,m5,m6;
269     string s1 = a[2];
270     string s2 = a[3];
271     string s3 = a[4];
272     double x1,x2,x3,y1,y2,y3;
273     int pos1,pos2,pos3;
274     
275     pos1=s1.find(',',0);    
276     if(pos1!=std::string::npos) {
277         m1 = s1.substr(0,pos1);
278         m2 = s1.substr(pos1+1,s1.size()-pos1);
279         x1 = stringToNum<double>(m1);
280         y1 = stringToNum<double>(m2);
281      } else {
282          cout<<"指令输入有误,要添加点请按照如下结构输入:"<<endl;
283          cout<<"l1 2 1,2 3,4 5,6"<<endl;
284          exit(0); 
285     }
286     
287     pos2=s2.find(',',0);
288     if(pos2!=std::string::npos) {
289         m3 = s2.substr(0,pos2);
290         m4 = s2.substr(pos2+1,s2.size()-pos2);
291         x2 = stringToNum<double>(m3);
292         y2 = stringToNum<double>(m4);
293      } else {
294          cout<<"指令输入有误,要添加点请按照如下结构输入:"<<endl;
295          cout<<"l1 2 1,2 3,4"<<endl;
296          exit(0); 
297     }
298     
299     pos3=s3.find(',',0);
300     if(pos3!=std::string::npos) {
301         m5 = s3.substr(0,pos3);
302         m6 = s3.substr(pos3+1,s3.size()-pos3);
303         x3 = stringToNum<double>(m5);
304         y3 = stringToNum<double>(m6);
305      } else {
306          cout<<"指令输入有误,要添加点请按照如下结构输入:"<<endl;
307          cout<<"l1 2 1,2 3,4 5,6"<<endl;
308          exit(0); 
309     }
310     
311     v1<<x1,y1;
312     v2<<x2,y2;
313     v3<<x3,y3;
314     rect[rcnt].setRect(v1,v2,v3);
315     rect[rcnt].setName(a[0]);
316     rcnt++;
317     cout<<"添加了一个三角形:"<<a[0]<<endl;
318     cout<<"端点一坐标为:"<<v1.transpose()<<endl;
319     cout<<"端点二坐标为:"<<v2.transpose()<<endl;
320     cout<<"端点三坐标为:"<<v3.transpose()<<endl;
321      
322 }
323 
324 void move() {
325     string s;
326     s = a[1];
327     Vector2d v;
328     bool find = false;
329     string s1 = a[2];
330     double x,y;
331     int pos;
332     string m1,m2;
333     
334     pos=s1.find(',',0);
335     if(pos!=std::string::npos) {
336         m1 = s1.substr(0,pos);
337         m2 = s1.substr(pos+1,s.size()-pos);
338         x = stringToNum<double>(m1);
339         y = stringToNum<double>(m2);
340      } else {
341          cout<<"指令输入有误,要添加点请按照如下结构输入:"<<endl;
342          cout<<"move XX 2,3"<<endl;
343          exit(0); 
344      }
345      v<<x,y;
346     
347     for(int i=0;i<PN;i++) {
348         if(point[i].getName()==s) {
349             find = true;
350             Vector2d v1 = point[i].getPoint();
351              v1=v1+v;
352              cout<<s<<"平移后的点的坐标为:"<<v1.transpose()<<endl;    
353         } 
354     }
355     
356     for(int i=0;i<LN;i++) {
357         if(line[i].getName()==s) {
358             find = true;
359             Vector2d v1 = line[i].getStartPoint();
360             Vector2d v2 = line[i].getEndPoint();
361              v1 = v1+v;
362              v2 = v2+v; 
363              cout<<"直线"<<s<<"平移后起点的坐标为:"<<v1.transpose()<<endl;
364              cout<<"直线"<<s<<"平移后终点的坐标为:"<<v2.transpose()<<endl;    
365         } 
366     }
367     
368     for(int i=0;i<RN;i++) {
369         if(rect[i].getName()==s) {
370             find = true;
371             Vector2d v1 = rect[i].getPoint1();
372             Vector2d v2 = rect[i].getPoint2();
373             Vector2d v3 = rect[i].getPoint3();
374              v1 = v1+v;
375              v2 = v2+v; 
376              v3 = v3+v;
377              cout<<"三角形"<<s<<"点1平移后的坐标为:"<<v1.transpose()<<endl;
378              cout<<"三角形"<<s<<"点2平移后的坐标为:"<<v2.transpose()<<endl;
379              cout<<"三角形"<<s<<"点3平移后的坐标为:"<<v2.transpose()<<endl;    
380         } 
381     }
382     
383     if(find==false) {
384         cout<<"没有找到对应的点线面,请先添加点线面!"<<endl; 
385     }
386 }
387 
388 void rotate() {
389     string s;
390     string s1 = a[2];
391     s = a[1];
392     MatrixXd rot(2,2);
393     bool find = false;
394     double deg,avg;
395     deg = stringToNum<double>(s1);
396     avg = deg*PI/180;
397     rot(0,0)=cos(avg);
398     rot(0,1)=sin(avg);
399     rot(1,0)=-sin(avg);
400     rot(1,1)=cos(avg);
401    for(int i=0;i<PN;i++) {
402         if(point[i].getName()==s) {
403             find = true;
404             Vector2d v1 = point[i].getPoint();
405              v1=rot*v1;
406              cout<<""<<s<<"绕原点旋转后的坐标为:"<<v1.transpose()<<endl;    
407         } 
408     }
409 
410     for(int i=0;i<LN;i++) {
411         if(line[i].getName()==s) {
412             find = true;
413             Vector2d v1 = line[i].getStartPoint();
414             Vector2d v2 = line[i].getEndPoint();
415              v1 = rot*v1;
416              v2 = rot*v2; 
417              cout<<"直线"<<s<<"旋转后起点的坐标为:"<<v1.transpose()<<endl;
418              cout<<"直线"<<s<<"旋转后终点的坐标为:"<<v2.transpose()<<endl;    
419         } 
420     }    
421     
422         for(int i=0;i<RN;i++) {
423         if(rect[i].getName()==s) {
424             find = true;
425             Vector2d v1 = rect[i].getPoint1();
426             Vector2d v2 = rect[i].getPoint2();
427             Vector2d v3 = rect[i].getPoint3();
428              v1 = rot*v1;
429              v2 = rot*v2; 
430              v3 = rot*v3;
431              cout<<"三角形"<<s<<"点1旋转后的坐标为:"<<v1.transpose()<<endl;
432              cout<<"三角形"<<s<<"点2旋转后的坐标为:"<<v2.transpose()<<endl;
433              cout<<"三角形"<<s<<"点3旋转后的坐标为:"<<v2.transpose()<<endl;    
434         } 
435     }
436     
437     if(find==false) {
438         cout<<"没有找到对应的点线面,请先添加点线面!"<<endl;
439     } 
440 }

结果截图:

点线面的创建:

 

点线面的平移:

 

点线面的旋转:

 

输入错误的提示:

解题思路:

1、考虑到程序的可拓展性,所以选择建立了点、线、面类,然后用对象数组来保存点线面的对象(本来应该用容器更好,但是容器的知识不太会)。

2、首先应该将输入字符串拆分,以空格为界限,得到多个子数组用字符串数组保存。

3、保存的字符串要根据其类型进行转换,然后通过if语句判断进入对应的程序段即可

 

难点:

1、函数和类都应该先定义后使用,这一点和java不一样,所以一开始很不习惯。

2、模版函数

template <class Type>
Type stringToNum(const string& str)
{
istringstream iss(str);
Type num;
iss >> num;
return num;
}

用于字符串向各种基本类型的转换,很实用。

3、这份代码其实冗余度还比较高,需要完善。

 

  

posted @ 2015-11-30 20:30  颠颠De我  阅读(218)  评论(2编辑  收藏  举报