//  https://github.com/orocos/orocos_kinematics_dynamics/blob/master/orocos_kdl/src/frames.hpp
//  Vector2 defination

#include <iostream>
#include <cstring>
#include<string>
#include <math.h>
#include <vector>
#include <frames.hpp>
using namespace std;
using namespace KDL;
#define PI 3.1415926

class Point    //二维点class 
{
    public:
    Vector2 point;//二维点 
    string name; 
    Point(Vector2 v,string s){point=v;name=s;}; 
    Point(Vector2 v){point=v;}; 
    Point(double x,double y){point=Vector2(x,y);}
    Point(){};
    void move_p(double x,double y);//平移算子
    void rota_p(double an);//旋转算子 
};
void Point::move_p(double x,double y){point+=Vector2(x,y);}
void Point::rota_p(double an){
    Rotation2 rot(-an/180*PI);
    point=rot.Inverse(point);
} //class defination finished;   

ostream&
operator << (ostream& os, const Point& X)
{
  return os << '(' << X.point.x()<< ',' << X.point.y()<< ')';
}
//重载运算符           

class Shape   //由点构成的二维图形class 
{
    public:
    string name;//名称 
    int n;        //顶点数 
    vector<Point> points;//顶点容器 
    Shape(string s){name=s;}
    Shape(){}
    void getpoint(Point p){points.push_back(p);}
    void move_s(double x,double y){for(int i=0;i<points.size();i++)points[i].move_p(x,y);}
    void rota_s(double an){for(int j=0;j<points.size();j++)points[j].rota_p(an);}
};

int main(){
    Point p(3,2),p1(2,3),p2(4,5);
     Shape s1("mine");
     s1.getpoint(p);
     s1.getpoint(p1);
     s1.getpoint(p2);
     
     
     cout<<"图形"<<s1.name<<"里面有"<<s1.points.size()<<"个点"<<endl;
     vector<Shape> volume(0);//图形容器 
     volume.push_back(s1);
     
     cout<<"当前有"<<volume.size()<<"个图形"<<endl;
     s1.move_s(1,2);
     for(int i=0;i<s1.points.size();i++)cout<<s1.points[i]<<endl;
      

    return 0;
}