Как рассчитать (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, также образует равнобедренный.
Должно быть легко выяснить оттуда.