【C/C++】坐标旋转算法

1、围绕原点的旋转
在直角坐标中,有p(x, y),直线op长度为r,直线op和x轴正向夹角为a。直线op围绕原点做逆时针方向b度的旋转,到达p’ (s,t),如下图。

s = r cos(a + b) = r cos(a)cos(b) – r sin(a)sin(b)   (1.1)
t = r sin(a + b) = r sin(a)cos(b) + r cos(a)sin(b)   (1.2)

其中 x = r cos(a) , y = r sin(a)
代入(1.1), (1.2) ,

s = x cos(b) – y sin(b)    (1.3)
t = x sin(b) + y cos(b)    (1.4)

 

用行列式表达如下:

代码如下

#include <MATH.H>
 
void vRotationTransform(double dX, double dY, double dAngle, double &dbNewX, double &dbNewY)
{
    dbNewX = dX * cos(dAngle) - dY * sin(dAngle);
    dbNewY = dX * sin(dAngle) + dY * cos(dAngle);
} 

 

2、坐标系的旋转
在原坐标系xoy中,  绕原点沿逆时针方向旋转θ度,变成座标系 sot。
设有某点p,在原坐标系中的坐标为 (x, y), 旋转后的新坐标为(s, t)。

oa = y sin(θ)   (2.1)
as = x cos(θ)   (2.2)

综合(2.1),(2.2) 2式

s =  os = oa + as = x cos(θ) + y sin(θ)
t =  ot = ay – by = y cos(θ) – x sin(θ)

用行列式表达如下:

看不懂的话,换个图。 而您一旦用以下这图解方法,随时眼见显然,再也不会搞错。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值