Как повернуть линию вокруг одной из ее вершин - PullRequest
0 голосов
/ 03 января 2019

Я делаю свой первый движок лучевого вещания и хотел бы повернуть линию на угол θ

Как это сделать?Можно ли показать мне какой-нибудь базовый код C ++ или псевдокод?

Это изображение описывает мою проблему: enter image description here


Необязательный вопрос

Я решилсделать все это в graphics.h, потому что это самый простой графический заголовок для C / C ++.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Вы хотите:

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;
0 голосов
/ 03 января 2019

Скалярное произведение двух векторов имеет следующее свойство:

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 с некоторым арифметическим автопилотом.

0 голосов
/ 03 января 2019

Один простой алгоритм:

  1. Переместите круг -P, чтобы P было в (0, 0).
  2. Повернуть A на угол, умножив его на матрицу вращения .
  3. Переместите круг P, чтобы восстановить исходное положение.

Все эти три шага могут быть выполнены с использованием одного умножения матрицы 3х3.

...