您的位置:首页 > 其它

第一次作业

2015-11-30 23:24 281 查看


#include<iostream>
#include<string>
#include<Eigen/Dense>
#include"math.h"
#include<stdlib.h>

#definepi3.141592653589793

usingnamespacestd;
usingnamespaceEigen;

intDimension=2;

MatrixXd&getCoordinate(MatrixXd&,string&coordinate);//将输入坐标值的字符串转换为数值
MatrixXd&RotationMatrix(MatrixXd&,string&);//根据输入的旋转角度求得旋转矩阵
MatrixXd&Move(MatrixXd&,MatrixXd&);//平移之后得到平移坐标矩阵
MatrixXd&Rotate(MatrixXd&,MatrixXd&,string&,string&);//旋转结果
MatrixXd&LineMirror(MatrixXd&,Vector3d&);

intmain()
{
intNumberOfPoints;
stringGraphicName;
stringCoordinate;

cout<<"输入图形名字,图形点数,点的坐标:"<<endl;
cin>>GraphicName>>NumberOfPoints>>Coordinate;

MatrixXdPointMatrix(Dimension,NumberOfPoints);//定义点的矩阵
PointMatrix=getCoordinate(PointMatrix,Coordinate);
MatrixXdstore=PointMatrix;

cout<<"初始坐标值"<<endl<<PointMatrix<<endl;

stringCommand;
stringGraphicNameC;
stringRotPoint;//旋转中心
stringCommandCoordinate;//旋转点坐标

cout<<"请输入指令,如movel1(3,6),rotate-30(0,0):"<<endl;
cin>>Command>>GraphicNameC>>CommandCoordinate>>RotPoint;

if(Command=="move")
{
MatrixXdMoveMatrix(Dimension,1);//定义移动矩阵
//intNum=1;
MoveMatrix=getCoordinate(MoveMatrix,CommandCoordinate);
PointMatrix=Move(PointMatrix,MoveMatrix);

}
if(Command=="rotate")
{
MatrixXdRotation(Dimension,Dimension);//旋转矩阵
PointMatrix=Rotate(PointMatrix,Rotation,CommandCoordinate,RotPoint);
}

cout<<"Thetransferresultis:"<<endl<<PointMatrix<<endl;

doublea,b,c;
cout<<"请输入直线的参数a,b,c,ax+by+c=0:"<<endl;
cin>>a>>b>>c;
Vector3dLCo(a,b,c);
MatrixXdMirrorResult;
MirrorResult=LineMirror(store,LCo);
cout<<"关于直线镜像的结果:"<<endl<<MirrorResult<<endl;
system("pause");
}

MatrixXd&getCoordinate(MatrixXd&pointMatrix,string&coordinate)
{
//提取输入的坐标值
stringtempt;//temp用来存储字符串里面的数字量
intcount=0;
//MatrixXdpointMatrix(Dimen,pointNumber);
for(inti=0;i<coordinate.length();i++)
{
if((coordinate[i]>='0'&&coordinate[i]<='9')||
coordinate[i]==','||coordinate[i]==')'||coordinate[i]=='.')
{
if(coordinate[i]==','||coordinate[i]==')')
{
count=count+1;
intk=count/2;
intm=count%2-1;
if(m==0)
doublej=pointMatrix(0,k)=atof(tempt.c_str());
if(m==-1)
{
doublen=0;
n=pointMatrix(1,k-1)=atof(tempt.c_str());
inti=0;
}
tempt.clear();
continue;
}
tempt=tempt+coordinate[i];
}
}
returnpointMatrix;
}

//根据输入的转换角度求出转换矩阵
MatrixXd&RotationMatrix(MatrixXd&Rotation,string&arc)
{
doubleangle=atof(arc.c_str());

doubles1,c1;
s1=sin(angle*pi/180);
c1=cos(angle*pi/180);

if(abs(s1)<0.000000000000001)
s1=0.0;
if(abs(c1)<0.000000000000001)
c1=0;

Rotation(0,0)=c1;
Rotation(0,1)=s1;
Rotation(1,0)=-s1;
Rotation(1,1)=c1;

returnRotation;
}

//求移动后的点坐标
MatrixXd&Move(MatrixXd&point,MatrixXd&moveMatrix)
{
intNum=point.cols();

for(inti=0;i<Num;i++)
{
point(0,i)=point(0,i)+moveMatrix(0,0);
point(1,i)=point(1,i)+moveMatrix(1,0);
}

returnpoint;
}

//求旋转后的点坐标
MatrixXd&Rotate(MatrixXd&Poi,MatrixXd&Rot,string&command,string&RPoint)
{
MatrixXdrotPoint;//存储输入旋转中心
MatrixXdtemp(Dimension,Dimension);

rotPoint=getCoordinate(temp,RPoint);//旋转中心坐标
rotPoint=(-1)*rotPoint;
Poi=Move(Poi,rotPoint);//旋转中心移动到原点
Rot=RotationMatrix(Rot,command);
Poi=Rot*Poi;//关于原点对称
rotPoint=(-1)*rotPoint;
Poi=Move(Poi,rotPoint);//将旋转中心移回原始位置

returnPoi;
}

//求镜像后的坐标值
MatrixXd&LineMirror(MatrixXd&point,Vector3d&Co)
{
intNum=point.cols();
doublea=Co(0);
if(Co(0)==0)
{
doubley=-Co(2)/Co(1);
for(inti=0;i<Num;i++)
point(1,i)=2*y-point(1,i);
}
if(Co(1)==0)
{
doublex=-Co(2)/Co(0);
for(inti=0;i<Num;i++)
point(0,i)=2*x-point(0,i);
}
if(Co(0)!=0&&Co(1)!=0)
{

for(inti=0;i<Num;i++)
{
doubleL=(Co(0)*point(0,i)+Co(1)*point(1,i)+Co(2));
doubleD=(Co(0)*Co(0)+Co(1)*Co(1));
if(Co(0)*point(0,i)+Co(1)*point(1,i)+Co(2)==0)
continue;
point(0,i)=point(0,i)-2*Co(0)*L/D;
point(1,i)=point(1,i)-2*Co(1)*L/D;
}
}
returnpoint;
}






//执行结果



该程序目前为止只实现了平面上任意点数对任意旋转中心的旋转和平移和对于一条任意直线的镜像,三维的旋转还在努力中。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: