Нужно нарисовать ">" фигуру в начале линии - PullRequest
0 голосов
/ 17 апреля 2020

Lines in 2d Plane

У меня линия, нарисованная красным цветом (в основном, у меня есть координаты (x1, y1) и (x2, y2)). Теперь я должен нарисовать две линии, которые зеленого цвета пересекаются в начальной точке линии (x1, y1)

Красная линия может быть под любым углом, поэтому мне нужна помощь здесь. Как мне математически получить координаты для двух зеленых линий. т.е. у меня уже есть (x1, y1), поэтому мне нужно (x3, y3) и (x4, y4)

Угол между зелеными линиями должен составлять от 85 до 90 градусов, а длина каждой зеленой линии не должна превышает 10 пикселей (фиксированный размер)

У меня есть API для рисования линии, которая ожидает координаты, поэтому мне нужен код для вычисления координат для зеленой линии в C ++ / C ++ 11.

1 Ответ

1 голос
/ 17 апреля 2020

Первый шаг: вычислите «вектор» длиной 10 в направлении красной линии:

v = 10 * (x1-x2, y1-y2) / length of (x1-x2, y1-y2)

Длина вектора исходит от Пифагора: длина (X, Y) равна sqrt(X*X+Y*Y). Для этого есть стандартная функция математической библиотеки: std :: hypot.

Этот вектор должен указывать на ту же сторону, где вы хотите зеленые линии.

Второй шаг - вращение этого вектора. v под углом 45 градусов в обе стороны, давая вам векторы, представляющие две зеленые линии. Общая формулировка вращения даст вам следующее:

green1 = (v.x cos(45) - v.y sin(45), v.x sin(45) + v.y cos(45))
green2 = (v.x cos(45) + v.y sin(45), -v.x sin(45) + v.y cos(45))

Благодаря особому углу 45 градусов это значительно упростит: косинус и синус имеют одинаковое значение cos(45) = sin(45) = sqrt(1/2).

Если у вас есть эти два вектора, вам просто нужно добавить их в (x1, y1).

Собрать все вместе:

length_of_red = std::hypot(x1 - x2, y1 - y2);
sqrt_half = std::sqrt(.5);

x = 10*(x1 - x2) / length_of_red;
y = 10*(y1 - y2) / length_of_red;
x3 = x1 + sqrt_half*(x - y);
y3 = y1 + sqrt_half*(x + y);
x4 = x1 + sqrt_half*(x + y);
y4 = y1 + sqrt_half*(-x + y);
...