如何围绕它的一个顶点旋转一条线

How to rotate a line around one of its vertexes

我正在制作我的第一个光线投射引擎,我想将一条线旋转一个角度 θ

如何做到这一点?是否可以向我展示一些基本的 C++ 代码或一些伪代码?

这张图片描述了我的问题:


选答题

我决定在 graphics.h 中制作所有这些,因为它是 C/C++ 的最简单的图形 header。

一个简单的算法:

  1. 移动圆 -P,使 P 位于 (0, 0)。
  2. 通过将 A 乘以 rotation matrix 的角度旋转 A
  3. 移动圆圈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_by_b