点绕原点旋转(方法2)
和上一篇《三角函数在图形学里的应用(1)》中的条件不同的是,现在我们不知道OP0和OP1有多长。还是要求p0绕着圆点绕到p1,求p1。
图1已经把公式推导了出来。
(图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的长度。
这样确实方便计算了许多。
(图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?
(图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. 再将旋转点移回到原来的位置
(2)文章《二维点的旋转 续二(Matlab演示代码)》中使用的方法如下:
以上的两种方法都没有本主题的公式简单。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!