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

Posted on 2015-11-30 23:26  mememagic  阅读(145)  评论(1编辑  收藏  举报
#include <iostream>
#include <cstring>
#include <math.h>
#include <Eigen/Dense>
using Eigen::MatrixXd;
using namespace std;
class Point
{
    public:
    double x;
    double y;
    void Showpoint(void);
    void movexy(MatrixXd p);//平移算子
    void rotang(double ang);//旋转算子 
};
void Point::Showpoint(){
    cout<<'('<<x<<','<<y<<')';
}
void Point::movexy(MatrixXd p){
    cout<<x<<','<<y<<endl; 
    x+=p(0,0);y+=p(0,1);
    cout<<x<<','<<y<<endl; 
}
void Point::rotang(double deg){
    cout<<x<<','<<y<<endl; 
        MatrixXd rot(2,2);//旋转矩阵 
        rot(0,0)=cos(deg);
        rot(0,1)=sin(deg);
        rot(1,0)=-sin(deg);
        rot(1,1)=cos(deg);
        x=rot(0,0)*x+rot(0,1)*y;
        y=rot(1,0)*x+rot(1,1)*y;
        cout<<x<<','<<y<<endl; 
}
//点类定义完成
 
class Element
{
    public:
    char name[20];//名称 
    int n;
    Point pi[3];
    void Showelement(void);
};

void Element::Showelement(){
    cout<<name;
    int i;
    for(i=1;i<=n;i++)pi[i-1].Showpoint();
}
//元素类定义完成 

Element Move(Element e,MatrixXd p){
    int i;
    for(i=1;i<=e.n;i++)e.pi[i-1].movexy(p);
    return e;
}
//元素平移 
Element Rotate(Element e,double deg){
    int i;
    for(i=1;i<=e.n;i++)e.pi[i-1].rotang(deg);
    cout<<"旋转命令已执行"<<endl;
    return e;
}
//元素旋转 

MatrixXd Getpoint(char str[]){
    MatrixXd p(1,2);
    int u;
            int i,j;
            char a[10];
            for(i=0;i<=49&&str[i]!='(';i++);
            for(j=0;j<=49&&str[j]!=',';j++);
            for(u=0;u<=10&&i!=j-1;u++)
            {
                i++;
                a[u]=str[i];
            }
             
            p(0,0)=atof(a);
            for(i=j;i<=49&&str[i]!=')';i++);
            for(u=0;u<=10&&j!=i-1;u++)
            {
                j++;
                a[u]=str[j];
            }
            p(0,1)=atof(a);
            return p;
}
//从字符串获取点 

int main()
{
  MatrixXd p1(1,2),p2(1,2),p3(1,2),p4(1,2);
  //用于存放输入点以及位移向量 
  char str1[20],str2[20],str3[20],str4[20],str5[20],str6[20];
  double ang;
  Point P1,P2,P3,P4; 
  
  
  Element e1;
  cout<<"请输入元素(名称、点数、点坐标):";
  cin>> e1.name;
  cin>>e1.n;
  switch(e1.n){
      case 1:
          cin>>str1;p1=Getpoint(str1);e1.pi[0].x=p1(0,0), e1.pi[0].y=p1(0,1);
          break;
    case 2:
        cin>>str1;p1=Getpoint(str1);e1.pi[0].x=p1(0,0), e1.pi[0].y=p1(0,1);
        cin>>str2;p2=Getpoint(str2);e1.pi[1].x=p2(0,0), e1.pi[1].y=p2(0,1);
          break;
      case 3:
          cin>>str1;p1=Getpoint(str1);e1.pi[0].x=p1(0,0), e1.pi[0].y=p1(0,1);
          cin>>str2;p2=Getpoint(str2);e1.pi[1].x=p2(0,0), e1.pi[1].y=p2(0,1);
          cin>>str3;p3=Getpoint(str3);e1.pi[2].x=p3(0,0), e1.pi[2].y=p3(0,1);
          break;
      default:cout<<"输入错误";
  }
//根据点数获取内容并构造Element对象 


cout<<"请对当前输入元素输入操作命令:";
cin>>str4;cin>>str5;cin>>str6;
if(str4[0]=='m'&&str4[1]=='o'&&str4[2]=='v'&&str4[3]=='e'){
    cout<<"命令为move"<<endl;
    p4=Getpoint(str6);
    Element e2;e2=Move(e1,p4);
    e2.Showelement();
    cout<<endl;
}
if(str4[0]=='r'&&str4[1]=='o'&&str4[2]=='t'&&str4[3]=='a'&&str4[4]=='t'&&str4[5]=='e'&&str4[6]==0){
    ang=atof(str6)*3.1415926/180;
    cout<<"命令为rotate"<<endl;
    Element e2;e2=Rotate(e1,ang);
    e2.Showelement();
    cout<<endl;
}
  
 
  
}