【问题标题】:How to rotate a line around one of its vertexes如何围绕其中一个顶点旋转一条线
【发布时间】:2026-02-11 16:10:02
【问题描述】:

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

如何做到这一点?可以给我看一些基本的 C++ 代码或一些伪代码吗?

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


可选问题

我决定在graphics.h 中完成所有这些,因为它是 C/C++ 最简单的图形标题。

【问题讨论】:

  • 也有兴趣,因为叉积仅适用于 3 个维度
  • 链接失效,图片无法显示。
  • 它对我有用:/
  • 如果你在做线性代数,选择一个线性代数库并使用适当类型的值来表达它。然后你可以编写看起来像数学B = P + M * (A - P);的代码可以是有效的C++
  • 这个网站可以帮到你:geomalgorithms.com

标签: c++ algorithm geometry raycasting cartesian-coordinates


【解决方案1】:

你想要:

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;

【讨论】:

    【解决方案2】:

    一个简单的算法:

    1. 移动圆圈-P,使P 位于(0, 0)。
    2. A 乘以rotation matrix 将其旋转角度。
    3. 移动圆圈P 以恢复其原始位置。

    所有这三个步骤都可以使用一个 3x3 矩阵乘法来完成。

    【讨论】:

      【解决方案3】:

      两个向量的标量积具有以下性质:

      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

      【讨论】: