计算物体旋转以后所在的点
cos(α+β)=cosα·cosβ - sinα·sinβ
sin(α+β)=sinα·cosβ + cosα·sinβ
要理解公式,借助极坐标系转换会变得较为简单
已知:输入点x,y; 旋转中心 cx,xy,旋转角度a
求:输入点旋转之后的的x’,y’坐标
step1:在极坐标系下
x' = r* (x'/r)= r*cos(α)
y' = r* (y'/r)= r*sin(α)
step2:
x'= r*cos(β+(α-β))= r*cos(β+a)=r* cos β*cosa - r*sinβ*sina
=xcosa - y*sina
=(x-0)cosa - (y-0) sina + 0
y'
=r*sin(β+(α-β))=r*sin(β+a) = r*sinβ*cosa + r* cosβ *sina
=(y-0)*cosa + (x-0)*sina +0
如果是以(10,10)为旋转中心
/// <summary>
/// 计算物理旋转之后点xy的变化
/// </summary>
/// <param name="x0">图像物体上一点的x</param>
/// <param name="y0">图像物体上一点的y</param>
/// <param name="centerx">图像物体的中心x</param>
/// <param name="centery">图像物体的中心y</param>
/// <param name="angle"></param>
/// <returns></returns>
public Vector2 RotatePoint(float x0, float y0, float centerx, float centery, float angle)
{
// 将角度转换为弧度
angle = (float)(angle * Math.PI / 180);
// 计算旋转后的坐标
float x = (float)((x0 - centerx) * Math.Cos(angle) - (y0 - centery) * Math.Sin(angle) + centerx);
float y = (float)((x0 - centerx) * Math.Sin(angle) + (y0 - centery) * Math.Cos(angle) + centery);
// 返回旋转后的坐标
return new Vector2(x, y);
}
// 定义 Vector2 结构体用于返回坐标
public struct Vector2
{
public float X { get; }
public float Y { get; }
public Vector2(float x, float y)
{
X = x;
Y = y;
}
}
举出特例说明
以旋转中心(10,10),输入点x=13,y=14举例
分别旋转0度,和90度,45度,得到点。
度数为正,则为逆时针旋转
旋转0度,不变