二维图形旋转的实现
来源:互联网 发布:qq好友克隆软件下载 编辑:程序博客网 时间:2024/04/30 20:19
这里讲述的二维图形是指诸如三角形、多边形围绕某一中心点进行指定角度的旋转。二维图形其实是由一系列的离散点组成的,离散点放在特定的坐标系就是向量。因此二维图形的旋转的基础就是向量的旋转。
首先考虑一个向量 p = (x,y) , 那么它写成坐标的形式就是x+iy,这个就是P点在复平面的坐标.
问题: 假设现在有一个角度d,并且使向量p沿逆时针方向旋转d角度并且不改变其模的大小.请问旋转后 的向量p'是什么呢?
问题分析:
简单举例.....
对于一个向量p (1,0),使它向逆时针旋转90度,并且不改变其模的大小,我们会很清楚的画出,这个变化后的向量就是p' (0,1),我们把它们都恢复的一般形式,原向量(1,0) --- 1 + i * 0, 新向量(0,1) --- 0 + i * 1,我们不难发现把原来的向量p的一般形式乘以一个i,然后整理就会得到新的向量p'的坐标一般形式....进一步想象,i是什么呢? i = cos(90) + i*sin(90);那也就是说可以得出这样一个结论:
对于一个向量p : x + i * y 来说,如果向逆时针旋转d角度的话,新的向量p'应该是向量p的一般表达式(x+i*y)乘以cos(d)+i*sin(d) ,然后整理得出一个结果,将i的系数看成p'的复数部分,将其他部分看成p'的整数部分,由于又要保证它的大小不改变,所以我们只要保证乘的向量的模大小要为1,恰巧cos(d)+i*sin(d)全部满足.
所以说对于p = (x,y)这个向量向逆时针旋转且大小不改变所得到的向量如下:
p: (x,y) --------> p': ( x*cos(d)-y*sin(d) , x*sin(d)+y*cos(d) )
如果是向顺时针旋转则:
p: (x,y) --------> p': ( x*cos(-d)-y*sin(-d) , x*sin(-d)+y*cos(-d) )
现在我们明白了向量旋转的原理,你可以看到上面的向量旋转是围绕原点(0,0)进行得,我们现在要实现的是围绕某一中心点进行旋转,该怎么做呢?很简单,就是将要旋转的点平移到以中心点位原点的坐标系,旋转完成之后再平移回来(为了方便绘制)。
明白了原理,于是编程实现。下面是主要实现代码:
- C/C++ code
- double const PI = 3.1415926;/*! @struct * @brief 二维点结构体** */struct stPoint{ stPoint(CPoint &point) { m_CoorX = static_cast<double>(point.x); m_CoorY = static_cast<double>(point.y); } stPoint(double x,double y) { m_CoorX = x; m_CoorY = y; } /*! * @brief 执行和MFC的CPoint类的转换 * * /return 转换后的点 */ operator CPoint const () { return CPoint(static_cast<long>(m_CoorX),static_cast<long>(m_CoorY)); } stPoint operator - (stPoint &OtherPt) { return stPoint(m_CoorX-OtherPt.m_CoorX,m_CoorY-OtherPt.m_CoorY); } stPoint operator + (stPoint &OtherPt) { return stPoint(m_CoorX+OtherPt.m_CoorX,m_CoorY+OtherPt.m_CoorY); } double m_CoorX; double m_CoorY;};/*!* @brief 计算x*sin(d)+y*cos(d)** @param [in]Left 左点* @param [in]Right 右点* /return 计算结果*/double VectorMulti(stPoint &Left,stPoint &Right){ return (Left.m_CoorX*Right.m_CoorY+Left.m_CoorY*Right.m_CoorX);}/*!* @brief 计算x*cos(d)-y*sin(d)** @param [in]Left 左点* @param [in]Right 右点* /return 计算结果*/double CrossProduct(stPoint &Left,stPoint &Right){ return (Left.m_CoorX*Right.m_CoorX-Left.m_CoorY*Right.m_CoorY);}/*!* @brief 计算( x*cos(d)-y*sin(d) , x*sin(d)+y*cos(d) )** @param [in]point 待旋转的点* @param [in]Right 转换点* /return 旋转后的点*/stPoint PointMulti(stPoint &point,stPoint &TranPt){ return stPoint(CrossProduct(point,TranPt),VectorMulti(point,TranPt));}/*!* @brief 对二维图形的单个点进行变换** @param [in][out]point 待旋转的点* @param [in]nAngle 旋转角度* @param [in]RotateCenter 旋转中心点* /return */void PointRotate(stPoint &point,int nAngle,stPoint &RotateCenter){ // 平移到以中心点位原点的坐标系 point = point - RotateCenter; // 角度转弧度 double radian = static_cast<double>(nAngle)/180.0*PI; stPoint RotatePt(cos(radian),sin(radian)); point = PointMulti(point,RotatePt); // 平移回来 point = point + RotateCenter;}
效果图:
旋转前:
旋转后:
相关源码下载:
二维图形旋转实现的相关代码
参考文献:
1. 神奇的向量旋转
- 二维图形旋转的实现
- 二维图形旋转的实现
- 二维图形旋转的实现
- 如何编程实现二维图形的旋转
- 二维图形旋转公式的推导
- 二维图形旋转公式的推导
- VS2008集成QT的OpenGL开发(实现二维图形的旋转)
- opencv实现图形旋转
- perl-opengl基本图形操作-缩放,二维旋转,二维平移
- Qt的二维图形
- 利用Turbo C进行平面二维图形的平移,旋转,缩放,对称
- 关于二维数组的翻转与旋转 低端实现
- [C语言]二维图形基本几何变换的实现
- 计算机图形学Opengl实现二维图形的…
- 计算机图形学Opengl实现二维图形的…
- ANDROID实现圆形图形不断旋转的动画
- matlab二维图形的绘制
- 二维图形的几何变换
- struts2-json-plugin 使用
- DIV可编辑
- 算法的力量(李开复) 回味一下
- 不用debug就被鄙视。。。
- 学习笔记之----在Qt下的串口读写
- 二维图形旋转的实现
- 设计模式目录
- Eclipse 快捷键
- back on line
- 拒绝了对对象 ’sp_sdidebug’(数据库 ‘master’,所有者 ‘dbo’)的 EXECUTE 权限
- 操作系统的政治哲学
- 海明校验码原理(详解)
- 工作总结之PHP连接Microsoft SQL Server 2000/2005/2008
- 风雨20年:我所积累的20条编程经验