已知 A 点、B 点的坐标,以 A 点为中心、AB 为半径,旋转 B 点任意角度,求旋转后 B 点的坐标。
哪位大佬能帮解决一下这个问题。
已知 A 点、B 点的坐标,以 A 点为中心、AB 为半径,旋转 B 点任意角度,求旋转后 B 点的坐标。
哪位大佬能帮解决一下这个问题。
这是图形学的常见算法。
已知点 A(x, y),绕指定点 C(x, y) 旋转弧度 a,则旋转后的点 B(x, y) 坐标为:
完整代码如下:
// 程序:求指定点旋转后的坐标
//
#include <graphics.h>
#include <conio.h>
#include <math.h>
const double PI = 3.1415926536;
// 将点 d 围绕点 center 旋转弧度 a,返回旋转后的坐标
POINT Rotate(POINT center, POINT d, double a)
{
a = -a; // 注意,屏幕坐标 y 轴向下,故旋转弧度取反
POINT r;
r.x = (d.x - center.x) * cos(a) - (d.y - center.y) * sin(a) + center.x;
r.y = (d.x - center.x) * sin(a) + (d.y - center.y) * cos(a) + center.y;
return r;
}
// 主函数
int main()
{
initgraph(640, 480);
// 定义点 A 和 B
POINT A, B;
A.x = 300; A.y = 200;
B.x = 400; B.y = 120;
line(A.x, A.y, B.x, B.y);
POINT b = Rotate(A, B, PI / 2);
setlinecolor(RED);
line(A.x, A.y, b.x, b.y);
_getch();
return 0;
}
公式 1:绕原点旋转
已知点 A(x, y),绕原点 O 旋转弧度 a,求旋转后的点 B(x, y) 坐标。设 OA 长度为 r,与 X 轴夹角为 θ,则:
通过三角函数展开得到:
写成矩阵形式:
公式 2:坐标平移
已知点 A(x, y),令 A 在 x 方向移动 m,在 y 方向移动 n,求移动后的点 B(x, y) 坐标:
写成矩阵形式:
公式 3:绕指定点旋转
已知点 A(x, y),绕指定点 C(x, y) 旋转弧度 a,求旋转后的点 B(x, y) 坐标。
求解过程:先将 A 点平移到原点,然后使 A 点绕原点旋转,旋转完毕后再将 A 点平移回来。可依据公式 1、2 的矩阵形式得:
可得最终公式:
我自己推导了一个公式,你可以再验证一下:
对于A(m, n), B(x, y), 旋转角为d:
旋转后B' ( (x-m)cos(d) - (y-n)sin(d) + m , (x-m)sin(d) - (y-n)cos(d) + n )
这个式子中d就表示那个旋转角,无关其单位,你只需要得到该单位下对应的三角函数值就行了