Как рассчитать (x,y) для фиксированной длины дуги от точки на окружности

Я потратил так много часов на это, что чувствую, как мое здравомыслие постепенно ослабевает Так что любая помощь будет действительно цениться. Я постараюсь быть кратким, насколько это возможно.

У меня есть круг на 2D плоскости. Я знаю декартовы координаты для его центральной точки (C) и радиуса (R).

Моя путаница проистекает из этой проблемы. Когда имеется точка на плоскости вне круга; Я могу вычислить точку (P) на окружности круга, ближайшей к этой точке.

Я хочу определить координаты (x,y) двух точек на окружности. Давайте назовем их P1 и P2. P1 и P2 - два конца дуги. Дуга имеет фиксированную длину (X). P - это промежуточная точка между P1 и P2. Таким образом, длина дуги от P до P1 и от P до P2 равна X/2.

Вкратце: дано C, R, P, X; Мне нужно рассчитать P1 и P2.

Я пытаюсь кодировать это в C++, но любые предложения или псевдокод будет здорово.

РЕДАКТИРОВАТЬ: X - длина дуги, а не прямая линия между P1 и P2

3 ответа

Решение

По кругу под углом theta соответствует длине дуги theta * Rэто означает, что ваша дуга будет составлять угол theta = X / R, Так что, если начать с вашей точки зрения

P = C + R * (sin(u), cos(u))

затем просто идти вверх / вниз theta/2:

P1 = C + R * (sin(u + theta/2), cos(u + theta/2))

а также

P2 = C + R * (sin(u - theta/2), cos(u - theta/2))

Дуга, которая составляет угол θ (в радианах), имеет длину дуги θR. Итак, вы хотите, чтобы половинный угол θ = X/(2R). Затем вам нужно взять вектор (P -C), повернуть его на углы ±θ и добавить обратно в C, чтобы получить P1 и P2. Чтобы повернуть вектор на угол, умножьте его на матрицу вращения.

Итак, в псевдокоде это будет выглядеть так:

θ = X/(2R)
A = 2x2 rotation matrix corresponding to a rotation by θ radians
A' = transpose of A
P1 = C + A * (P - C)
P2 = C - A' * (P - C)

Есть несколько вещей, которые могут помочь. Не буду писать код, но я думаю, что решение будет основано на треугольниках. Рассматривать:

Любой радиус имеет одинаковую длину.

Таким образом, треугольник, нарисованный из P1-P1-C, является равнобедренным.

Любая касательная перпендикулярна радиусу.

Мне было бы трудно доказать это прямо здесь и сейчас, но если вы продолжите линии от C до P1/P2, чтобы касательная, которая пересекает окружность в C->P, также образует равнобедренный.

Должно быть легко выяснить оттуда.

Другие вопросы по тегам