如何围绕一条顶点旋转一条线

时间:2019-01-03 10:40:18

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

我正在制造我的第一个光线投射引擎,并且希望将线旋转角度θ

这是怎么做到的?有可能给我看一些基本的C ++代码或一些伪代码吗?

此图描述了我的问题: enter image description here


可选问题

我决定在graphics.h中进行所有操作,因为它是C / C ++最简单的图形头。

3 个答案:

答案 0 :(得分:4)

您要

B = P + M * (A - P)

其中M是2D旋转矩阵:

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;

答案 1 :(得分:2)

一种简单的算法:

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

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

答案 2 :(得分:2)

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

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