二维图形旋转的实现

偶然间看到的,还没有做实验,可能在公司以后会用到 ,出处http://blog.sina.com.cn/s/blog_60ffc4670100mrpp.html

这里讲述的二维图形是指诸如三角形、多边形围绕某一中心点进行指定角度的旋转。二维图形其实是由一系列的离散点组成的,离散点放在特定的坐标系就是向量。因此二维图形的旋转的基础就是向量的旋转。

首先考虑一个向量 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 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;
}


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;
};


double VectorMulti(stPoint & Left,stPoint & Right)
{
return (Left.m_CoorX * Right.m_CoorY + Left.m_CoorY * Right.m_CoorX);
}


double CrossProduct(stPoint & Left,stPoint & Right)
{
return (Left.m_CoorX * Right.m_CoorX - Left.m_CoorY * Right.m_CoorY);
}


stPoint PointMulti(stPoint
& point,stPoint & TranPt)
{
return stPoint(CrossProduct(point,TranPt),VectorMulti(point,TranPt));
}


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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值