第一次作业
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; }
//执行结果
该程序目前为止只实现了平面上任意点数对任意旋转中心的旋转和平移和对于一条任意直线的镜像,三维的旋转还在努力中。。。。
相关文章推荐
- jquery-easyui简单使用
- 并查集的路径压缩
- ASCII码
- typedef使用注意
- 安卓开发学习笔记(一)
- Redis 缓存 + Spring 的集成示例
- java nio多线程引起的full gc问题
- 快速排序
- Ag(The Silver Searcher)相关
- Oracle BBED模拟坏块&验证坏块
- oracle递归遍历查询
- 数组
- HDU1160 FatMouse's Speed LIS变种+路径
- zoj 3612 (multiset)
- 小白详细讲解快速幂--杭电oj2035-A^B
- 找重复数
- powerdesign使用心得
- powerdesign使用心得
- 冒泡排序
- CSS3阴影 box-shadow的使用和技巧总结