如何围绕它的一个顶点旋转一条线
How to rotate a line around one of its vertexes
我正在制作我的第一个光线投射引擎,我想将一条线旋转一个角度 θ
如何做到这一点?是否可以向我展示一些基本的 C++ 代码或一些伪代码?
这张图片描述了我的问题:
选答题
我决定在 graphics.h
中制作所有这些,因为它是 C/C++ 的最简单的图形 header。
一个简单的算法:
- 移动圆
-P
,使 P
位于 (0, 0)。
- 通过将
A
乘以 rotation matrix 的角度旋转 A
。
- 移动圆圈
P
恢复原位。
所有这三个步骤都可以使用一个 3x3 矩阵乘法来完成。
你想要:
B = P + M * (A - P)
其中M
是二维旋转矩阵:
M = | cos(ϴ) -sin(ϴ) |
| sin(ϴ) cos(ϴ) |
在C++中可以写成:
float c = cos(theta), s = sin(theta);
float dx = ax - px, dy = ay - py;
float bx = px + c * dx - s * dy;
float by = py + s * dx + c * dy;
两个向量的标量积有如下属性:
vec(PA) . vec(PB) = rho cos theta
采用我们两个向量的定义:
vec(PA) = (x_a-x_p, y_a-y_p)
vec(PB) = (x_b-x_p, y_b-y_p)
我们可以得到:
(x_a-x_p)(x_b-x_p) + (y_a-y_p)(y_b-y_p) = rho cos theta (1)
因为PA=PB,我们还有:
(x_a-x_p)^2 + (y_a-y_p)^2 = (x_b-x_p)^2 + (y_b-y_p)^2 (2)
从 (1)
和 (2)
你可以用一些算术自动驾驶仪推导出 x_b
和 y_b
。
我正在制作我的第一个光线投射引擎,我想将一条线旋转一个角度 θ
如何做到这一点?是否可以向我展示一些基本的 C++ 代码或一些伪代码?
这张图片描述了我的问题:
选答题
我决定在 graphics.h
中制作所有这些,因为它是 C/C++ 的最简单的图形 header。
一个简单的算法:
- 移动圆
-P
,使P
位于 (0, 0)。 - 通过将
A
乘以 rotation matrix 的角度旋转A
。 - 移动圆圈
P
恢复原位。
所有这三个步骤都可以使用一个 3x3 矩阵乘法来完成。
你想要:
B = P + M * (A - P)
其中M
是二维旋转矩阵:
M = | cos(ϴ) -sin(ϴ) |
| sin(ϴ) cos(ϴ) |
在C++中可以写成:
float c = cos(theta), s = sin(theta);
float dx = ax - px, dy = ay - py;
float bx = px + c * dx - s * dy;
float by = py + s * dx + c * dy;
两个向量的标量积有如下属性:
vec(PA) . vec(PB) = rho cos theta
采用我们两个向量的定义:
vec(PA) = (x_a-x_p, y_a-y_p)
vec(PB) = (x_b-x_p, y_b-y_p)
我们可以得到:
(x_a-x_p)(x_b-x_p) + (y_a-y_p)(y_b-y_p) = rho cos theta (1)
因为PA=PB,我们还有:
(x_a-x_p)^2 + (y_a-y_p)^2 = (x_b-x_p)^2 + (y_b-y_p)^2 (2)
从 (1)
和 (2)
你可以用一些算术自动驾驶仪推导出 x_b
和 y_b
。