1、首先推导绕原点旋转
假设 v点的坐标是(x, y) ,那么可以推导得到 v’点的坐标(x’, y’)(设原点到v的距离是r
v’(x’, y’)
x′=r*cos(θ+?)
y′=r*sin(θ+?)
通过三角函数展开得到
x′=r*cosθcos??r*sinθsin?
y′=r*sinθcos?+r*cosθsin?
有因为
v(x,y)
x=r*cos?;
y=r*sin?;
带入
x′=r*cosθcos??r*sinθsin?
y′=r*sinθcos?+r*cosθsin?
所以旋转θ后的坐标如下
x′=x*cosθ?y*sinθ
y′=x*sinθ+y*cosθ
写成矩阵的形式如下
2、首先推导不在原点旋转
点V(x,y)绕点O(x0,y0)得到新的点V’(x',y');
V和V‘原点平移了(x0,y0)?
得到的新坐标
V(x-x0,y-y0)
V'(x'-x0,y'-y0)
没有平移之前
x′=x*cosθ?y*sinθ
y′=x*sinθ+y*cosθ
平移(x0,y0)?
x′-x0=(x-x0)*cosθ?(y-y0)*sinθ
y′-y0=(x-x0)*sinθ+(y-y0)*cosθ
得到
x'=(x-x0)*cosθ?(y-y0)*sinθ+x0;
y'=(x-x0)*sinθ+(y-y0)*cosθ+y0;
成下面矩阵的形式
实现代码:
struct point
{
double x;
double y;
};
point AfterPoint(point A,point B,double phi)
{
//任意点A(x1,y1),绕一个坐标点B(x2,y2)逆时针旋转θ角度后,新的坐标设为C(x, y)
//x= (x1 - x2)*cos(θ) - (y1 - y2)*sin(θ) + x2 ;
//y= (x1 - x2)*sin(θ) + (y1 - y2)*cos(θ) + y2 ;
//旋转的phi弧度
point C;
C.x = (A.x - B.x)*std::cos(phi) - (A.y - B.y)*std::sin(phi) + B.x;
C.y = (A.x - B.x)*std::sin(phi) + (A.y - B.y)*std::cos(phi) + B.y;
return C;
}