三角函数在图形学里的应用(二) 点绕原点旋转(方法2)、点绕任意点旋转


点绕原点旋转(方法2)


和上一篇《三角函数在图形学里的应用(1)》中的条件不同的是,现在我们不知道OP0和OP1有多长。还是要求p0绕着圆点绕到p1,求p1

图1已经把公式推导了出来。


image.png

(图1)

其中1式与2式的推导过程,上图可能有点没解释明白,这里勇哥详细推导一下:

x1=L*cos(a+b)
x1=L*(cos(a)cos(b)-sin(a)sin(b))
x1=L*((x0/L)*cos(b)-(y0/L)*sin(b))
x1=L*(x0cos(b)/L-y0sin(b)/L)
x1=x0cos(b)-y0sin(b)

y1=L*sin(a+b)
y1=L*(sin(a)cos(b)+cos(a)sin(b))
y1=L*((y0/L)cos(b)+(x0/L)sin(b))
y1=L(y0cos(b)/L+x0sin(b)/L)
y1=y0cos(b)+x0sin(b)

推导式子1和2和上篇讲的公式的区别是: 不用知道角a,和OP1的长度。

这样确实方便计算了许多。


image.png

(图2)

引用上一篇的CAD图,我们用新公式计算一下:


x1=x0cos(b)-y0sin(b)
y1=y0cos(b)+x0sin(b)


>> 表达式: 17.32*cos(20)-10*sin(20)
12.8552748
>> 表达式: 10*cos(20)+17.32*sin(20)
15.3207151

可以看到结果是正确的。



点绕任意点旋转


绕任意点旋转的公式是:

x0=cos(a)*(x-rx0)-sin(a)*(y-ry0)+rx0
y0=cos(a)*(y-ry0)+sin(a)*(x-rx0)+ry0

勇哥画了一张CAD图,下面来推导一下。

在上图中,点(x,y) 绕指定点(rx0,ry0)旋转a度后到(x0,y0), 求x0,y0?

image.png

(图3)

设L=角b的斜边=角a的斜边
cos(a+b)=(x0-rx0)/L
x0=L*cos(a+b)+rx0
x0=L*(cos(a)cos(b)-sin(a)sin(b))+rx0
因为 cos(b)=(x-rx0)/L
     sin(b)=(y-ry0)/L
x0=L*(cos(a)*((x-rx0)/L)-sin(a)((y-ry0)/L))+rx0
x0=cos(a)(x-rx0)-sin(a)(y-ry0)+rx0

sin(a+b)=(y0-ry0)/L
y0=L*sin(a+b)+ry0
y0=L*(sin(a)cos(b)+cos(a)sin(b))+ry0
因为 cos(b)=(x-rx0)/L
     sin(b)=(y-ry0)/L
y0=L*(sin(a)*((x-rx0)/L)+cos(a)*((y-ry0)/L))+ry0
y0=sin(a)(x-rx0)+cos(a)(y-ry0)+ry0
y0=cos(a)*(y-ry0)+sin(a)*(x-rx0)+ry0

我们来计算一下,看对不对。

注意,由于CAD的显示精度默认只有两位,所以参入乘法计算误差较大。

所以请相信结果是正确的。

命令: cal
>> 表达式: cos(20)*(22.27-5)-sin(20)*(15.08-5)+5
17.7809285
命令: cal
>> 表达式: cos(20)*(15.08-5)+sin(20)*(22.27-5)+5
20.3787895


其它绕指定点旋转的方法


(1)在勇哥的另一篇文章《二维点的旋转 续三(C#演示代码)》中使用的方法如下:

1. 首先将旋转点移动到原点处 
2. 执行如2所描述的绕原点的旋转 
3. 再将旋转点移回到原来的位置

image.png

(2)文章《二维点的旋转 续二(Matlab演示代码)》中使用的方法如下:

image.png


以上的两种方法都没有本主题的公式简单。





--------------------- 

作者:hackpig
来源:
www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864